Chromium Code Reviews| Index: media/base/audio_latency.cc |
| diff --git a/media/base/audio_latency.cc b/media/base/audio_latency.cc |
| index 5d37edf415213ff72aeb6e9753927abf1dfb8894..fe6c395a269ad8383cd130ddc1b37e0b16b867b1 100644 |
| --- a/media/base/audio_latency.cc |
| +++ b/media/base/audio_latency.cc |
| @@ -10,55 +10,21 @@ |
| #include "base/logging.h" |
| #include "build/build_config.h" |
| +#include "media/base/audio_parameters.h" |
| namespace media { |
| -namespace { |
| -#if !defined(OS_WIN) |
| -// Taken from "Bit Twiddling Hacks" |
| -// http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 |
| -uint32_t RoundUpToPowerOfTwo(uint32_t v) { |
| - v--; |
| - v |= v >> 1; |
| - v |= v >> 2; |
| - v |= v >> 4; |
| - v |= v >> 8; |
| - v |= v >> 16; |
| - v++; |
| - return v; |
| -} |
| -#endif |
| -} // namespace |
| - |
| // static |
| int AudioLatency::GetHighLatencyBufferSize(int sample_rate, |
|
DaleCurtis
2017/03/30 18:53:47
I wasn't proposing you make this change in this CL
Andrew MacPherson
2017/03/31 12:31:01
Sorry, my mistake, I wasn't sure if you were sugge
|
| int preferred_buffer_size) { |
| // Empirically, we consider 20ms of samples to be high latency. |
| const double twenty_ms_size = 2.0 * sample_rate / 100; |
| -#if defined(OS_WIN) |
| preferred_buffer_size = std::max(preferred_buffer_size, 1); |
| - // Windows doesn't use power of two buffer sizes, so we should always round up |
| - // to the nearest multiple of the output buffer size. |
| + // Round up to the nearest multiple of the output buffer size. |
| const int high_latency_buffer_size = |
| std::ceil(twenty_ms_size / preferred_buffer_size) * preferred_buffer_size; |
| -#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 |
| - // <= 12800 : 256 |
| - // <= 25600 : 512 |
| - // <= 51200 : 1024 |
| - // <= 102400 : 2048 |
| - // <= 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. |
| - const int high_latency_buffer_size = RoundUpToPowerOfTwo(twenty_ms_size); |
| -#endif // defined(OS_WIN) |
| #if defined(OS_CHROMEOS) |
|
DaleCurtis
2017/03/30 18:53:47
Is this necessary now? We'll always be at least 1
|
| return high_latency_buffer_size; // No preference. |
| @@ -126,4 +92,22 @@ int AudioLatency::GetInteractiveBufferSize(int hardware_buffer_size) { |
| return hardware_buffer_size; |
| } |
| +int AudioLatency::GetExactBufferSize(base::TimeDelta duration, |
| + const AudioParameters& hardware_params) { |
|
DaleCurtis
2017/03/30 18:53:47
Should probably just take int sample_rate, int fra
Andrew MacPherson
2017/03/31 12:31:01
Done.
|
| + const int hardware_buffer_size = hardware_params.frames_per_buffer(); |
| + const double requested_buffer_size = |
| + duration.InSecondsF() * hardware_params.sample_rate(); |
| + |
| + // Round the requested size to the nearest multiple of the hardware size |
| + const int buffer_size = |
| + std::round(std::max(requested_buffer_size, 1.0) / hardware_buffer_size) * |
| + hardware_buffer_size; |
| + |
| + const double twenty_ms_size = 2.0 * hardware_params.sample_rate() / 100; |
| + const int max_buffer_size = |
| + std::ceil(twenty_ms_size / hardware_buffer_size) * hardware_buffer_size; |
| + |
| + return std::max(std::min(buffer_size, max_buffer_size), hardware_buffer_size); |
| +} |
| + |
| } // namespace media |