diff options
author | Andy Hung <hunga@google.com> | 2014-11-18 20:19:13 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-11-18 20:19:13 +0000 |
commit | 847cbecbfda35e27a73a767c93fd0150ba001882 (patch) | |
tree | f75e3789ae442087d9378016901525322bfd269e /services/audioflinger/Tracks.cpp | |
parent | 44ce5407e8b582a37431464322d92c6bc3cc732a (diff) | |
parent | a248703b0799a9a27481f0ec13df90214a661eb5 (diff) | |
download | frameworks_av-847cbecbfda35e27a73a767c93fd0150ba001882.zip frameworks_av-847cbecbfda35e27a73a767c93fd0150ba001882.tar.gz frameworks_av-847cbecbfda35e27a73a767c93fd0150ba001882.tar.bz2 |
am a248703b: am a3e2c146: am 4d0a5985: Merge "Prevent stopped audio tracks from mixing data" into lmp-mr1-dev
* commit 'a248703b0799a9a27481f0ec13df90214a661eb5':
Prevent stopped audio tracks from mixing data
Diffstat (limited to 'services/audioflinger/Tracks.cpp')
-rw-r--r-- | services/audioflinger/Tracks.cpp | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp index 7d8d4c8..6ce2d42 100644 --- a/services/audioflinger/Tracks.cpp +++ b/services/audioflinger/Tracks.cpp @@ -611,15 +611,16 @@ status_t AudioFlinger::PlaybackThread::Track::getNextBuffer( // ExtendedAudioBufferProvider interface -// Note that framesReady() takes a mutex on the control block using tryLock(). -// This could result in priority inversion if framesReady() is called by the normal mixer, -// as the normal mixer thread runs at lower -// priority than the client's callback thread: there is a short window within framesReady() -// during which the normal mixer could be preempted, and the client callback would block. -// Another problem can occur if framesReady() is called by the fast mixer: -// the tryLock() could block for up to 1 ms, and a sequence of these could delay fast mixer. -// FIXME Replace AudioTrackShared control block implementation by a non-blocking FIFO queue. +// framesReady() may return an approximation of the number of frames if called +// from a different thread than the one calling Proxy->obtainBuffer() and +// Proxy->releaseBuffer(). Also note there is no mutual exclusion in the +// AudioTrackServerProxy so be especially careful calling with FastTracks. size_t AudioFlinger::PlaybackThread::Track::framesReady() const { + if (mSharedBuffer != 0 && (isStopped() || isStopping())) { + // Static tracks return zero frames immediately upon stopping (for FastTracks). + // The remainder of the buffer is not drained. + return 0; + } return mAudioTrackServerProxy->framesReady(); } |