diff options
author | Dhananjay Kumar <dhakumar@codeaurora.org> | 2016-02-25 13:48:33 +0530 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2016-04-13 13:54:55 -0700 |
commit | 7262eae1402f3256606ad1776e35c4a08ed267c3 (patch) | |
tree | 4af7bf3d022ccdd286c638348f188081b7846f08 /media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp | |
parent | 3fe0fe6a389cfd63fac0c8e32f31001d3d95bd83 (diff) | |
download | frameworks_av-7262eae1402f3256606ad1776e35c4a08ed267c3.zip frameworks_av-7262eae1402f3256606ad1776e35c4a08ed267c3.tar.gz frameworks_av-7262eae1402f3256606ad1776e35c4a08ed267c3.tar.bz2 |
nuplayer: ignore openAudioSink while waiting for teardown completion
- AudioSink is reopened on AudioTearDown event as well as on
decoder output format change. These events are from different
contexts, independent of each other and can occur concurrently,
doing set of thread-unsafe operations on audioSink, which
sometimes may result in fatal error.
- Any request to openSink, after teardown event is received but
before its completed, is redundant since once teardown is
completed sink is anyway going to be opened again. Also
ignoring sink reopen while in teardown would avoid concurrent
processing of thread-unsafe operations on audioSink.
- Update nuplayer to prevent reopening of sink while teardown is
still going on.
CRs-Fixed: 978013
Change-Id: Ieb3825f133c2099e07d6e92ef101dd5156af8a20
Diffstat (limited to 'media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp')
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp index 156ad9b..aa9842b 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp @@ -127,7 +127,7 @@ NuPlayer::Renderer::Renderer( mAudioRenderingStartGeneration(0), mRenderingDataDelivered(false), mAudioOffloadPauseTimeoutGeneration(0), - mAudioTornDown(false), + mAudioTearingDown(false), mCurrentOffloadInfo(AUDIO_INFO_INITIALIZER), mCurrentPcmInfo(AUDIO_PCMINFO_INITIALIZER), mTotalBuffersQueued(0), @@ -626,6 +626,12 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) { break; } + case kWhatAudioTearDownComplete: + { + onAudioTearDownComplete(); + break; + } + case kWhatAudioOffloadPauseTimeout: { int32_t generation; @@ -837,7 +843,7 @@ void NuPlayer::Renderer::drainAudioQueueUntilLastEOS() { bool NuPlayer::Renderer::onDrainAudioQueue() { // do not drain audio during teardown as queued buffers may be invalid. - if (mAudioTornDown) { + if (mAudioTearingDown) { return false; } // TODO: This call to getPosition checks if AudioTrack has been created @@ -1718,10 +1724,10 @@ int64_t NuPlayer::Renderer::getPlayedOutAudioDurationUs(int64_t nowUs) { } void NuPlayer::Renderer::onAudioTearDown(AudioTearDownReason reason) { - if (mAudioTornDown) { + if (mAudioTearingDown) { return; } - mAudioTornDown = true; + mAudioTearingDown = true; int64_t currentPositionUs; sp<AMessage> notify = mNotify->dup(); @@ -1761,6 +1767,11 @@ status_t NuPlayer::Renderer::onOpenAudioSink( bool isStreaming) { ALOGV("openAudioSink: offloadOnly(%d) offloadingAudio(%d)", offloadOnly, offloadingAudio()); + + if (mAudioTearingDown) { + ALOGW("openAudioSink: not opening now!, would happen after teardown"); + return OK; + } bool audioSinkChanged = false; int32_t numChannels; @@ -1958,7 +1969,6 @@ status_t NuPlayer::Renderer::onOpenAudioSink( if (audioSinkChanged) { onAudioSinkChanged(); } - mAudioTornDown = false; return OK; } @@ -1968,5 +1978,13 @@ void NuPlayer::Renderer::onCloseAudioSink() { mCurrentPcmInfo = AUDIO_PCMINFO_INITIALIZER; } +void NuPlayer::Renderer::signalAudioTearDownComplete() { + (new AMessage(kWhatAudioTearDownComplete, this))->post(); +} + +void NuPlayer::Renderer::onAudioTearDownComplete() { + mAudioTearingDown = false; +} + } // namespace android |