summaryrefslogtreecommitdiffstats
path: root/services/audioflinger/Threads.cpp
diff options
context:
space:
mode:
authorGlenn Kasten <gkasten@google.com>2015-07-22 09:15:17 -0700
committerGlenn Kasten <gkasten@google.com>2015-07-22 12:20:43 -0700
commiteb9487e10294a4e73977f460f30eeaff503acd21 (patch)
treefdd7dfd6fd2074f9d0684ed9b11dd851dc469d50 /services/audioflinger/Threads.cpp
parent8f0547a954b39d5750488be7e060ebe1ebfdf666 (diff)
downloadframeworks_av-eb9487e10294a4e73977f460f30eeaff503acd21.zip
frameworks_av-eb9487e10294a4e73977f460f30eeaff503acd21.tar.gz
frameworks_av-eb9487e10294a4e73977f460f30eeaff503acd21.tar.bz2
Fix capture overruns at non-primary sample rate
and small buffer size. Also: Pull out the magic number "12 ms" to a named constant. Remove obsolete AudioFlinger::mPrimaryOutputSampleRate. Bug: 22662814 Change-Id: I261f75a222c4505a84aad2493d251bd2dea59f68
Diffstat (limited to 'services/audioflinger/Threads.cpp')
-rw-r--r--services/audioflinger/Threads.cpp20
1 files changed, 6 insertions, 14 deletions
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index c360051..3057d9d 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -125,10 +125,15 @@ static const uint32_t kMinThreadSleepTimeUs = 5000;
static const uint32_t kMaxThreadSleepTimeShift = 2;
// minimum normal sink buffer size, expressed in milliseconds rather than frames
+// FIXME This should be based on experimentally observed scheduling jitter
static const uint32_t kMinNormalSinkBufferSizeMs = 20;
// maximum normal sink buffer size
static const uint32_t kMaxNormalSinkBufferSizeMs = 24;
+// minimum capture buffer size in milliseconds to _not_ need a fast capture thread
+// FIXME This should be based on experimentally observed scheduling jitter
+static const uint32_t kMinNormalCaptureBufferSizeMs = 12;
+
// Offloaded output thread standby delay: allows track transition without going to standby
static const nsecs_t kOffloadStandbyDelayNs = seconds(1);
@@ -5490,20 +5495,7 @@ AudioFlinger::RecordThread::RecordThread(const sp<AudioFlinger>& audioFlinger,
initFastCapture = true;
break;
case FastCapture_Static:
- uint32_t primaryOutputSampleRate;
- {
- AutoMutex _l(audioFlinger->mHardwareLock);
- primaryOutputSampleRate = audioFlinger->mPrimaryOutputSampleRate;
- }
- initFastCapture =
- // either capture sample rate is same as (a reasonable) primary output sample rate
- ((isMusicRate(primaryOutputSampleRate) &&
- (mSampleRate == primaryOutputSampleRate)) ||
- // or primary output sample rate is unknown, and capture sample rate is reasonable
- ((primaryOutputSampleRate == 0) &&
- isMusicRate(mSampleRate))) &&
- // and the buffer size is < 12 ms
- (mFrameCount * 1000) / mSampleRate < 12;
+ initFastCapture = (mFrameCount * 1000) / mSampleRate < kMinNormalCaptureBufferSizeMs;
break;
// case FastCapture_Dynamic:
}