AudioFlinger: fix stop detection for static tracks
The end of playback and end of presentation detection was broken for
static AudioTracks (tracks using shared memory buffers passed by client).
The mixer should not wait for a minimal amount of frames to be available to mix
a static track otherwise the last frames might never be consumed.
A static track should be removed from active list in case of underrun even if not
stopped().
Issue 6411521.
Change-Id: I66a2c1a77e98149e5049a223a6f04c3b8c5ad11a
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index eb37028..d123cbb 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -2831,7 +2831,7 @@
// hence the test on (mMixerStatus == MIXER_TRACKS_READY) meaning the track was mixed
// during last round
uint32_t minFrames = 1;
- if (!track->isStopped() && !track->isPausing() &&
+ if ((track->sharedBuffer() == 0) && !track->isStopped() && !track->isPausing() &&
(mMixerStatus == MIXER_TRACKS_READY)) {
if (t->sampleRate() == (int)mSampleRate) {
minFrames = mNormalFrameCount;
@@ -2990,7 +2990,8 @@
if (track->isStopped()) {
track->reset();
}
- if (track->isTerminated() || track->isStopped() || track->isPaused()) {
+ if ((track->sharedBuffer() != 0) || track->isTerminated() ||
+ track->isStopped() || track->isPaused()) {
// We have consumed all the buffers of this track.
// Remove it from the list of active tracks.
// TODO: use actual buffer filling status instead of latency when available from