From 0726045216f576e97672ebeefc265d39c4ebaaa5 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Thu, 21 Jan 2010 10:28:45 -0800 Subject: Fix circular dependency between StagefrightPlayer and AwesomePlayer that prevented proper cleanup. related-to-bug: 2355922 --- media/libstagefright/AwesomePlayer.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 'media/libstagefright/AwesomePlayer.cpp') diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 6bcdfba..cc45114 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -139,7 +139,7 @@ void AwesomePlayer::cancelPlayerEvents() { mStreamDoneEventPending = false; } -void AwesomePlayer::setListener(const sp &listener) { +void AwesomePlayer::setListener(const wp &listener) { Mutex::Autolock autoLock(mLock); mListener = listener; } @@ -268,10 +268,7 @@ void AwesomePlayer::AudioNotify(void *_me, int what) { case AudioPlayer::SEEK_COMPLETE: { - if (me->mListener != NULL) { - me->mListener->sendEvent(MEDIA_SEEK_COMPLETE); - } - + me->notifyListener_l(MEDIA_SEEK_COMPLETE); break; } @@ -281,6 +278,16 @@ void AwesomePlayer::AudioNotify(void *_me, int what) { } } +void AwesomePlayer::notifyListener_l(int msg) { + if (mListener != NULL) { + sp listener = mListener.promote(); + + if (listener != NULL) { + listener->sendEvent(msg); + } + } +} + void AwesomePlayer::onStreamDone() { // Posted whenever any stream finishes playing. @@ -294,9 +301,7 @@ void AwesomePlayer::onStreamDone() { postVideoEvent_l(); } } else { - if (mListener != NULL) { - mListener->sendEvent(MEDIA_PLAYBACK_COMPLETE); - } + notifyListener_l(MEDIA_PLAYBACK_COMPLETE); pause_l(); } @@ -643,9 +648,7 @@ void AwesomePlayer::onEvent(int32_t code) { } else { // If we're playing video only, report seek complete now, // otherwise audio player will notify us later. - if (mListener != NULL) { - mListener->sendEvent(MEDIA_SEEK_COMPLETE); - } + notifyListener_l(MEDIA_SEEK_COMPLETE); } mFlags |= FIRST_FRAME; -- cgit v1.1