opensles: scale buffer size by rate
Use smaller buffer sizes for lower rates.
Base on 20 msec period common on Android.
Pass mSamplerate so caller can guarantee it is set.
diff --git a/src/opensles/AudioInputStreamOpenSLES.cpp b/src/opensles/AudioInputStreamOpenSLES.cpp
index 5076202..9fad5b1 100644
--- a/src/opensles/AudioInputStreamOpenSLES.cpp
+++ b/src/opensles/AudioInputStreamOpenSLES.cpp
@@ -198,7 +198,7 @@
goto error;
}
- oboeResult = configureBufferSizes();
+ oboeResult = configureBufferSizes(mSampleRate);
if (Result::OK != oboeResult) {
goto error;
}
diff --git a/src/opensles/AudioOutputStreamOpenSLES.cpp b/src/opensles/AudioOutputStreamOpenSLES.cpp
index a8c70b6..4ca7452 100644
--- a/src/opensles/AudioOutputStreamOpenSLES.cpp
+++ b/src/opensles/AudioOutputStreamOpenSLES.cpp
@@ -223,7 +223,7 @@
goto error;
}
- oboeResult = configureBufferSizes();
+ oboeResult = configureBufferSizes(mSampleRate);
if (Result::OK != oboeResult) {
goto error;
}
diff --git a/src/opensles/AudioStreamOpenSLES.cpp b/src/opensles/AudioStreamOpenSLES.cpp
index 38bdf1a..5ac94f2 100644
--- a/src/opensles/AudioStreamOpenSLES.cpp
+++ b/src/opensles/AudioStreamOpenSLES.cpp
@@ -37,7 +37,7 @@
mSessionId = SessionId::None;
}
-static constexpr int32_t kFramesPerHighLatencyBurst = 960; // typical, 20 msec at 48000
+static constexpr int32_t kHighLatencyBufferSizeMillis = 20; // typical Android period
static constexpr SLuint32 kAudioChannelCountMax = 30; // TODO Why 30?
static constexpr SLuint32 SL_ANDROID_UNKNOWN_CHANNELMASK = 0; // Matches name used internally.
@@ -94,19 +94,24 @@
return Result::OK;
}
-Result AudioStreamOpenSLES::configureBufferSizes() {
+Result AudioStreamOpenSLES::configureBufferSizes(int32_t sampleRate) {
// Decide frames per burst based on hints from caller.
mFramesPerBurst = mFramesPerCallback;
if (mFramesPerBurst == kUnspecified) {
mFramesPerBurst = DefaultStreamValues::FramesPerBurst;
}
+
+ // Calculate the size of a fixed duration buffer based on sample rate.
+ int32_t framesPerHighLatencyBuffer =
+ (kHighLatencyBufferSizeMillis * sampleRate) / kMillisPerSecond;
+
// For high latency streams, use a larger buffer size.
// Performance Mode support was added in N_MR1 (7.1)
if (getSdkVersion() >= __ANDROID_API_N_MR1__
&& mPerformanceMode != PerformanceMode::LowLatency
- && mFramesPerBurst < kFramesPerHighLatencyBurst) {
+ && mFramesPerBurst < framesPerHighLatencyBuffer) {
// Find a multiple of framesPerBurst >= kFramesPerHighLatencyBurst.
- int32_t numBursts = (kFramesPerHighLatencyBurst + mFramesPerBurst - 1) / mFramesPerBurst;
+ int32_t numBursts = (framesPerHighLatencyBuffer + mFramesPerBurst - 1) / mFramesPerBurst;
mFramesPerBurst *= numBursts;
LOGD("AudioStreamOpenSLES:%s() NOT low latency, set mFramesPerBurst = %d",
__func__, mFramesPerBurst);
diff --git a/src/opensles/AudioStreamOpenSLES.h b/src/opensles/AudioStreamOpenSLES.h
index 9980c5e..ab190df 100644
--- a/src/opensles/AudioStreamOpenSLES.h
+++ b/src/opensles/AudioStreamOpenSLES.h
@@ -100,7 +100,7 @@
PerformanceMode convertPerformanceMode(SLuint32 openslMode) const;
SLuint32 convertPerformanceMode(PerformanceMode oboeMode) const;
- Result configureBufferSizes();
+ Result configureBufferSizes(int32_t sampleRate);
void logUnsupportedAttributes();