summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2012-04-27 18:24:29 -0700
committerEric Laurent <elaurent@google.com>2012-04-27 19:00:37 -0700
commit83faee053cfd4251dbb591b62039f563ffdac399 (patch)
treeca170f9a6c1a715ecc00ef49fc600aad92a23e11
parent209ec37b27a4fb6c92005c91ecf993ec19a3d430 (diff)
downloadframeworks_av-83faee053cfd4251dbb591b62039f563ffdac399.zip
frameworks_av-83faee053cfd4251dbb591b62039f563ffdac399.tar.gz
frameworks_av-83faee053cfd4251dbb591b62039f563ffdac399.tar.bz2
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
-rw-r--r--services/audioflinger/AudioFlinger.cpp5
-rw-r--r--services/audioflinger/AudioFlinger.h2
2 files changed, 5 insertions, 2 deletions
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 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac
// 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 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac
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
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index 2a85115..9a0bbcd 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -737,6 +737,8 @@ private:
return (mStreamType == AUDIO_STREAM_CNT);
}
+ sp<IMemory> sharedBuffer() const { return mSharedBuffer; }
+
bool presentationComplete(size_t framesWritten, size_t audioHalFrames);
void triggerEvents(AudioSystem::sync_event_t type);