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();