diff options
author | Eric Laurent <elaurent@google.com> | 2011-11-23 12:35:01 -0800 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2011-11-23 12:35:01 -0800 |
commit | 08e74ba8b05573d0acddc51d09a2554b29a62dbc (patch) | |
tree | af370652377c2f0736a2045fdcd4dc515c50235b | |
parent | 4b057934e79584313870279bdd15ac2e2b520018 (diff) | |
parent | f6422f5f5d04aab47f8f36a0ea92e2140bed0105 (diff) | |
download | frameworks_base-08e74ba8b05573d0acddc51d09a2554b29a62dbc.zip frameworks_base-08e74ba8b05573d0acddc51d09a2554b29a62dbc.tar.gz frameworks_base-08e74ba8b05573d0acddc51d09a2554b29a62dbc.tar.bz2 |
am f6422f5f: am 20398fac: Merge "audioflinger: reduce sleep time to avoid underrun" into ics-mr1
* commit 'f6422f5f5d04aab47f8f36a0ea92e2140bed0105':
audioflinger: reduce sleep time to avoid underrun
-rw-r--r-- | services/audioflinger/AudioFlinger.cpp | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index 66537df..66eb63a 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; } |