diff options
author | vrk@chromium.org <vrk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-05 20:08:16 +0000 |
---|---|---|
committer | vrk@chromium.org <vrk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-05 20:08:16 +0000 |
commit | f86fcc2ed582e1a6b3e5e1a92bed15c275933497 (patch) | |
tree | 65f723ceb1f44ed0170c691ef602bde3cce635f4 | |
parent | 5f29c1d65b7eae25a84ce75b4147ebe5bbe4a45b (diff) | |
download | chromium_src-f86fcc2ed582e1a6b3e5e1a92bed15c275933497.zip chromium_src-f86fcc2ed582e1a6b3e5e1a92bed15c275933497.tar.gz chromium_src-f86fcc2ed582e1a6b3e5e1a92bed15c275933497.tar.bz2 |
Clean up audio-related utility functions to compute buffer sizes
Renames SelectSamplesPerPacket() to GetHighLatencyOutputBufferSize() and moves
it into audio_hardware.h, where its low-latency counterpart lies.
BUG=NONE
TEST=NONE
Review URL: http://codereview.chromium.org/9442005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@124981 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | content/browser/renderer_host/media/audio_input_renderer_host.cc | 7 | ||||
-rw-r--r-- | content/browser/renderer_host/media/audio_renderer_host.cc | 6 | ||||
-rw-r--r-- | content/browser/renderer_host/media/audio_renderer_host_unittest.cc | 2 | ||||
-rw-r--r-- | content/renderer/media/audio_hardware.cc | 27 | ||||
-rw-r--r-- | content/renderer/media/audio_hardware.h | 8 | ||||
-rw-r--r-- | content/renderer/media/audio_renderer_impl.cc | 3 | ||||
-rw-r--r-- | media/audio/audio_parameters.h | 4 | ||||
-rw-r--r-- | media/audio/audio_util.h | 5 |
8 files changed, 41 insertions, 21 deletions
diff --git a/content/browser/renderer_host/media/audio_input_renderer_host.cc b/content/browser/renderer_host/media/audio_input_renderer_host.cc index 761f895..149d4b8 100644 --- a/content/browser/renderer_host/media/audio_input_renderer_host.cc +++ b/content/browser/renderer_host/media/audio_input_renderer_host.cc @@ -12,7 +12,6 @@ #include "content/browser/renderer_host/media/audio_input_sync_writer.h" #include "content/browser/renderer_host/media/media_stream_manager.h" #include "content/common/media/audio_messages.h" -#include "media/audio/audio_util.h" using content::BrowserMessageFilter; using content::BrowserThread; @@ -209,11 +208,7 @@ void AudioInputRendererHost::OnCreateStream(int stream_id, AudioParameters audio_params(params); - // Select the hardware packet size if not specified. - if (!audio_params.samples_per_packet) { - audio_params.samples_per_packet = - media::SelectSamplesPerPacket(audio_params.sample_rate); - } + DCHECK_GT(audio_params.samples_per_packet, 0); uint32 packet_size = audio_params.GetPacketSize(); // Create a new AudioEntry structure. diff --git a/content/browser/renderer_host/media/audio_renderer_host.cc b/content/browser/renderer_host/media/audio_renderer_host.cc index 7549946..2b6815a 100644 --- a/content/browser/renderer_host/media/audio_renderer_host.cc +++ b/content/browser/renderer_host/media/audio_renderer_host.cc @@ -199,12 +199,8 @@ void AudioRendererHost::OnCreateStream( DCHECK(LookupById(stream_id) == NULL); AudioParameters audio_params(params); + DCHECK_GT(audio_params.samples_per_packet, 0); - // Select the hardware packet size if not specified. - if (!audio_params.samples_per_packet) { - audio_params.samples_per_packet = - media::SelectSamplesPerPacket(audio_params.sample_rate); - } uint32 packet_size = audio_params.GetPacketSize(); scoped_ptr<AudioEntry> entry(new AudioEntry()); diff --git a/content/browser/renderer_host/media/audio_renderer_host_unittest.cc b/content/browser/renderer_host/media/audio_renderer_host_unittest.cc index 59a1af7..5260d72 100644 --- a/content/browser/renderer_host/media/audio_renderer_host_unittest.cc +++ b/content/browser/renderer_host/media/audio_renderer_host_unittest.cc @@ -204,7 +204,7 @@ class AudioRendererHostTest : public testing::Test { params.channels = 2; params.sample_rate = AudioParameters::kAudioCDSampleRate; params.bits_per_sample = 16; - params.samples_per_packet = 0; + params.samples_per_packet = AudioParameters::kAudioCDSampleRate / 10; // Send a create stream message to the audio output stream and wait until // we receive the created message. diff --git a/content/renderer/media/audio_hardware.cc b/content/renderer/media/audio_hardware.cc index 183ebec..c447071 100644 --- a/content/renderer/media/audio_hardware.cc +++ b/content/renderer/media/audio_hardware.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -48,6 +48,31 @@ size_t GetOutputBufferSize() { return output_buffer_size; } +size_t GetHighLatencyOutputBufferSize(int sample_rate) { + // The minimum number of samples in a hardware packet. + // This value is selected so that we can handle down to 5khz sample rate. + static const size_t kMinSamplesPerHardwarePacket = 1024; + + // The maximum number of samples in a hardware packet. + // This value is selected so that we can handle up to 192khz sample rate. + static const size_t kMaxSamplesPerHardwarePacket = 64 * 1024; + + // This constant governs the hardware audio buffer size, this value should be + // chosen carefully. + // This value is selected so that we have 8192 samples for 48khz streams. + static const size_t kMillisecondsPerHardwarePacket = 170; + + // Select the number of samples that can provide at least + // |kMillisecondsPerHardwarePacket| worth of audio data. + size_t samples = kMinSamplesPerHardwarePacket; + while (samples <= kMaxSamplesPerHardwarePacket && + samples * base::Time::kMillisecondsPerSecond < + sample_rate * kMillisecondsPerHardwarePacket) { + samples *= 2; + } + return samples; +} + uint32 GetInputChannelCount() { DCHECK(RenderThreadImpl::current() != NULL); diff --git a/content/renderer/media/audio_hardware.h b/content/renderer/media/audio_hardware.h index ea9a28a..5a9f85a 100644 --- a/content/renderer/media/audio_hardware.h +++ b/content/renderer/media/audio_hardware.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // @@ -24,8 +24,13 @@ CONTENT_EXPORT double GetInputSampleRate(); // Fetch the buffer size we use for the default output device. // Must be called from RenderThreadImpl::current(). +// Must be used in conjunction with AUDIO_PCM_LOW_LATENCY. CONTENT_EXPORT size_t GetOutputBufferSize(); +// Computes a buffer size based on the given |sample_rate|. Must be used in +// conjunction with AUDIO_PCM_LINEAR. +CONTENT_EXPORT size_t GetHighLatencyOutputBufferSize(int sample_rate); + // Fetch the number of audio channels for the default input device. // Must be called from RenderThreadImpl::current(). CONTENT_EXPORT uint32 GetInputChannelCount(); @@ -33,6 +38,7 @@ CONTENT_EXPORT uint32 GetInputChannelCount(); // Forces the next call to any of the Get functions to query the hardware // and repopulate the cache. CONTENT_EXPORT void ResetCache(); + } // namespace audio_hardware #endif // CONTENT_RENDERER_MEDIA_AUDIO_HARDWARE_H_ diff --git a/content/renderer/media/audio_renderer_impl.cc b/content/renderer/media/audio_renderer_impl.cc index 22fe62e..8b4c324 100644 --- a/content/renderer/media/audio_renderer_impl.cc +++ b/content/renderer/media/audio_renderer_impl.cc @@ -11,6 +11,7 @@ #include "base/bind.h" #include "content/common/child_process.h" #include "content/common/media/audio_messages.h" +#include "content/renderer/media/audio_hardware.h" #include "content/renderer/render_thread_impl.h" #include "media/audio/audio_buffers_state.h" #include "media/audio/audio_util.h" @@ -71,7 +72,7 @@ bool AudioRendererImpl::OnInitialize(int bits_per_channel, if (!is_initialized_) { sink_->Initialize( - media::SelectSamplesPerPacket(sample_rate), + audio_hardware::GetHighLatencyOutputBufferSize(sample_rate), audio_parameters_.channels, audio_parameters_.sample_rate, audio_parameters_.format, diff --git a/media/audio/audio_parameters.h b/media/audio/audio_parameters.h index 0de5f6a..244d8b9 100644 --- a/media/audio/audio_parameters.h +++ b/media/audio/audio_parameters.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,6 +9,8 @@ #include "media/base/channel_layout.h" #include "media/base/media_export.h" +// TODO(vrk): This should probably be changed to an immutable object instead of +// a struct. See crbug.com/115902. struct MEDIA_EXPORT AudioParameters { // Compare is useful when AudioParameters is used as a key in std::map. class MEDIA_EXPORT Compare { diff --git a/media/audio/audio_util.h b/media/audio/audio_util.h index 3730c11..51d707a 100644 --- a/media/audio/audio_util.h +++ b/media/audio/audio_util.h @@ -123,11 +123,6 @@ MEDIA_EXPORT bool IsWASAPISupported(); MEDIA_EXPORT void Crossfade(int bytes_to_crossfade, int number_of_channels, int bytes_per_channel, const uint8* src, uint8* dest); - -// Calculates a safe hardware buffer size (in number of samples) given a set -// of audio parameters. -MEDIA_EXPORT uint32 SelectSamplesPerPacket(int sample_rate); - } // namespace media #endif // MEDIA_AUDIO_AUDIO_UTIL_H_ |