summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-01-21 10:28:45 -0800
committerAndreas Huber <andih@google.com>2010-01-21 10:28:45 -0800
commit0726045216f576e97672ebeefc265d39c4ebaaa5 (patch)
treec98efa07de08f9cebd3d0dd33a1404b8168fdf9c /media
parent570a3cb7582daa030cb38eedc5eb6a06f86ecc7f (diff)
downloadframeworks_av-0726045216f576e97672ebeefc265d39c4ebaaa5.zip
frameworks_av-0726045216f576e97672ebeefc265d39c4ebaaa5.tar.gz
frameworks_av-0726045216f576e97672ebeefc265d39c4ebaaa5.tar.bz2
Fix circular dependency between StagefrightPlayer and AwesomePlayer that prevented proper cleanup.
related-to-bug: 2355922
Diffstat (limited to 'media')
-rw-r--r--media/libstagefright/AwesomePlayer.cpp25
-rw-r--r--media/libstagefright/include/AwesomePlayer.h6
2 files changed, 18 insertions, 13 deletions
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<MediaPlayerBase> &listener) {
+void AwesomePlayer::setListener(const wp<MediaPlayerBase> &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<MediaPlayerBase> 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 37b14eb..b28a12c 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<MediaPlayerBase> &listener);
+ void setListener(const wp<MediaPlayerBase> &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<MediaPlayerBase> mListener;
+ wp<MediaPlayerBase> mListener;
sp<ISurface> mISurface;
sp<MediaPlayerBase::AudioSink> 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 &);
};