summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvrk@chromium.org <vrk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-05 20:08:16 +0000
committervrk@chromium.org <vrk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-05 20:08:16 +0000
commitf86fcc2ed582e1a6b3e5e1a92bed15c275933497 (patch)
tree65f723ceb1f44ed0170c691ef602bde3cce635f4
parent5f29c1d65b7eae25a84ce75b4147ebe5bbe4a45b (diff)
downloadchromium_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.cc7
-rw-r--r--content/browser/renderer_host/media/audio_renderer_host.cc6
-rw-r--r--content/browser/renderer_host/media/audio_renderer_host_unittest.cc2
-rw-r--r--content/renderer/media/audio_hardware.cc27
-rw-r--r--content/renderer/media/audio_hardware.h8
-rw-r--r--content/renderer/media/audio_renderer_impl.cc3
-rw-r--r--media/audio/audio_parameters.h4
-rw-r--r--media/audio/audio_util.h5
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_