Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(954)

Unified Diff: media/base/audio_latency.cc

Issue 2908073002: Make OS audio buffer size limits visible. (Closed)
Patch Set: Move all buffer size calculations to AudioLatency. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« media/audio/cras/audio_manager_cras.cc ('K') | « media/base/audio_latency.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« media/audio/cras/audio_manager_cras.cc ('K') | « media/base/audio_latency.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698