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
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 8f1e050..9ec5802 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -181,7 +181,6 @@
mIsLowRamDevice(true),
mIsDeviceTypeKnown(false),
mGlobalEffectEnableTime(0),
- mPrimaryOutputSampleRate(0),
mSystemReady(false)
{
getpid_cached = getpid();
@@ -1869,8 +1868,6 @@
mHardwareStatus = AUDIO_HW_SET_MODE;
mPrimaryHardwareDev->hwDevice()->set_mode(mPrimaryHardwareDev->hwDevice(), mMode);
mHardwareStatus = AUDIO_HW_IDLE;
-
- mPrimaryOutputSampleRate = config->sample_rate;
}
return NO_ERROR;
}
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index 4f7e27d..20c34ef 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -763,9 +763,7 @@
sp<PatchPanel> mPatchPanel;
- uint32_t mPrimaryOutputSampleRate; // sample rate of the primary output, or zero if none
- // protected by mHardwareLock
- bool mSystemReady;
+ bool mSystemReady;
};
#undef INCLUDING_FROM_AUDIOFLINGER_H
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 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 @@
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:
}