diff options
author | Chong Zhang <chz@google.com> | 2014-07-23 21:00:38 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-07-23 18:02:35 +0000 |
commit | db2225b2a24fa4ade5c0353730dc2d6a2f5838d9 (patch) | |
tree | 0ae5b9b18005cc429c3465a496739e2807e7197d /media/libmedia | |
parent | 17d0842cf33464a79a81b0e78e49514c3419d1cf (diff) | |
parent | d88adb96ec867ed1b629c434f87514d2fabaf5e9 (diff) | |
download | frameworks_av-db2225b2a24fa4ade5c0353730dc2d6a2f5838d9.zip frameworks_av-db2225b2a24fa4ade5c0353730dc2d6a2f5838d9.tar.gz frameworks_av-db2225b2a24fa4ade5c0353730dc2d6a2f5838d9.tar.bz2 |
Merge "NuPlayer: save thread id in MediaPlayer::start" into lmp-dev
Diffstat (limited to 'media/libmedia')
-rw-r--r-- | media/libmedia/mediaplayer.cpp | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp index 889bd7f..2b7ea97 100644 --- a/media/libmedia/mediaplayer.cpp +++ b/media/libmedia/mediaplayer.cpp @@ -283,16 +283,21 @@ status_t MediaPlayer::prepareAsync() status_t MediaPlayer::start() { ALOGV("start"); + + status_t ret = NO_ERROR; Mutex::Autolock _l(mLock); - if (mCurrentState & MEDIA_PLAYER_STARTED) - return NO_ERROR; - if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_PREPARED | + + mLockThreadId = getThreadId(); + + if (mCurrentState & MEDIA_PLAYER_STARTED) { + ret = NO_ERROR; + } else if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_PLAYBACK_COMPLETE | MEDIA_PLAYER_PAUSED ) ) ) { mPlayer->setLooping(mLoop); mPlayer->setVolume(mLeftVolume, mRightVolume); mPlayer->setAuxEffectSendLevel(mSendLevel); mCurrentState = MEDIA_PLAYER_STARTED; - status_t ret = mPlayer->start(); + ret = mPlayer->start(); if (ret != NO_ERROR) { mCurrentState = MEDIA_PLAYER_STATE_ERROR; } else { @@ -300,10 +305,14 @@ status_t MediaPlayer::start() ALOGV("playback completed immediately following start()"); } } - return ret; + } else { + ALOGE("start called in state %d", mCurrentState); + ret = INVALID_OPERATION; } - ALOGE("start called in state %d", mCurrentState); - return INVALID_OPERATION; + + mLockThreadId = 0; + + return ret; } status_t MediaPlayer::stop() @@ -706,8 +715,8 @@ void MediaPlayer::notify(int msg, int ext1, int ext2, const Parcel *obj) // running in the same process as the media server. In that case, // this will deadlock. // - // The threadId hack below works around this for the care of prepare - // and seekTo within the same process. + // The threadId hack below works around this for the care of prepare, + // seekTo and start within the same process. // FIXME: Remember, this is a hack, it's not even a hack that is applied // consistently for all use-cases, this needs to be revisited. if (mLockThreadId != getThreadId()) { |