Index: media/audio/audio_util.cc |
diff --git a/media/audio/audio_util.cc b/media/audio/audio_util.cc |
index 75e0831c6026b8c7da63e3f557db1027ba252852..4551f5749d4d9e25cc3cfe2c050d0d2c71ef4489 100644 |
--- a/media/audio/audio_util.cc |
+++ b/media/audio/audio_util.cc |
@@ -18,27 +18,42 @@ |
#include <limits> |
#include "base/basictypes.h" |
+#include "base/command_line.h" |
#include "base/logging.h" |
+#include "base/string_number_conversions.h" |
#include "base/time.h" |
#include "media/audio/audio_parameters.h" |
#include "media/base/audio_bus.h" |
+#include "media/base/media_switches.h" |
#if defined(OS_MACOSX) |
#include "media/audio/mac/audio_low_latency_input_mac.h" |
#include "media/audio/mac/audio_low_latency_output_mac.h" |
#elif defined(OS_WIN) |
-#include "base/command_line.h" |
#include "base/win/windows_version.h" |
#include "media/audio/audio_manager_base.h" |
#include "media/audio/win/audio_low_latency_input_win.h" |
#include "media/audio/win/audio_low_latency_output_win.h" |
#include "media/audio/win/core_audio_util_win.h" |
#include "media/base/limits.h" |
-#include "media/base/media_switches.h" |
#endif |
namespace media { |
+// Returns user buffer size as specified on the command line or 0 if no buffer |
+// size has been specified. |
+static int GetUserBufferSize() { |
+ const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); |
+ int buffer_size = 0; |
+ std::string buffer_size_str(cmd_line->GetSwitchValueASCII( |
+ switches::kAudioBufferSize)); |
+ if (base::StringToInt(buffer_size_str, &buffer_size) && buffer_size > 0) { |
+ return buffer_size; |
+ } |
+ |
+ return 0; |
+} |
+ |
// TODO(fbarchard): Convert to intrinsics for better efficiency. |
template<class Fixed> |
static int ScaleChannel(int channel, int volume) { |
@@ -225,6 +240,10 @@ int GetAudioInputHardwareSampleRate(const std::string& device_id) { |
} |
size_t GetAudioHardwareBufferSize() { |
+ int user_buffer_size = GetUserBufferSize(); |
+ if (user_buffer_size) |
+ return user_buffer_size; |
+ |
// The sizes here were determined by experimentation and are roughly |
// the lowest value (for low latency) that still allowed glitch-free |
// audio under high loads. |
@@ -236,7 +255,7 @@ size_t GetAudioHardwareBufferSize() { |
return 128; |
#elif defined(OS_WIN) |
// Buffer size to use when a proper size can't be determined from the system. |
- static const int kFallbackBufferSize = 2048; |
+ static const int kFallbackBufferSize = 4096; |
if (!CoreAudioUtil::IsSupported()) { |
// Fall back to Windows Wave implementation on Windows XP or lower |
@@ -314,6 +333,10 @@ ChannelLayout GetAudioInputHardwareChannelLayout(const std::string& device_id) { |
// Computes a buffer size based on the given |sample_rate|. Must be used in |
// conjunction with AUDIO_PCM_LINEAR. |
size_t GetHighLatencyOutputBufferSize(int sample_rate) { |
+ int user_buffer_size = GetUserBufferSize(); |
+ if (user_buffer_size) |
+ return user_buffer_size; |
+ |
// TODO(vrk/crogers): The buffer sizes that this function computes is probably |
// overly conservative. However, reducing the buffer size to 2048-8192 bytes |
// caused crbug.com/108396. This computation should be revisited while making |