Loading include/media/stagefright/LPAPlayer.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -270,6 +270,7 @@ private: bool mSeeking; bool mSeeking; bool mInternalSeeking; bool mInternalSeeking; bool mReachedEOS; bool mReachedEOS; bool mReachedOutputEOS; status_t mFinalStatus; status_t mFinalStatus; int64_t mSeekTimeUs; int64_t mSeekTimeUs; int64_t mPauseTime; int64_t mPauseTime; Loading media/libstagefright/LPAPlayerALSA.cpp +12 −3 Original line number Original line Diff line number Diff line Loading @@ -81,6 +81,7 @@ mNumA2DPBytesPlayed(0), mSeeking(false), mSeeking(false), mInternalSeeking(false), mInternalSeeking(false), mReachedEOS(false), mReachedEOS(false), mReachedOutputEOS(false), mFinalStatus(OK), mFinalStatus(OK), mStarted(false), mStarted(false), mIsFirstBuffer(false), mIsFirstBuffer(false), Loading Loading @@ -304,6 +305,7 @@ void LPAPlayer::handleA2DPSwitch() { mInternalSeeking = true; mInternalSeeking = true; mNumA2DPBytesPlayed = 0; mNumA2DPBytesPlayed = 0; mReachedEOS = false; mReachedEOS = false; mReachedOutputEOS = false; pthread_cond_signal(&a2dp_notification_cv); pthread_cond_signal(&a2dp_notification_cv); } else { } else { if (isPaused) if (isPaused) Loading Loading @@ -485,6 +487,7 @@ status_t LPAPlayer::seekTo(int64_t time_us) { LOGV("seekTo: time_us %ld", time_us); LOGV("seekTo: time_us %ld", time_us); if ( mReachedEOS ) { if ( mReachedEOS ) { mReachedEOS = false; mReachedEOS = false; mReachedOutputEOS = false; } } mSeeking = true; mSeeking = true; Loading Loading @@ -767,6 +770,7 @@ void LPAPlayer::reset() { mSeeking = false; mSeeking = false; mInternalSeeking = false; mInternalSeeking = false; mReachedEOS = false; mReachedEOS = false; mReachedOutputEOS = false; mFinalStatus = OK; mFinalStatus = OK; mStarted = false; mStarted = false; } } Loading @@ -779,10 +783,9 @@ bool LPAPlayer::isSeeking() { bool LPAPlayer::reachedEOS(status_t *finalStatus) { bool LPAPlayer::reachedEOS(status_t *finalStatus) { *finalStatus = OK; *finalStatus = OK; Mutex::Autolock autoLock(mLock); Mutex::Autolock autoLock(mLock); *finalStatus = mFinalStatus; *finalStatus = mFinalStatus; return mReachedEOS; return mReachedOutputEOS; } } Loading Loading @@ -872,6 +875,7 @@ void LPAPlayer::decoderThreadEntry() { all input buffers have been decoded and response queue is empty*/ all input buffers have been decoded and response queue is empty*/ if(mObserver && mReachedEOS && memBuffersResponseQueue.empty()) { if(mObserver && mReachedEOS && memBuffersResponseQueue.empty()) { LOGV("Posting EOS event..zero byte buffer and response queue is empty"); LOGV("Posting EOS event..zero byte buffer and response queue is empty"); mReachedOutputEOS = true; mObserver->postAudioEOS(); mObserver->postAudioEOS(); } } continue; continue; Loading Loading @@ -1006,6 +1010,7 @@ void LPAPlayer::eventThreadEntry() { LOGV("Timeout %d: Posting EOS event to AwesomePlayer",timeout); LOGV("Timeout %d: Posting EOS event to AwesomePlayer",timeout); isPaused = true; isPaused = true; mPauseTime = mSeekTimeUs + getTimeStamp(A2DP_DISABLED); mPauseTime = mSeekTimeUs + getTimeStamp(A2DP_DISABLED); mReachedOutputEOS = true; mObserver->postAudioEOS(); mObserver->postAudioEOS(); audioEOSPosted = true; audioEOSPosted = true; timeout = -1; timeout = -1; Loading Loading @@ -1082,7 +1087,8 @@ void LPAPlayer::A2DPThreadEntry() { //TODO: Remove this //TODO: Remove this pthread_mutex_lock(&mem_response_mutex); pthread_mutex_lock(&mem_response_mutex); if (memBuffersResponseQueue.empty() || !mAudioSinkOpen || isPaused || !bIsA2DPEnabled) { if (memBuffersResponseQueue.empty() || !mAudioSinkOpen || isPaused || !bIsA2DPEnabled || mReachedOutputEOS) { LOGV("A2DPThreadEntry:: responseQ empty %d mAudioSinkOpen %d isPaused %d bIsA2DPEnabled %d", LOGV("A2DPThreadEntry:: responseQ empty %d mAudioSinkOpen %d isPaused %d bIsA2DPEnabled %d", memBuffersResponseQueue.empty(), mAudioSinkOpen, isPaused, bIsA2DPEnabled); memBuffersResponseQueue.empty(), mAudioSinkOpen, isPaused, bIsA2DPEnabled); LOGV("A2DPThreadEntry:: Waiting on a2dp_cv"); LOGV("A2DPThreadEntry:: Waiting on a2dp_cv"); Loading Loading @@ -1154,6 +1160,7 @@ void LPAPlayer::A2DPThreadEntry() { } } if (mObserver && !asyncReset && mReachedEOS && memBuffersResponseQueue.empty()) { if (mObserver && !asyncReset && mReachedEOS && memBuffersResponseQueue.empty()) { LOGV("Posting EOS event to AwesomePlayer"); LOGV("Posting EOS event to AwesomePlayer"); mReachedOutputEOS = true; mObserver->postAudioEOS(); mObserver->postAudioEOS(); } } pthread_mutex_lock(&mem_request_mutex); pthread_mutex_lock(&mem_request_mutex); Loading Loading @@ -1320,6 +1327,7 @@ void LPAPlayer::A2DPNotificationThreadEntry() { else { else { mInternalSeeking = true; mInternalSeeking = true; mReachedEOS = false; mReachedEOS = false; mReachedOutputEOS = false; mSeekTimeUs += getTimeStamp(A2DP_DISCONNECT); mSeekTimeUs += getTimeStamp(A2DP_DISCONNECT); mNumA2DPBytesPlayed = 0; mNumA2DPBytesPlayed = 0; pthread_cond_signal(&a2dp_cv); pthread_cond_signal(&a2dp_cv); Loading Loading @@ -1702,6 +1710,7 @@ void LPAPlayer::onPauseTimeOut() { // 1.) Set seek flags // 1.) Set seek flags mInternalSeeking = true; mInternalSeeking = true; mReachedEOS = false; mReachedEOS = false; mReachedOutputEOS = false; mSeekTimeUs += getTimeStamp(A2DP_DISABLED); mSeekTimeUs += getTimeStamp(A2DP_DISABLED); // 2.) Flush the buffers and transfer everything to request queue // 2.) Flush the buffers and transfer everything to request queue Loading Loading
include/media/stagefright/LPAPlayer.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -270,6 +270,7 @@ private: bool mSeeking; bool mSeeking; bool mInternalSeeking; bool mInternalSeeking; bool mReachedEOS; bool mReachedEOS; bool mReachedOutputEOS; status_t mFinalStatus; status_t mFinalStatus; int64_t mSeekTimeUs; int64_t mSeekTimeUs; int64_t mPauseTime; int64_t mPauseTime; Loading
media/libstagefright/LPAPlayerALSA.cpp +12 −3 Original line number Original line Diff line number Diff line Loading @@ -81,6 +81,7 @@ mNumA2DPBytesPlayed(0), mSeeking(false), mSeeking(false), mInternalSeeking(false), mInternalSeeking(false), mReachedEOS(false), mReachedEOS(false), mReachedOutputEOS(false), mFinalStatus(OK), mFinalStatus(OK), mStarted(false), mStarted(false), mIsFirstBuffer(false), mIsFirstBuffer(false), Loading Loading @@ -304,6 +305,7 @@ void LPAPlayer::handleA2DPSwitch() { mInternalSeeking = true; mInternalSeeking = true; mNumA2DPBytesPlayed = 0; mNumA2DPBytesPlayed = 0; mReachedEOS = false; mReachedEOS = false; mReachedOutputEOS = false; pthread_cond_signal(&a2dp_notification_cv); pthread_cond_signal(&a2dp_notification_cv); } else { } else { if (isPaused) if (isPaused) Loading Loading @@ -485,6 +487,7 @@ status_t LPAPlayer::seekTo(int64_t time_us) { LOGV("seekTo: time_us %ld", time_us); LOGV("seekTo: time_us %ld", time_us); if ( mReachedEOS ) { if ( mReachedEOS ) { mReachedEOS = false; mReachedEOS = false; mReachedOutputEOS = false; } } mSeeking = true; mSeeking = true; Loading Loading @@ -767,6 +770,7 @@ void LPAPlayer::reset() { mSeeking = false; mSeeking = false; mInternalSeeking = false; mInternalSeeking = false; mReachedEOS = false; mReachedEOS = false; mReachedOutputEOS = false; mFinalStatus = OK; mFinalStatus = OK; mStarted = false; mStarted = false; } } Loading @@ -779,10 +783,9 @@ bool LPAPlayer::isSeeking() { bool LPAPlayer::reachedEOS(status_t *finalStatus) { bool LPAPlayer::reachedEOS(status_t *finalStatus) { *finalStatus = OK; *finalStatus = OK; Mutex::Autolock autoLock(mLock); Mutex::Autolock autoLock(mLock); *finalStatus = mFinalStatus; *finalStatus = mFinalStatus; return mReachedEOS; return mReachedOutputEOS; } } Loading Loading @@ -872,6 +875,7 @@ void LPAPlayer::decoderThreadEntry() { all input buffers have been decoded and response queue is empty*/ all input buffers have been decoded and response queue is empty*/ if(mObserver && mReachedEOS && memBuffersResponseQueue.empty()) { if(mObserver && mReachedEOS && memBuffersResponseQueue.empty()) { LOGV("Posting EOS event..zero byte buffer and response queue is empty"); LOGV("Posting EOS event..zero byte buffer and response queue is empty"); mReachedOutputEOS = true; mObserver->postAudioEOS(); mObserver->postAudioEOS(); } } continue; continue; Loading Loading @@ -1006,6 +1010,7 @@ void LPAPlayer::eventThreadEntry() { LOGV("Timeout %d: Posting EOS event to AwesomePlayer",timeout); LOGV("Timeout %d: Posting EOS event to AwesomePlayer",timeout); isPaused = true; isPaused = true; mPauseTime = mSeekTimeUs + getTimeStamp(A2DP_DISABLED); mPauseTime = mSeekTimeUs + getTimeStamp(A2DP_DISABLED); mReachedOutputEOS = true; mObserver->postAudioEOS(); mObserver->postAudioEOS(); audioEOSPosted = true; audioEOSPosted = true; timeout = -1; timeout = -1; Loading Loading @@ -1082,7 +1087,8 @@ void LPAPlayer::A2DPThreadEntry() { //TODO: Remove this //TODO: Remove this pthread_mutex_lock(&mem_response_mutex); pthread_mutex_lock(&mem_response_mutex); if (memBuffersResponseQueue.empty() || !mAudioSinkOpen || isPaused || !bIsA2DPEnabled) { if (memBuffersResponseQueue.empty() || !mAudioSinkOpen || isPaused || !bIsA2DPEnabled || mReachedOutputEOS) { LOGV("A2DPThreadEntry:: responseQ empty %d mAudioSinkOpen %d isPaused %d bIsA2DPEnabled %d", LOGV("A2DPThreadEntry:: responseQ empty %d mAudioSinkOpen %d isPaused %d bIsA2DPEnabled %d", memBuffersResponseQueue.empty(), mAudioSinkOpen, isPaused, bIsA2DPEnabled); memBuffersResponseQueue.empty(), mAudioSinkOpen, isPaused, bIsA2DPEnabled); LOGV("A2DPThreadEntry:: Waiting on a2dp_cv"); LOGV("A2DPThreadEntry:: Waiting on a2dp_cv"); Loading Loading @@ -1154,6 +1160,7 @@ void LPAPlayer::A2DPThreadEntry() { } } if (mObserver && !asyncReset && mReachedEOS && memBuffersResponseQueue.empty()) { if (mObserver && !asyncReset && mReachedEOS && memBuffersResponseQueue.empty()) { LOGV("Posting EOS event to AwesomePlayer"); LOGV("Posting EOS event to AwesomePlayer"); mReachedOutputEOS = true; mObserver->postAudioEOS(); mObserver->postAudioEOS(); } } pthread_mutex_lock(&mem_request_mutex); pthread_mutex_lock(&mem_request_mutex); Loading Loading @@ -1320,6 +1327,7 @@ void LPAPlayer::A2DPNotificationThreadEntry() { else { else { mInternalSeeking = true; mInternalSeeking = true; mReachedEOS = false; mReachedEOS = false; mReachedOutputEOS = false; mSeekTimeUs += getTimeStamp(A2DP_DISCONNECT); mSeekTimeUs += getTimeStamp(A2DP_DISCONNECT); mNumA2DPBytesPlayed = 0; mNumA2DPBytesPlayed = 0; pthread_cond_signal(&a2dp_cv); pthread_cond_signal(&a2dp_cv); Loading Loading @@ -1702,6 +1710,7 @@ void LPAPlayer::onPauseTimeOut() { // 1.) Set seek flags // 1.) Set seek flags mInternalSeeking = true; mInternalSeeking = true; mReachedEOS = false; mReachedEOS = false; mReachedOutputEOS = false; mSeekTimeUs += getTimeStamp(A2DP_DISABLED); mSeekTimeUs += getTimeStamp(A2DP_DISABLED); // 2.) Flush the buffers and transfer everything to request queue // 2.) Flush the buffers and transfer everything to request queue Loading