diff options
Diffstat (limited to 'media/libmediaplayerservice/nuplayer/NuPlayer.cpp')
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayer.cpp | 51 |
1 files changed, 9 insertions, 42 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp index ec1ab79..b2f86ce 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp @@ -1110,46 +1110,7 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { int32_t reason; CHECK(msg->findInt32("reason", &reason)); ALOGV("Tear down audio with reason %d.", reason); - - if (ifDecodedPCMOffload()) { - tearDownPCMOffload(msg); - break; - } - - mAudioDecoder.clear(); - ++mAudioDecoderGeneration; - bool needsToCreateAudioDecoder = true; - if (mFlushingAudio == FLUSHING_DECODER) { - mFlushComplete[1 /* audio */][1 /* isDecoder */] = true; - mFlushingAudio = FLUSHED; - finishFlushIfPossible(); - } else if (mFlushingAudio == FLUSHING_DECODER_SHUTDOWN - || mFlushingAudio == SHUTTING_DOWN_DECODER) { - mFlushComplete[1 /* audio */][1 /* isDecoder */] = true; - mFlushingAudio = SHUT_DOWN; - finishFlushIfPossible(); - needsToCreateAudioDecoder = false; - } - if (mRenderer == NULL) { - break; - } - closeAudioSink(); - mRenderer->flush( - true /* audio */, false /* notifyComplete */); - if (mVideoDecoder != NULL) { - mRenderer->flush( - false /* audio */, false /* notifyComplete */); - } - - int64_t positionUs; - if (!msg->findInt64("positionUs", &positionUs)) { - positionUs = mPreviousSeekTimeUs; - } - performSeek(positionUs); - - if (reason == Renderer::kDueToError && needsToCreateAudioDecoder) { - instantiateDecoder(true /* audio */, &mAudioDecoder); - } + performTearDown(msg); } break; } @@ -2414,7 +2375,12 @@ void NuPlayer::Source::onMessageReceived(const sp<AMessage> & /* msg */) { TRESPASS(); } -void NuPlayer::tearDownPCMOffload(const sp<AMessage> &msg) { +// +// There is a flush from within the decoder's onFlush handling. +// Without it, it is still possible that a buffer can be queueued +// after NuPlayer issues a flush on the renderer's audio queue. +// +void NuPlayer::performTearDown(const sp<AMessage> &msg) { int32_t reason; CHECK(msg->findInt32("reason", &reason)); @@ -2438,13 +2404,14 @@ void NuPlayer::tearDownPCMOffload(const sp<AMessage> &msg) { mDeferredActions.push_back(new SeekAction(positionUs)); break; default: - ALOGW("tearDownPCMOffload while flushing audio in %d", mFlushingAudio); + ALOGW("performTearDown while flushing audio in %d", mFlushingAudio); break; } } if (mRenderer != NULL) { closeAudioSink(); + // see comment at beginning of function mRenderer->flush( true /* audio */, false /* notifyComplete */); if (mVideoDecoder != NULL) { |