summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
diff options
context:
space:
mode:
authorAndy Hung <hunga@google.com>2015-05-31 23:16:07 -0700
committerAndy Hung <hunga@google.com>2015-06-03 22:42:14 -0700
commit005e9d0300fc326a076ec17b7fa6dd4f51568f55 (patch)
treed9995f9aa6e174e73211e862526be8b13e5cec66 /media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
parent85e48142f726770d3b65caa1f29d8b98f8d5db6b (diff)
downloadframeworks_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
Diffstat (limited to 'media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp')
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp18
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();