summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/AwesomePlayer.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-02-17 15:58:57 -0800
committerAndreas Huber <andih@google.com>2010-02-17 16:01:01 -0800
commitd29345dfa29cdcc650f3705e43950ef2500f6728 (patch)
treef0ffa3b9682ced2ddd608f93bfbcd58d92fb8c61 /media/libstagefright/AwesomePlayer.cpp
parent349a733b58c3b4c656c4ddfa8cbbb06c008d3bc5 (diff)
downloadframeworks_av-d29345dfa29cdcc650f3705e43950ef2500f6728.zip
frameworks_av-d29345dfa29cdcc650f3705e43950ef2500f6728.tar.gz
frameworks_av-d29345dfa29cdcc650f3705e43950ef2500f6728.tar.bz2
We are cancelling this event during reset, but the event may have already been dispatched at the time, blocking on the mutex. While it's blocking, reset() cancels the event, we're then unblocked and bad things(tm) happen.
related-to-bug: 2451174
Diffstat (limited to 'media/libstagefright/AwesomePlayer.cpp')
-rw-r--r--media/libstagefright/AwesomePlayer.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index 1c9f4fd..59a5f9d 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -401,6 +401,9 @@ void AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) {
void AwesomePlayer::onBufferingUpdate() {
Mutex::Autolock autoLock(mLock);
+ if (!mBufferingEventPending) {
+ return;
+ }
mBufferingEventPending = false;
if (mDurationUs >= 0) {
@@ -425,6 +428,9 @@ void AwesomePlayer::onStreamDone() {
// Posted whenever any stream finishes playing.
Mutex::Autolock autoLock(mLock);
+ if (!mStreamDoneEventPending) {
+ return;
+ }
mStreamDoneEventPending = false;
if (mFlags & LOOPING) {
@@ -918,6 +924,12 @@ void AwesomePlayer::postCheckAudioStatusEvent_l() {
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;
+ }
+
mAudioStatusEventPending = false;
if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) {