From a3f4384ce829132d7ffcd3d284d641e73a8896a6 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Thu, 21 Jan 2010 10:28:45 -0800 Subject: [PATCH] Fix circular dependency between StagefrightPlayer and AwesomePlayer that prevented proper cleanup. related-to-bug: 2355922 --- media/libstagefright/AwesomePlayer.cpp | 25 +++++++++++--------- media/libstagefright/include/AwesomePlayer.h | 6 +++-- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 6bcdfba5d97d2..cc4511413434c 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; diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h index 37b14ebd7a256..b28a12c9ce1be 100644 --- a/media/libstagefright/include/AwesomePlayer.h +++ b/media/libstagefright/include/AwesomePlayer.h @@ -46,7 +46,7 @@ struct AwesomePlayer { AwesomePlayer(); ~AwesomePlayer(); - void setListener(const sp &listener); + void setListener(const wp &listener); status_t setDataSource(const char *uri); status_t setDataSource(int fd, int64_t offset, int64_t length); @@ -82,7 +82,7 @@ private: OMXClient mClient; TimedEventQueue mQueue; - sp mListener; + wp mListener; sp mISurface; sp mAudioSink; @@ -133,6 +133,8 @@ private: static void AudioNotify(void *me, int what); void onStreamDone(); + void notifyListener_l(int msg); + AwesomePlayer(const AwesomePlayer &); AwesomePlayer &operator=(const AwesomePlayer &); };