From e6f8a425da3fdcd512dfc19d2252e99abac555f4 Mon Sep 17 00:00:00 2001 From: Glenn Kasten Date: Tue, 13 Dec 2011 11:47:54 -0800 Subject: Fix locking for mMasterVolume and mMute mMasterVolume and mMute are both protected by mutex in AudioFlinger class, but there were two places where they were accessed without a mutex. Also make AudioFlinger::mMasterMute private not protected. Change-Id: Ia3897daeb5c50313df5bcc071824357526237f3e --- services/audioflinger/AudioFlinger.cpp | 12 ++++++++---- services/audioflinger/AudioFlinger.h | 7 +++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index 9fb666e26614..d2674978154d 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -646,12 +646,14 @@ status_t AudioFlinger::setMasterMute(bool muted) float AudioFlinger::masterVolume() const { - return mMasterVolume; + Mutex::Autolock _l(mLock); + return masterVolume_l(); } bool AudioFlinger::masterMute() const { - return mMasterMute; + Mutex::Autolock _l(mLock); + return masterMute_l(); } status_t AudioFlinger::setStreamVolume(int stream, float value, int output) @@ -1379,8 +1381,10 @@ AudioFlinger::PlaybackThread::PlaybackThread(const sp& audioFlinge readOutputParameters(); - mMasterVolume = mAudioFlinger->masterVolume(); - mMasterMute = mAudioFlinger->masterMute(); + // Assumes constructor is called by AudioFlinger with it's mLock held, + // but it would be safer to explicitly pass these as parameters + mMasterVolume = mAudioFlinger->masterVolume_l(); + mMasterMute = mAudioFlinger->masterMute_l(); for (int stream = 0; stream < AUDIO_STREAM_CNT; stream++) { mStreamTypes[stream].volume = mAudioFlinger->streamVolumeInternal(stream); diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h index f99e7647e50c..d22de26ece3e 100644 --- a/services/audioflinger/AudioFlinger.h +++ b/services/audioflinger/AudioFlinger.h @@ -765,7 +765,9 @@ private: int16_t* mMixBuffer; int mSuspended; int mBytesWritten; + private: bool mMasterMute; + protected: SortedVector< wp > mActiveTracks; virtual int getTrackName_l() = 0; @@ -1388,6 +1390,8 @@ mutable Mutex mLock; // mutex for process, commands and handl DefaultKeyedVector< int, sp > mPlaybackThreads; PlaybackThread::stream_type_t mStreamTypes[AUDIO_STREAM_CNT]; + + // both are protected by mLock float mMasterVolume; bool mMasterMute; @@ -1399,6 +1403,9 @@ mutable Mutex mLock; // mutex for process, commands and handl bool mBtNrecIsOff; Vector mAudioSessionRefs; + + float masterVolume_l() const { return mMasterVolume; } + bool masterMute_l() const { return mMasterMute; } }; -- cgit v1.2.3-59-g8ed1b