Loading media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp +61 −3 Original line number Diff line number Diff line Loading @@ -167,6 +167,16 @@ status_t NuPlayerDriver::prepare_l() { mCondition.wait(mLock); } return (mState == STATE_PREPARED) ? OK : UNKNOWN_ERROR; case STATE_STOPPED: // this is really just paused. handle as seek to start mAtEOS = false; mState = STATE_STOPPED_AND_PREPARING; mIsAsyncPrepare = false; mPlayer->seekToAsync(0); while (mState == STATE_STOPPED_AND_PREPARING) { mCondition.wait(mLock); } return (mState == STATE_STOPPED_AND_PREPARED) ? OK : UNKNOWN_ERROR; default: return INVALID_OPERATION; }; Loading @@ -181,6 +191,13 @@ status_t NuPlayerDriver::prepareAsync() { mIsAsyncPrepare = true; mPlayer->prepareAsync(); return OK; case STATE_STOPPED: // this is really just paused. handle as seek to start mAtEOS = false; mState = STATE_STOPPED_AND_PREPARING; mIsAsyncPrepare = true; mPlayer->seekToAsync(0); return OK; default: return INVALID_OPERATION; }; Loading Loading @@ -224,6 +241,7 @@ status_t NuPlayerDriver::start() { break; case STATE_PAUSED: case STATE_STOPPED_AND_PREPARED: { mPlayer->resume(); break; Loading @@ -239,7 +257,29 @@ status_t NuPlayerDriver::start() { } status_t NuPlayerDriver::stop() { return pause(); Mutex::Autolock autoLock(mLock); switch (mState) { case STATE_RUNNING: mPlayer->pause(); // fall through case STATE_PAUSED: notifyListener(MEDIA_STOPPED); // fall through case STATE_PREPARED: case STATE_STOPPED: case STATE_STOPPED_AND_PREPARING: case STATE_STOPPED_AND_PREPARED: mState = STATE_STOPPED; break; default: return INVALID_OPERATION; } return OK; } status_t NuPlayerDriver::pause() { Loading Loading @@ -348,7 +388,9 @@ status_t NuPlayerDriver::reset() { break; } if (mState != STATE_STOPPED) { notifyListener(MEDIA_STOPPED); } mState = STATE_RESET_IN_PROGRESS; mPlayer->resetAsync(); Loading Loading @@ -483,7 +525,23 @@ void NuPlayerDriver::notifyPosition(int64_t positionUs) { } void NuPlayerDriver::notifySeekComplete() { notifyListener(MEDIA_SEEK_COMPLETE); bool wasSeeking = true; { Mutex::Autolock autoLock(mLock); if (mState == STATE_STOPPED_AND_PREPARING) { wasSeeking = false; mState = STATE_STOPPED_AND_PREPARED; mCondition.broadcast(); if (!mIsAsyncPrepare) { // if we are preparing synchronously, no need to notify listener return; } } else if (mState == STATE_STOPPED) { // no need to notify listener return; } } notifyListener(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED); } void NuPlayerDriver::notifyFrameStats( Loading media/libmediaplayerservice/nuplayer/NuPlayerDriver.h +3 −0 Original line number Diff line number Diff line Loading @@ -86,6 +86,9 @@ private: STATE_RUNNING, STATE_PAUSED, STATE_RESET_IN_PROGRESS, STATE_STOPPED, // equivalent to PAUSED STATE_STOPPED_AND_PREPARING, // equivalent to PAUSED, but seeking STATE_STOPPED_AND_PREPARED, // equivalent to PAUSED, but seek complete }; mutable Mutex mLock; Loading Loading
media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp +61 −3 Original line number Diff line number Diff line Loading @@ -167,6 +167,16 @@ status_t NuPlayerDriver::prepare_l() { mCondition.wait(mLock); } return (mState == STATE_PREPARED) ? OK : UNKNOWN_ERROR; case STATE_STOPPED: // this is really just paused. handle as seek to start mAtEOS = false; mState = STATE_STOPPED_AND_PREPARING; mIsAsyncPrepare = false; mPlayer->seekToAsync(0); while (mState == STATE_STOPPED_AND_PREPARING) { mCondition.wait(mLock); } return (mState == STATE_STOPPED_AND_PREPARED) ? OK : UNKNOWN_ERROR; default: return INVALID_OPERATION; }; Loading @@ -181,6 +191,13 @@ status_t NuPlayerDriver::prepareAsync() { mIsAsyncPrepare = true; mPlayer->prepareAsync(); return OK; case STATE_STOPPED: // this is really just paused. handle as seek to start mAtEOS = false; mState = STATE_STOPPED_AND_PREPARING; mIsAsyncPrepare = true; mPlayer->seekToAsync(0); return OK; default: return INVALID_OPERATION; }; Loading Loading @@ -224,6 +241,7 @@ status_t NuPlayerDriver::start() { break; case STATE_PAUSED: case STATE_STOPPED_AND_PREPARED: { mPlayer->resume(); break; Loading @@ -239,7 +257,29 @@ status_t NuPlayerDriver::start() { } status_t NuPlayerDriver::stop() { return pause(); Mutex::Autolock autoLock(mLock); switch (mState) { case STATE_RUNNING: mPlayer->pause(); // fall through case STATE_PAUSED: notifyListener(MEDIA_STOPPED); // fall through case STATE_PREPARED: case STATE_STOPPED: case STATE_STOPPED_AND_PREPARING: case STATE_STOPPED_AND_PREPARED: mState = STATE_STOPPED; break; default: return INVALID_OPERATION; } return OK; } status_t NuPlayerDriver::pause() { Loading Loading @@ -348,7 +388,9 @@ status_t NuPlayerDriver::reset() { break; } if (mState != STATE_STOPPED) { notifyListener(MEDIA_STOPPED); } mState = STATE_RESET_IN_PROGRESS; mPlayer->resetAsync(); Loading Loading @@ -483,7 +525,23 @@ void NuPlayerDriver::notifyPosition(int64_t positionUs) { } void NuPlayerDriver::notifySeekComplete() { notifyListener(MEDIA_SEEK_COMPLETE); bool wasSeeking = true; { Mutex::Autolock autoLock(mLock); if (mState == STATE_STOPPED_AND_PREPARING) { wasSeeking = false; mState = STATE_STOPPED_AND_PREPARED; mCondition.broadcast(); if (!mIsAsyncPrepare) { // if we are preparing synchronously, no need to notify listener return; } } else if (mState == STATE_STOPPED) { // no need to notify listener return; } } notifyListener(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED); } void NuPlayerDriver::notifyFrameStats( Loading
media/libmediaplayerservice/nuplayer/NuPlayerDriver.h +3 −0 Original line number Diff line number Diff line Loading @@ -86,6 +86,9 @@ private: STATE_RUNNING, STATE_PAUSED, STATE_RESET_IN_PROGRESS, STATE_STOPPED, // equivalent to PAUSED STATE_STOPPED_AND_PREPARING, // equivalent to PAUSED, but seeking STATE_STOPPED_AND_PREPARED, // equivalent to PAUSED, but seek complete }; mutable Mutex mLock; Loading