From: Jean-Michel Trivi Date: Sun, 12 Sep 2010 18:06:51 +0000 (-0700) Subject: Hide media player looper from AudioPlayer. X-Git-Tag: android-x86-7.1-r1~1071^2~75 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=90a8fd23a41ae9feb4f59005eb20f300a4339e33;p=android-x86%2Fsystem-media.git Hide media player looper from AudioPlayer. The ALooper that takes care of the rendering loop in SfPlayer is only used inside SfPlayer. This CL makes SfPlayer manage the lifecycle of its rendering looper. Change-Id: Ia4d5e02ce0a44bcf79021f428b490612a9fead9c --- diff --git a/opensles/libopensles/android_AudioPlayer.cpp b/opensles/libopensles/android_AudioPlayer.cpp index 95526f37..1ddcaee8 100644 --- a/opensles/libopensles/android_AudioPlayer.cpp +++ b/opensles/libopensles/android_AudioPlayer.cpp @@ -209,23 +209,17 @@ void audioPlayer_dispatch_headAtEnd_lockPlay(CAudioPlayer *ap, bool setPlayState void * playContext = NULL; // SLPlayItf callback or no callback? if (needToLock) { - interface_lock_peek(&ap->mPlay); + interface_lock_exclusive(&ap->mPlay); } if (ap->mPlay.mEventFlags & SL_PLAYEVENT_HEADATEND) { playCallback = ap->mPlay.mCallback; playContext = ap->mPlay.mContext; } - if (needToLock) { - interface_unlock_peek(&ap->mPlay); - } if (setPlayStateToPaused) { - if (needToLock) { - interface_lock_poke(&ap->mPlay) - ap->mPlay.mState = SL_PLAYSTATE_PAUSED; - interface_unlock_poke(&ap->mPlay); - } else { - ap->mPlay.mState = SL_PLAYSTATE_PAUSED; - } + ap->mPlay.mState = SL_PLAYSTATE_PAUSED; + } + if (needToLock) { + interface_unlock_exclusive(&ap->mPlay); } // callback with no lock held if (NULL != playCallback) { @@ -686,7 +680,6 @@ SLresult android_audioPlayer_create( pAudioPlayer->mAudioTrack = NULL; #ifndef USE_BACKPORT pAudioPlayer->mSfPlayer.clear(); - pAudioPlayer->mRenderLooper.clear(); #endif pAudioPlayer->mAmplFromVolLevel = 1.0f; @@ -749,13 +742,10 @@ SLresult android_audioPlayer_realize(CAudioPlayer *pAudioPlayer, SLboolean async object_lock_exclusive(&pAudioPlayer->mObject); pAudioPlayer->mAndroidObjState = ANDROID_PREPARING; - pAudioPlayer->mRenderLooper = new android::ALooper(); - pAudioPlayer->mSfPlayer = new android::SfPlayer(pAudioPlayer->mRenderLooper); + pAudioPlayer->mSfPlayer = new android::SfPlayer(); pAudioPlayer->mSfPlayer->setNotifListener(sfplayer_handlePrefetchEvent, - (void*)pAudioPlayer /*notifUSer*/); - pAudioPlayer->mRenderLooper->registerHandler(pAudioPlayer->mSfPlayer); - pAudioPlayer->mRenderLooper->start(false /*runOnCallingThread*/, false /*canCallJava*/, - ANDROID_PRIORITY_AUDIO); + (void*)pAudioPlayer /*notifUSer*/); + pAudioPlayer->mSfPlayer->armLooper(); object_unlock_exclusive(&pAudioPlayer->mObject); int res; @@ -825,8 +815,8 @@ SLresult android_audioPlayer_realize(CAudioPlayer *pAudioPlayer, SLboolean async if (ANDROID_UNINITIALIZED == pAudioPlayer->mAndroidObjState) { return result; } - // proceed with effect initialization + // proceed with effect initialization int sessionId = pAudioPlayer->mAudioTrack->getSessionId(); // initialize EQ // FIXME use a table of effect descriptors when adding support for more effects @@ -918,12 +908,8 @@ SLresult android_audioPlayer_destroy(CAudioPlayer *pAudioPlayer) { //----------------------------------- // MediaPlayer case MEDIAPLAYER: - // FIXME group in one function? - if (pAudioPlayer->mSfPlayer != NULL) { - pAudioPlayer->mRenderLooper->stop(); - pAudioPlayer->mRenderLooper->unregisterHandler(pAudioPlayer->mSfPlayer->id()); + if (pAudioPlayer->mSfPlayer != 0) { pAudioPlayer->mSfPlayer.clear(); - pAudioPlayer->mRenderLooper.clear(); } break; #endif diff --git a/opensles/libopensles/android_SfPlayer.cpp b/opensles/libopensles/android_SfPlayer.cpp index 76042b17..93b5a223 100644 --- a/opensles/libopensles/android_SfPlayer.cpp +++ b/opensles/libopensles/android_SfPlayer.cpp @@ -32,9 +32,8 @@ namespace android { -SfPlayer::SfPlayer(const sp &renderLooper) +SfPlayer::SfPlayer() : mAudioTrack(NULL), - mRenderLooper(renderLooper), mFlags(0), mBitrate(-1), mNumChannels(1), @@ -48,12 +47,18 @@ SfPlayer::SfPlayer(const sp &renderLooper) mNotifyClient(NULL), mNotifyUser(NULL), mDecodeBuffer(NULL) { + + mRenderLooper = new android::ALooper(); } SfPlayer::~SfPlayer() { LOGV("SfPlayer::~SfPlayer()"); + mRenderLooper->stop(); + mRenderLooper->unregisterHandler(this->id()); + mRenderLooper.clear(); + if (mAudioSource != NULL) { { // don't even think about stopping the media source without releasing the decode buffer @@ -69,6 +74,11 @@ SfPlayer::~SfPlayer() { resetDataLocator(); } +void SfPlayer::armLooper() { + mRenderLooper->registerHandler(this); + mRenderLooper->start(false /*runOnCallingThread*/, false /*canCallJava*/, + ANDROID_PRIORITY_AUDIO); +} void SfPlayer::useAudioTrack(AudioTrack* pTrack) { mAudioTrack = pTrack; diff --git a/opensles/libopensles/android_SfPlayer.h b/opensles/libopensles/android_SfPlayer.h index dd958b77..3fdf68df 100644 --- a/opensles/libopensles/android_SfPlayer.h +++ b/opensles/libopensles/android_SfPlayer.h @@ -44,7 +44,7 @@ namespace android { typedef void (*notif_client_t)(int event, const int data1, void* notifUser); struct SfPlayer : public AHandler { - SfPlayer(const sp &renderLooper); + SfPlayer(); enum CacheStatus { kStatusEmpty = 0, @@ -60,6 +60,7 @@ struct SfPlayer : public AHandler { kEventEndOfStream = 'eos', }; + void armLooper(); void useAudioTrack(AudioTrack* pTrack); void setNotifListener(const notif_client_t cbf, void* notifUser); @@ -129,7 +130,7 @@ private: AudioTrack *mAudioTrack; - wp mRenderLooper; + sp mRenderLooper; sp mDataSource; sp mAudioSource; uint32_t mFlags; diff --git a/opensles/libopensles/sles_allinclusive.h b/opensles/libopensles/sles_allinclusive.h index a1f6026f..f10ca731 100644 --- a/opensles/libopensles/sles_allinclusive.h +++ b/opensles/libopensles/sles_allinclusive.h @@ -964,7 +964,6 @@ enum AndroidObject_state { android::AudioTrack *mAudioTrack; #ifndef USE_BACKPORT android::sp mSfPlayer; - android::sp mRenderLooper; #endif /** * Amplification (can be attenuation) factor derived for the VolumeLevel