Index: media/base/audio_latency.cc |
diff --git a/media/base/audio_latency.cc b/media/base/audio_latency.cc |
index 61b3724efa48cc36fc8ff7c3a545c95d7ba5bb56..477b4bfeadcf842cbbb6504a269a4b035ad8c9f6 100644 |
--- a/media/base/audio_latency.cc |
+++ b/media/base/audio_latency.cc |
@@ -9,6 +9,7 @@ |
#include <algorithm> |
#include "base/logging.h" |
+#include "base/sys_info.h" |
#include "base/time/time.h" |
#include "build/build_config.h" |
@@ -142,4 +143,75 @@ int AudioLatency::GetExactBufferSize(base::TimeDelta duration, |
return std::max(buffer_size, hardware_buffer_size); |
} |
+#if defined(OS_MACOSX) |
+namespace { |
+// Define bounds for for low-latency input and output streams. |
+static const int kMinimumInputOutputBufferSize = 128; |
+static const int kMaximumInputOutputBufferSize = 4096; |
+ |
+static int GetDefaultBufferSize(bool is_input, int sample_rate) { |
+ // kMinimumInputOutputBufferSize is too small for the output side because |
+ // CoreAudio can get into under-run if the renderer fails delivering data |
+ // to the browser within the allowed time by the OS. The workaround is to |
+ // use 256 samples as the default output buffer size for sample rates |
+ // smaller than 96KHz. |
+ // TODO(xians): Remove this workaround after WebAudio supports user defined |
+ // buffer size. See https://github.com/WebAudio/web-audio-api/issues/348 |
+ // for details. |
+ int buffer_size = is_input ? kMinimumInputOutputBufferSize |
+ : 2 * kMinimumInputOutputBufferSize; |
+ if (sample_rate > 48000) { |
+ // The default buffer size is too small for higher sample rates and may lead |
+ // to glitching. Adjust upwards by multiples of the default size. |
+ if (sample_rate <= 96000) |
+ buffer_size = 2 * kMinimumInputOutputBufferSize; |
+ else if (sample_rate <= 192000) |
+ buffer_size = 4 * kMinimumInputOutputBufferSize; |
+ } |
+ return buffer_size; |
+} |
+} // namespace |
+ |
+int AudioLatency::GetMinimumAudioBufferSize(int sample_rate) { |
+ return GetDefaultBufferSize(false, sample_rate); |
+} |
+ |
+int AudioLatency::GetMaximumAudioBufferSize(int sample_rate) { |
+ return kMaximumInputOutputBufferSize; |
+} |
+ |
+int AudioLatency::GetDefaultAudioBufferSize(bool is_input, int sample_rate) { |
+ return GetDefaultBufferSize(is_input, sample_rate); |
+} |
+#elif defined(USE_CRAS) |
+namespace { |
+// Define bounds for the output buffer size. |
+const int kMinimumOutputBufferSize = 512; |
+const int kMaximumOutputBufferSize = 8192; |
+ |
+static int GetMinimumOutputBufferSizePerBoard() { |
+ // On faster boards we can use smaller buffer size for lower latency. |
+ // On slower boards we should use larger buffer size to prevent underrun. |
+ std::string board = base::SysInfo::GetLsbReleaseBoard(); |
+ if (board == "kevin") |
+ return 768; |
+ else if (board == "samus") |
+ return 256; |
+ return kMinimumOutputBufferSize; |
+} |
+} // namespace |
+ |
+int AudioLatency::GetMinimumAudioBufferSize(int sample_rate) { |
+ return GetMinimumOutputBufferSizePerBoard(); |
+} |
+ |
+int AudioLatency::GetMaximumAudioBufferSize(int sample_rate) { |
+ return kMaximumOutputBufferSize; |
+} |
+ |
+int AudioLatency::GetDefaultAudioBufferSize(bool is_input, int sample_rate) { |
+ return GetMinimumOutputBufferSizePerBoard(); |
+} |
+#endif |
+ |
} // namespace media |