diff options
| author | Eric Laurent <elaurent@google.com> | 2012-04-27 18:24:29 -0700 |
|---|---|---|
| committer | Eric Laurent <elaurent@google.com> | 2012-04-27 19:00:37 -0700 |
| commit | 83faee053cfd4251dbb591b62039f563ffdac399 (patch) | |
| tree | ca170f9a6c1a715ecc00ef49fc600aad92a23e11 | |
| parent | 209ec37b27a4fb6c92005c91ecf993ec19a3d430 (diff) | |
| download | frameworks_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.cpp | 5 | ||||
| -rw-r--r-- | services/audioflinger/AudioFlinger.h | 2 |
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); |
