summaryrefslogtreecommitdiffstats
path: root/services/audioflinger/Threads.cpp
diff options
context:
space:
mode:
authorHaynes Mathew George <hgeorge@codeaurora.org>2014-03-07 13:43:49 -0800
committerEric Laurent <elaurent@google.com>2014-03-17 18:32:07 -0700
commit2d3ca68363f723fbe269d3ce52dab4985dfc7154 (patch)
treec1f8c7bbae0e128158ce90a9985d0219dd719182 /services/audioflinger/Threads.cpp
parent164985121796cf214c7a83d32005d9b01125b558 (diff)
downloadframeworks_av-2d3ca68363f723fbe269d3ce52dab4985dfc7154.zip
frameworks_av-2d3ca68363f723fbe269d3ce52dab4985dfc7154.tar.gz
frameworks_av-2d3ca68363f723fbe269d3ce52dab4985dfc7154.tar.bz2
audioflinger: OffloadThread fix for resume underrun
AudioFlinger can miss resuming h/w on a pause->resume transition if sufficient data isn't available Bug: 11358524. Change-Id: Ic3c75256290d3515fd4a96dfcc900909fbe5bc15
Diffstat (limited to 'services/audioflinger/Threads.cpp')
-rw-r--r--services/audioflinger/Threads.cpp42
1 files changed, 22 insertions, 20 deletions
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index e90ebd1..e046e03 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -4223,32 +4223,34 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr
if (last) {
mFlushPending = true;
}
- } else if (track->framesReady() && track->isReady() &&
+ } else if (track->isResumePending()){
+ track->resumeAck();
+ if (last) {
+ if (mPausedBytesRemaining) {
+ // Need to continue write that was interrupted
+ mCurrentWriteLength = mPausedWriteLength;
+ mBytesRemaining = mPausedBytesRemaining;
+ mPausedBytesRemaining = 0;
+ }
+ if (mHwPaused) {
+ doHwResume = true;
+ mHwPaused = false;
+ // threadLoop_mix() will handle the case that we need to
+ // resume an interrupted write
+ }
+ // enable write to audio HAL
+ sleepTime = 0;
+
+ // Do not handle new data in this iteration even if track->framesReady()
+ mixerStatus = MIXER_TRACKS_ENABLED;
+ }
+ } else if (track->framesReady() && track->isReady() &&
!track->isPaused() && !track->isTerminated() && !track->isStopping_2()) {
ALOGVV("OffloadThread: track %d s=%08x [OK]", track->name(), cblk->mServer);
if (track->mFillingUpStatus == Track::FS_FILLED) {
track->mFillingUpStatus = Track::FS_ACTIVE;
// make sure processVolume_l() will apply new volume even if 0
mLeftVolFloat = mRightVolFloat = -1.0;
- if (track->isResumePending()) {
- track->resumeAck();
- if (last) {
- if (mPausedBytesRemaining) {
- // Need to continue write that was interrupted
- mCurrentWriteLength = mPausedWriteLength;
- mBytesRemaining = mPausedBytesRemaining;
- mPausedBytesRemaining = 0;
- }
- if (mHwPaused) {
- doHwResume = true;
- mHwPaused = false;
- // threadLoop_mix() will handle the case that we need to
- // resume an interrupted write
- }
- // enable write to audio HAL
- sleepTime = 0;
- }
- }
}
if (last) {