OSDN Git Service

Guard the audio notifications with a separate lock to avoid deadlocks during reset.
authorAndreas Huber <andih@google.com>
Thu, 1 Sep 2011 18:39:11 +0000 (11:39 -0700)
committerAndreas Huber <andih@google.com>
Thu, 1 Sep 2011 18:39:11 +0000 (11:39 -0700)
Change-Id: I9a97372e1f777d1cbd6774cac2ed34b4b8cd9392
related-to-bug: 5179827

media/libstagefright/AwesomePlayer.cpp
media/libstagefright/include/AwesomePlayer.h

index f98b0de..47224cc 100644 (file)
@@ -978,7 +978,7 @@ status_t AwesomePlayer::startAudioPlayer_l(bool sendErrorNotification) {
             CHECK(!mAudioPlayer->isSeeking());
 
             // We will have finished the seek while starting the audio player.
-            postAudioSeekComplete_l();
+            postAudioSeekComplete();
         }
     } else {
         mAudioPlayer->resume();
@@ -1877,7 +1877,8 @@ void AwesomePlayer::postVideoLagEvent_l() {
     mQueue.postEventWithDelay(mVideoLagEvent, 1000000ll);
 }
 
-void AwesomePlayer::postCheckAudioStatusEvent_l(int64_t delayUs) {
+void AwesomePlayer::postCheckAudioStatusEvent(int64_t delayUs) {
+    Mutex::Autolock autoLock(mAudioLock);
     if (mAudioStatusEventPending) {
         return;
     }
@@ -1886,14 +1887,18 @@ void AwesomePlayer::postCheckAudioStatusEvent_l(int64_t delayUs) {
 }
 
 void AwesomePlayer::onCheckAudioStatus() {
-    Mutex::Autolock autoLock(mLock);
-    if (!mAudioStatusEventPending) {
-        // Event was dispatched and while we were blocking on the mutex,
-        // has already been cancelled.
-        return;
+    {
+        Mutex::Autolock autoLock(mAudioLock);
+        if (!mAudioStatusEventPending) {
+            // Event was dispatched and while we were blocking on the mutex,
+            // has already been cancelled.
+            return;
+        }
+
+        mAudioStatusEventPending = false;
     }
 
-    mAudioStatusEventPending = false;
+    Mutex::Autolock autoLock(mLock);
 
     if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) {
         mWatchForAudioSeekComplete = false;
@@ -2239,17 +2244,11 @@ uint32_t AwesomePlayer::flags() const {
 }
 
 void AwesomePlayer::postAudioEOS(int64_t delayUs) {
-    Mutex::Autolock autoLock(mLock);
-    postCheckAudioStatusEvent_l(delayUs);
+    postCheckAudioStatusEvent(delayUs);
 }
 
 void AwesomePlayer::postAudioSeekComplete() {
-    Mutex::Autolock autoLock(mLock);
-    postAudioSeekComplete_l();
-}
-
-void AwesomePlayer::postAudioSeekComplete_l() {
-    postCheckAudioStatusEvent_l(0 /* delayUs */);
+    postCheckAudioStatusEvent(0);
 }
 
 status_t AwesomePlayer::setParameter(int key, const Parcel &request) {
index 24cf77c..8e73121 100644 (file)
@@ -148,6 +148,7 @@ private:
     mutable Mutex mLock;
     Mutex mMiscStateLock;
     mutable Mutex mStatsLock;
+    Mutex mAudioLock;
 
     OMXClient mClient;
     TimedEventQueue mQueue;
@@ -223,7 +224,7 @@ private:
     void postVideoEvent_l(int64_t delayUs = -1);
     void postBufferingEvent_l();
     void postStreamDoneEvent_l(status_t status);
-    void postCheckAudioStatusEvent_l(int64_t delayUs);
+    void postCheckAudioStatusEvent(int64_t delayUs);
     void postVideoLagEvent_l();
     status_t play_l();
 
@@ -295,7 +296,6 @@ private:
     void ensureCacheIsFetching_l();
 
     status_t startAudioPlayer_l(bool sendErrorNotification = true);
-    void postAudioSeekComplete_l();
 
     void shutdownVideoDecoder_l();
     status_t setNativeWindow_l(const sp<ANativeWindow> &native);