diff options
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayer.cpp | 11 | ||||
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp | 8 | ||||
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h | 7 |
3 files changed, 21 insertions, 5 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp index ca596fd..ea60c06 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp @@ -941,6 +941,8 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { ALOGV("Tear down audio offload, fall back to s/w path"); int64_t positionUs; CHECK(msg->findInt64("positionUs", &positionUs)); + int32_t reason; + CHECK(msg->findInt32("reason", &reason)); closeAudioSink(); mAudioDecoder.clear(); ++mAudioDecoderGeneration; @@ -952,7 +954,9 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { mOffloadAudio = false; performSeek(positionUs, false /* needNotify */); - instantiateDecoder(true /* audio */, &mAudioDecoder); + if (reason == Renderer::kDueToError) { + instantiateDecoder(true /* audio */, &mAudioDecoder); + } } break; } @@ -1019,6 +1023,11 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { } else { ALOGW("resume called when source is gone or not set"); } + // |mAudioDecoder| may have been released due to the pause timeout, so try to re-create + // it if needed. + if (mFlushingAudio != SHUT_DOWN) { + instantiateDecoder(true /* audio */, &mAudioDecoder); + } if (mRenderer != NULL) { mRenderer->resume(); } else { diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp index 6d10651..958ab5b 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp @@ -274,7 +274,7 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) { case kWhatAudioOffloadTearDown: { - onAudioOffloadTearDown(); + onAudioOffloadTearDown(kDueToError); break; } @@ -285,7 +285,8 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) { if (generation != mAudioOffloadPauseTimeoutGeneration) { break; } - onAudioOffloadTearDown(); + ALOGV("Audio Offload tear down due to pause timeout."); + onAudioOffloadTearDown(kDueToTimeout); break; } @@ -1089,7 +1090,7 @@ int64_t NuPlayer::Renderer::getPlayedOutAudioDurationUs(int64_t nowUs) { return durationUs; } -void NuPlayer::Renderer::onAudioOffloadTearDown() { +void NuPlayer::Renderer::onAudioOffloadTearDown(AudioOffloadTearDownReason reason) { if (mAudioOffloadTornDown) { return; } @@ -1110,6 +1111,7 @@ void NuPlayer::Renderer::onAudioOffloadTearDown() { sp<AMessage> notify = mNotify->dup(); notify->setInt32("what", kWhatAudioOffloadTearDown); notify->setInt64("positionUs", currentPositionUs); + notify->setInt32("reason", reason); notify->post(); } diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h index 8e6112b..4237902 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h @@ -69,6 +69,11 @@ struct NuPlayer::Renderer : public AHandler { kWhatAudioOffloadPauseTimeout = 'aOPT', }; + enum AudioOffloadTearDownReason { + kDueToError = 0, + kDueToTimeout, + }; + protected: virtual ~Renderer(); @@ -157,7 +162,7 @@ private: void onPause(); void onResume(); void onSetVideoFrameRate(float fps); - void onAudioOffloadTearDown(); + void onAudioOffloadTearDown(AudioOffloadTearDownReason reason); void notifyEOS(bool audio, status_t finalResult, int64_t delayUs = 0); void notifyFlushComplete(bool audio); |