Fix issue 1970108: crash in AudioFlinger::isMusicActive()
Protected calls to MixerThread::isMusicActive() by AudioFlinger::mLock
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::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 @@
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 @@
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 @@
virtual float streamVolume(int stream) const;
virtual bool streamMute(int stream) const;
- bool isMusicActive() const;
+ bool isMusicActive_l() const;
sp<Track> createTrack_l(