From 0852917279f79a94907e9906d0533ae409a30f6a Mon Sep 17 00:00:00 2001 From: Ronghua Wu Date: Thu, 2 Oct 2014 16:55:52 -0700 Subject: NuPlayer: don't restart AudioSink when torn down due to pause timeout. Bug: 17752358 Change-Id: I232d105480139bfc0b991bcd8e001930e577cf30 --- media/libmediaplayerservice/nuplayer/NuPlayer.cpp | 11 ++++++++++- media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp | 8 +++++--- 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 &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 &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 &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 &msg) { case kWhatAudioOffloadTearDown: { - onAudioOffloadTearDown(); + onAudioOffloadTearDown(kDueToError); break; } @@ -285,7 +285,8 @@ void NuPlayer::Renderer::onMessageReceived(const sp &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 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); -- cgit v1.1