OSDN Git Service

Fix issue 1970108: crash in AudioFlinger::isMusicActive()
authorEric Laurent <elaurent@google.com>
Thu, 9 Jul 2009 10:20:57 +0000 (03:20 -0700)
committerEric Laurent <elaurent@google.com>
Thu, 9 Jul 2009 10:20:57 +0000 (03:20 -0700)
Protected calls to MixerThread::isMusicActive() by AudioFlinger::mLock

libs/audioflinger/AudioFlinger.cpp
libs/audioflinger/AudioFlinger.h

index 8a19fbd..f5bdeda 100644 (file)
@@ -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){
index 8e47b29..634934e 100644 (file)
@@ -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(