From 99adee3c3d9cde6819741a38163954808fea270a Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Wed, 10 Dec 2014 16:46:30 -0800 Subject: [audio][audioflinger] Consume all frames when a DirectThread is done. This bug was causing movies to think there was still data left to play so they never finished. Bug: 18360054 Change-Id: If7aee81d62b7af8532abd14579677848a06fe2b1 Signed-off-by: Phil Burk --- services/audioflinger/Threads.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'services') diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index dab6d91..685c1c4 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -4003,9 +4003,14 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep bool last = l.get() == track; // The first time a track is added we wait - // for all its buffers to be filled before processing it + // for all its buffers to be filled before processing it. + // Allow draining the buffer in case the client + // app does not call stop() and relies on underrun to stop: + // hence the test on (track->mRetryCount > 1). + // If retryCount<=1 then track is about to underrun and be removed. uint32_t minFrames; - if ((track->sharedBuffer() == 0) && !track->isStopping_1() && !track->isPausing()) { + if ((track->sharedBuffer() == 0) && !track->isStopping_1() && !track->isPausing() + && (track->mRetryCount > 1)) { minFrames = mNormalFrameCount; } else { minFrames = 1; -- cgit v1.1