summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-01-21 10:44:54 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2010-01-21 10:44:54 -0800
commit1b55817b3c9f69115d1f8422d9252a82944fee27 (patch)
tree8116fc1a23f2fe2b87f49891b880b95959946d74
parentb49676a55e7dce9710e1a10749a26997513c5ceb (diff)
parent0726045216f576e97672ebeefc265d39c4ebaaa5 (diff)
downloadframeworks_av-1b55817b3c9f69115d1f8422d9252a82944fee27.zip
frameworks_av-1b55817b3c9f69115d1f8422d9252a82944fee27.tar.gz
frameworks_av-1b55817b3c9f69115d1f8422d9252a82944fee27.tar.bz2
Merge "Fix circular dependency between StagefrightPlayer and AwesomePlayer that prevented proper cleanup."
-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 &);
};