From 02f6e988107bc13ebe4828b734ea0fc3d9d11ae0 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Thu, 1 Sep 2011 11:39:11 -0700 Subject: [PATCH] Guard the audio notifications with a separate lock to avoid deadlocks during reset. Change-Id: I9a97372e1f777d1cbd6774cac2ed34b4b8cd9392 related-to-bug: 5179827 --- media/libstagefright/AwesomePlayer.cpp | 31 ++++++++++++++-------------- media/libstagefright/include/AwesomePlayer.h | 4 ++-- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index f98b0ded66..47224ccb97 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -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) { diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h index 24cf77cda1..8e731212eb 100644 --- a/media/libstagefright/include/AwesomePlayer.h +++ b/media/libstagefright/include/AwesomePlayer.h @@ -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 &native); -- 2.11.0