diff options
author | Andreas Huber <andih@google.com> | 2011-09-01 12:20:23 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-09-01 12:20:24 -0700 |
commit | d942202ee0c92608c648735c3ad0f1bab4312420 (patch) | |
tree | 9408506e1e119d84dec3661c0894fbcea3d2359e /media | |
parent | 5403129e2a2f44620f2ac8109889e5a61be08732 (diff) | |
parent | 02f6e988107bc13ebe4828b734ea0fc3d9d11ae0 (diff) | |
download | frameworks_av-d942202ee0c92608c648735c3ad0f1bab4312420.zip frameworks_av-d942202ee0c92608c648735c3ad0f1bab4312420.tar.gz frameworks_av-d942202ee0c92608c648735c3ad0f1bab4312420.tar.bz2 |
Merge "Guard the audio notifications with a separate lock to avoid deadlocks during reset."
Diffstat (limited to 'media')
-rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 31 | ||||
-rw-r--r-- | 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 f98b0de..47224cc 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 24cf77c..8e73121 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<ANativeWindow> &native); |