diff options
author | dalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-16 02:07:40 +0000 |
---|---|---|
committer | dalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-16 02:07:40 +0000 |
commit | d8ebb326070de132fb2e6635f9ac547a57f09e49 (patch) | |
tree | b4f318cb0084fbe0d4f44426a186d6ef3ffdfdd6 /media | |
parent | f44b09bf88bf48f9abc4f3b0e5d2e92a47539066 (diff) | |
download | chromium_src-d8ebb326070de132fb2e6635f9ac547a57f09e49.zip chromium_src-d8ebb326070de132fb2e6635f9ac547a57f09e49.tar.gz chromium_src-d8ebb326070de132fb2e6635f9ac547a57f09e49.tar.bz2 |
Increase Windows XP hardware buffer size to 4096.
In local testing with XP we noticed WebAudio and HTML5 suffer from
clicking with the "low latency" 2048 buffer size.
This CL also adds a --audio-buffer-size parameter which we can use
to have users tweak in the field and report results back.
BUG=161307
TEST=XP!
TBR=sky
Review URL: https://codereview.chromium.org/11309015
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@168111 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/audio/audio_util.cc | 29 | ||||
-rw-r--r-- | media/audio/win/waveout_output_win.cc | 3 | ||||
-rw-r--r-- | media/base/media_switches.cc | 3 | ||||
-rw-r--r-- | media/base/media_switches.h | 2 |
4 files changed, 34 insertions, 3 deletions
diff --git a/media/audio/audio_util.cc b/media/audio/audio_util.cc index 75e0831..4551f57 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 diff --git a/media/audio/win/waveout_output_win.cc b/media/audio/win/waveout_output_win.cc index 12b4251..5e56169 100644 --- a/media/audio/win/waveout_output_win.cc +++ b/media/audio/win/waveout_output_win.cc @@ -278,6 +278,9 @@ void PCMWaveOutAudioOutputStream::Stop() { return; } + // Wait for lock to ensure all outstanding callbacks have completed. + base::AutoLock auto_lock(lock_); + // waveOutReset() leaves buffers in the unpredictable state, causing // problems if we want to close, release, or reuse them. Fix the states. for (int ix = 0; ix != num_buffers_; ++ix) { diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc index 62f0c39..2c0ef68 100644 --- a/media/base/media_switches.cc +++ b/media/base/media_switches.cc @@ -6,6 +6,9 @@ namespace switches { +// Allow users to specify a custom buffer size for debugging purpose. +const char kAudioBufferSize[] = "audio-buffer-size"; + #if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_SOLARIS) // The Alsa device to use when opening an audio stream. const char kAlsaOutputDevice[] = "alsa-output-device"; diff --git a/media/base/media_switches.h b/media/base/media_switches.h index 744e191..fde744c 100644 --- a/media/base/media_switches.h +++ b/media/base/media_switches.h @@ -17,6 +17,8 @@ extern const char kAlsaOutputDevice[]; extern const char kAlsaInputDevice[]; #endif +MEDIA_EXPORT extern const char kAudioBufferSize[]; + #if defined(USE_CRAS) MEDIA_EXPORT extern const char kUseCras[]; #endif |