summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2011-09-01 12:20:23 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-09-01 12:20:24 -0700
commitd942202ee0c92608c648735c3ad0f1bab4312420 (patch)
tree9408506e1e119d84dec3661c0894fbcea3d2359e /media
parent5403129e2a2f44620f2ac8109889e5a61be08732 (diff)
parent02f6e988107bc13ebe4828b734ea0fc3d9d11ae0 (diff)
downloadframeworks_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.cpp31
-rw-r--r--media/libstagefright/include/AwesomePlayer.h4
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);