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) {
pAudioPlayer->mAudioTrack = NULL;
#ifndef USE_BACKPORT
pAudioPlayer->mSfPlayer.clear();
- pAudioPlayer->mRenderLooper.clear();
#endif
pAudioPlayer->mAmplFromVolLevel = 1.0f;
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;
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
//-----------------------------------
// 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
namespace android {
-SfPlayer::SfPlayer(const sp<ALooper> &renderLooper)
+SfPlayer::SfPlayer()
: mAudioTrack(NULL),
- mRenderLooper(renderLooper),
mFlags(0),
mBitrate(-1),
mNumChannels(1),
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
resetDataLocator();
}
+void SfPlayer::armLooper() {
+ mRenderLooper->registerHandler(this);
+ mRenderLooper->start(false /*runOnCallingThread*/, false /*canCallJava*/,
+ ANDROID_PRIORITY_AUDIO);
+}
void SfPlayer::useAudioTrack(AudioTrack* pTrack) {
mAudioTrack = pTrack;
typedef void (*notif_client_t)(int event, const int data1, void* notifUser);
struct SfPlayer : public AHandler {
- SfPlayer(const sp<ALooper> &renderLooper);
+ SfPlayer();
enum CacheStatus {
kStatusEmpty = 0,
kEventEndOfStream = 'eos',
};
+ void armLooper();
void useAudioTrack(AudioTrack* pTrack);
void setNotifListener(const notif_client_t cbf, void* notifUser);
AudioTrack *mAudioTrack;
- wp<ALooper> mRenderLooper;
+ sp<ALooper> mRenderLooper;
sp<DataSource> mDataSource;
sp<MediaSource> mAudioSource;
uint32_t mFlags;