summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2011-11-23 12:32:53 -0800
committerAndroid Git Automerger <android-git-automerger@android.com>2011-11-23 12:32:53 -0800
commit3aadf3a399dc9d14ed85c09c30d4726e2c90536a (patch)
treec251630c9b785aa555c7093b2691fe1f75b7a6dc
parenta0c986cc09531e208af17e62ea6f0f47841705cc (diff)
parent7cafbb32999049873d4746ba83bd20c88abe6ce6 (diff)
downloadframeworks_av-3aadf3a399dc9d14ed85c09c30d4726e2c90536a.zip
frameworks_av-3aadf3a399dc9d14ed85c09c30d4726e2c90536a.tar.gz
frameworks_av-3aadf3a399dc9d14ed85c09c30d4726e2c90536a.tar.bz2
am 20398fac: Merge "audioflinger: reduce sleep time to avoid underrun" into ics-mr1
* commit '20398fac99ff78cb3ec3dd122930e45d409e0524': audioflinger: reduce sleep time to avoid underrun
-rw-r--r--services/audioflinger/AudioFlinger.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 780c0d2..aea31a8 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -89,6 +89,12 @@ static const int kRecordThreadSleepUs = 5000;
static const nsecs_t kSetParametersTimeout = seconds(2);
+// minimum sleep time for the mixer thread loop when tracks are active but in underrun
+static const uint32_t kMinThreadSleepTimeUs = 5000;
+// maximum divider applied to the active sleep time in the mixer thread loop
+static const uint32_t kMaxThreadSleepTimeShift = 2;
+
+
// ----------------------------------------------------------------------------
static bool recordingAllowed() {
@@ -1846,6 +1852,7 @@ bool AudioFlinger::MixerThread::threadLoop()
uint32_t activeSleepTime = activeSleepTimeUs();
uint32_t idleSleepTime = idleSleepTimeUs();
uint32_t sleepTime = idleSleepTime;
+ uint32_t sleepTimeShift = 0;
Vector< sp<EffectChain> > effectChains;
#ifdef DEBUG_CPU_USAGE
ThreadCpuUsage cpu;
@@ -1937,6 +1944,7 @@ bool AudioFlinger::MixerThread::threadLoop()
standbyTime = systemTime() + kStandbyTimeInNsecs;
sleepTime = idleSleepTime;
+ sleepTimeShift = 0;
continue;
}
}
@@ -1953,6 +1961,10 @@ bool AudioFlinger::MixerThread::threadLoop()
// mix buffers...
mAudioMixer->process();
sleepTime = 0;
+ // increase sleep time progressively when application underrun condition clears
+ if (sleepTimeShift > 0) {
+ sleepTimeShift--;
+ }
standbyTime = systemTime() + kStandbyTimeInNsecs;
//TODO: delay standby when effects have a tail
} else {
@@ -1960,7 +1972,17 @@ bool AudioFlinger::MixerThread::threadLoop()
// buffer size, then write 0s to the output
if (sleepTime == 0) {
if (mixerStatus == MIXER_TRACKS_ENABLED) {
- sleepTime = activeSleepTime;
+ sleepTime = activeSleepTime >> sleepTimeShift;
+ if (sleepTime < kMinThreadSleepTimeUs) {
+ sleepTime = kMinThreadSleepTimeUs;
+ }
+ // reduce sleep time in case of consecutive application underruns to avoid
+ // starving the audio HAL. As activeSleepTimeUs() is larger than a buffer
+ // duration we would end up writing less data than needed by the audio HAL if
+ // the condition persists.
+ if (sleepTimeShift < kMaxThreadSleepTimeShift) {
+ sleepTimeShift++;
+ }
} else {
sleepTime = idleSleepTime;
}