diff options
| author | Eric Laurent <elaurent@google.com> | 2009-07-09 03:20:57 -0700 |
|---|---|---|
| committer | Eric Laurent <elaurent@google.com> | 2009-07-09 03:20:57 -0700 |
| commit | 4e646338cf1e6f0d31ad0c0a987e32f5c59b4643 (patch) | |
| tree | 6b9cf2f347a35de81564a8b27dccb24e519c5aac | |
| parent | c52d55c5404a09a3845a322f50577fc4c125a86d (diff) | |
| download | frameworks_base-4e646338cf1e6f0d31ad0c0a987e32f5c59b4643.zip frameworks_base-4e646338cf1e6f0d31ad0c0a987e32f5c59b4643.tar.gz frameworks_base-4e646338cf1e6f0d31ad0c0a987e32f5c59b4643.tar.bz2 | |
Fix issue 1970108: crash in AudioFlinger::isMusicActive()
Protected calls to MixerThread::isMusicActive() by AudioFlinger::mLock
| -rw-r--r-- | libs/audioflinger/AudioFlinger.cpp | 13 | ||||
| -rw-r--r-- | libs/audioflinger/AudioFlinger.h | 2 |
2 files changed, 10 insertions, 5 deletions
diff --git a/libs/audioflinger/AudioFlinger.cpp b/libs/audioflinger/AudioFlinger.cpp index 8a19fbd..f5bdeda 100644 --- a/libs/audioflinger/AudioFlinger.cpp +++ b/libs/audioflinger/AudioFlinger.cpp @@ -738,12 +738,13 @@ bool AudioFlinger::streamMute(int stream) const bool AudioFlinger::isMusicActive() const { + Mutex::Autolock _l(mLock); #ifdef WITH_A2DP if (isA2dpEnabled()) { - return mA2dpMixerThread->isMusicActive(); + return mA2dpMixerThread->isMusicActive_l(); } #endif - return mHardwareMixerThread->isMusicActive(); + return mHardwareMixerThread->isMusicActive_l(); } status_t AudioFlinger::setParameter(const char* key, const char* value) @@ -1444,7 +1445,8 @@ bool AudioFlinger::MixerThread::streamMute(int stream) const return mStreamTypes[stream].mute; } -bool AudioFlinger::MixerThread::isMusicActive() const +// isMusicActive_l() must be called with AudioFlinger::mLock held +bool AudioFlinger::MixerThread::isMusicActive_l() const { size_t count = mActiveTracks.size(); for (size_t i = 0 ; i < count ; ++i) { @@ -2030,7 +2032,10 @@ void AudioFlinger::MixerThread::OutputTrack::write(int16_t* data, uint32_t frame inBuffer.i16 = data; if (mCblk->user == 0) { - if (mOutputMixerThread->isMusicActive()) { + mOutputMixerThread->mAudioFlinger->mLock.lock(); + bool isMusicActive = mOutputMixerThread->isMusicActive_l(); + mOutputMixerThread->mAudioFlinger->mLock.unlock(); + if (isMusicActive) { mCblk->forceReady = 1; LOGV("OutputTrack::start() force ready"); } else if (mCblk->frameCount > frames){ diff --git a/libs/audioflinger/AudioFlinger.h b/libs/audioflinger/AudioFlinger.h index 8e47b29..634934e 100644 --- a/libs/audioflinger/AudioFlinger.h +++ b/libs/audioflinger/AudioFlinger.h @@ -463,7 +463,7 @@ private: virtual float streamVolume(int stream) const; virtual bool streamMute(int stream) const; - bool isMusicActive() const; + bool isMusicActive_l() const; sp<Track> createTrack_l( |
