diff options
author | Andy Hung <hunga@google.com> | 2015-05-31 23:16:07 -0700 |
---|---|---|
committer | Andy Hung <hunga@google.com> | 2015-06-03 22:42:14 -0700 |
commit | 005e9d0300fc326a076ec17b7fa6dd4f51568f55 (patch) | |
tree | d9995f9aa6e174e73211e862526be8b13e5cec66 | |
parent | 85e48142f726770d3b65caa1f29d8b98f8d5db6b (diff) | |
download | frameworks_av-005e9d0300fc326a076ec17b7fa6dd4f51568f55.zip frameworks_av-005e9d0300fc326a076ec17b7fa6dd4f51568f55.tar.gz frameworks_av-005e9d0300fc326a076ec17b7fa6dd4f51568f55.tar.bz2 |
NuPlayer: Allow audio drain to fill buffer when paused
If a pause lasts more than a few seconds, the audio device
enters standby. When the audio device comes out of standby,
it typically requests a large amount of data to fill its buffers
(especially severe for deep buffer PCM mode).
To avoid a glitch, continue to fill the buffer (until no more data
can be written) when paused.
Also, we do not start the audio sink if we are paused to avoid
audio playback in video preview mode.
Bug: 19062223
Bug: 21198655
Change-Id: Ifb3f181d5e810283381b65f2af16a4c71df0b04f
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp index 5022439..f7e3117 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp @@ -623,8 +623,7 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) { } void NuPlayer::Renderer::postDrainAudioQueue_l(int64_t delayUs) { - if (mDrainAudioQueuePending || mSyncQueues || mPaused - || mUseAudioCallback) { + if (mDrainAudioQueuePending || mSyncQueues || mUseAudioCallback) { return; } @@ -800,6 +799,7 @@ bool NuPlayer::Renderer::onDrainAudioQueue() { } #endif + uint32_t prevFramesWritten = mNumFramesWritten; while (!mAudioQueue.empty()) { QueueEntry *entry = &*mAudioQueue.begin(); @@ -898,7 +898,13 @@ bool NuPlayer::Renderer::onDrainAudioQueue() { } mMediaClock->updateMaxTimeMedia(maxTimeMedia); - return !mAudioQueue.empty(); + // calculate whether we need to reschedule another write. + bool reschedule = !mAudioQueue.empty() + && (!mPaused + || prevFramesWritten != mNumFramesWritten); // permit pause to fill buffers + //ALOGD("reschedule:%d empty:%d mPaused:%d prevFramesWritten:%u mNumFramesWritten:%u", + // reschedule, mAudioQueue.empty(), mPaused, prevFramesWritten, mNumFramesWritten); + return reschedule; } int64_t NuPlayer::Renderer::getDurationUsIfPlayedAtSampleRate(uint32_t numFrames) { @@ -1398,7 +1404,7 @@ void NuPlayer::Renderer::onPause() { { Mutex::Autolock autoLock(mLock); - ++mAudioDrainGeneration; + // we do not increment audio drain generation so that we fill audio buffer during pause. ++mVideoDrainGeneration; prepareForMediaRenderingStart_l(); mPaused = true; @@ -1733,7 +1739,9 @@ status_t NuPlayer::Renderer::onOpenAudioSink( return err; } mCurrentPcmInfo = info; - mAudioSink->start(); + if (!mPaused) { // for preview mode, don't start if paused + mAudioSink->start(); + } } if (audioSinkChanged) { onAudioSinkChanged(); |