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

Unified Diff: media/base/audio_hardware_config.cc

Issue 275943003: Enable higher latency audio on Windows for basic playback. (Closed) Base URL: http://chromium.googlesource.com/chromium/src.git@master
Patch Set: No^2. Created 6 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
« no previous file with comments | « no previous file | media/base/audio_hardware_config_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/base/audio_hardware_config.cc
diff --git a/media/base/audio_hardware_config.cc b/media/base/audio_hardware_config.cc
index 65506ca8f05e144ddd4ca4eb2bdd0cce56eac103..d00e03f6b089334b19be067c96d6445ace1585d6 100644
--- a/media/base/audio_hardware_config.cc
+++ b/media/base/audio_hardware_config.cc
@@ -5,6 +5,7 @@
#include "media/base/audio_hardware_config.h"
#include <algorithm>
+#include <cmath>
#include "base/logging.h"
#include "build/build_config.h"
@@ -14,11 +15,7 @@ using media::AudioParameters;
namespace media {
-#if defined(OS_LINUX) || defined(OS_MACOSX)
-#define HIGH_LATENCY_AUDIO_SUPPORT 1
-#endif
-
-#if defined(HIGH_LATENCY_AUDIO_SUPPORT)
+#if !defined(OS_WIN)
// Taken from "Bit Twiddling Hacks"
// http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
static uint32_t RoundUpToPowerOfTwo(uint32_t v) {
@@ -102,9 +99,19 @@ void AudioHardwareConfig::UpdateOutputConfig(
int AudioHardwareConfig::GetHighLatencyBufferSize() const {
AutoLock auto_lock(config_lock_);
-#if defined(HIGH_LATENCY_AUDIO_SUPPORT)
- // Empirically, use the nearest higher power of two buffer size corresponding
- // to 20 ms worth of samples. For a given sample rate, this works out to:
+
+ // Empirically, we consider 20ms of samples to be high latency.
+ const double twenty_ms_size = 2.0 * output_params_.sample_rate() / 100;
+
+#if defined(OS_WIN)
+ // Windows doesn't use power of two buffer sizes, so we should always round up
+ // to the nearest multiple of the output buffer size.
+ const int high_latency_buffer_size =
+ std::ceil(twenty_ms_size / output_params_.frames_per_buffer()) *
+ output_params_.frames_per_buffer();
+#else
+ // On other platforms use the nearest higher power of two buffer size. For a
+ // given sample rate, this works out to:
//
// <= 3200 : 64
// <= 6400 : 128
@@ -115,14 +122,11 @@ int AudioHardwareConfig::GetHighLatencyBufferSize() const {
// <= 204800 : 4096
//
// On Linux, the minimum hardware buffer size is 512, so the lower calculated
- // values are unused. OSX may have a value as low as 128. Windows is device
- // dependent but will generally be sample_rate() / 100.
- const int high_latency_buffer_size =
- RoundUpToPowerOfTwo(2 * output_params_.sample_rate() / 100);
+ // values are unused. OSX may have a value as low as 128.
+ const int high_latency_buffer_size = RoundUpToPowerOfTwo(twenty_ms_size);
+#endif // defined(OS_WIN)
+
return std::max(output_params_.frames_per_buffer(), high_latency_buffer_size);
-#else
- return output_params_.frames_per_buffer();
-#endif
}
} // namespace media
« no previous file with comments | « no previous file | media/base/audio_hardware_config_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698