summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Eric Laurent <elaurent@google.com> 2010-07-29 06:50:24 -0700
committer Eric Laurent <elaurent@google.com> 2010-07-29 06:50:24 -0700
commita54d7d3d7dd691334189aab20d23c65710092869 (patch)
treec210f11aa8f51610a039b1a2f6a2d59330710940
parent493941b8d8a12ee843d9823c0177f8005a7be54f (diff)
Fixed underrun in audioflinger mixer.
When all audio tracks have been disabled and the mixer is running idle before the output stream is placed in standby, the mixer sometimes fails to write to the output stream on time to avoid underrun. This is because the sleep period used to wait before the next write to output stream is too close to the actual buffer duration. In fact this sleep time is not critical as if we write too early to the output stream, the kernel driver will wait for free buffers from the audio DSP DMA and we will sleep anyways. The fix consists in dividing the calculated wait period by 2 to increase the margin. Change-Id: I5730887dc2ccce2a511bc858494a6f7da6b392a0
-rw-r--r--services/audioflinger/AudioFlinger.cpp4
1 files changed, 2 insertions, 2 deletions
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 4a7243f1d392..252b42ab097f 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -2015,7 +2015,7 @@ uint32_t AudioFlinger::MixerThread::activeSleepTimeUs()
uint32_t AudioFlinger::MixerThread::idleSleepTimeUs()
{
- return (uint32_t)((mFrameCount * 1000) / mSampleRate) * 1000;
+ return (uint32_t)(((mFrameCount * 1000) / mSampleRate) * 1000) / 2;
}
// ----------------------------------------------------------------------------
@@ -2476,7 +2476,7 @@ uint32_t AudioFlinger::DirectOutputThread::idleSleepTimeUs()
{
uint32_t time;
if (AudioSystem::isLinearPCM(mFormat)) {
- time = (uint32_t)((mFrameCount * 1000) / mSampleRate) * 1000;
+ time = (uint32_t)(((mFrameCount * 1000) / mSampleRate) * 1000) / 2;
} else {
time = 10000;
}