summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhenrika@chromium.org <henrika@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-29 00:37:12 +0000
committerhenrika@chromium.org <henrika@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-29 00:37:12 +0000
commit3740e7bb47070c5a60a73f736f55c19155495b03 (patch)
tree9d2360ed234c168eb7f17e17e476b0169b8663bb
parente7554c3fd715e27d5dbf2b915c41ef9313c54783 (diff)
downloadchromium_src-3740e7bb47070c5a60a73f736f55c19155495b03.zip
chromium_src-3740e7bb47070c5a60a73f736f55c19155495b03.tar.gz
chromium_src-3740e7bb47070c5a60a73f736f55c19155495b03.tar.bz2
Adds proper 44.1 support to WebRTC.
This CL removes the existing "WebRTC hack" where the native audio layer runs at 44.1 but WebRTC at 44.0. Now when native WebRTC supports 44100, it is possible to add the same support to WebRTC in Chrome. BUG=243450 TEST=content_unittests and misc. WebRTC clients using 44.1 as sample rate on input and output devices. Review URL: https://chromiumcodereview.appspot.com/15907005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@202713 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/renderer/media/webrtc_audio_capturer.cc28
-rw-r--r--content/renderer/media/webrtc_audio_device_impl.cc8
-rw-r--r--content/renderer/media/webrtc_audio_renderer.cc24
3 files changed, 12 insertions, 48 deletions
diff --git a/content/renderer/media/webrtc_audio_capturer.cc b/content/renderer/media/webrtc_audio_capturer.cc
index d59ed32..47639b7 100644
--- a/content/renderer/media/webrtc_audio_capturer.cc
+++ b/content/renderer/media/webrtc_audio_capturer.cc
@@ -35,34 +35,17 @@ static int kValidInputRates[] = {44100};
static int GetBufferSizeForSampleRate(int sample_rate) {
int buffer_size = 0;
#if defined(OS_WIN) || defined(OS_MACOSX)
- // Use different buffer sizes depending on the current hardware sample rate.
- if (sample_rate == 44100) {
- // We do run at 44.1kHz at the actual audio layer, but ask for frames
- // at 44.0kHz to ensure that we can feed them to the webrtc::VoiceEngine.
- buffer_size = 440;
- } else {
- buffer_size = (sample_rate / 100);
- DCHECK_EQ(buffer_size * 100, sample_rate) <<
- "Sample rate not supported";
- }
+ // Use a buffer size of 10ms.
+ buffer_size = (sample_rate / 100);
#elif defined(OS_LINUX) || defined(OS_OPENBSD)
// Based on tests using the current ALSA implementation in Chrome, we have
// found that the best combination is 20ms on the input side and 10ms on the
// output side.
- // TODO(henrika): It might be possible to reduce the input buffer
- // size and reduce the delay even more.
- if (sample_rate == 44100)
- buffer_size = 2 * 440;
- else
- buffer_size = 2 * sample_rate / 100;
+ buffer_size = 2 * sample_rate / 100;
#elif defined(OS_ANDROID)
// TODO(leozwang): Tune and adjust buffer size on Android.
- if (sample_rate == 44100)
- buffer_size = 2 * 440;
- else
buffer_size = 2 * sample_rate / 100;
#endif
-
return buffer_size;
}
@@ -76,10 +59,7 @@ class WebRtcAudioCapturer::ConfiguredBuffer :
bool Initialize(int sample_rate,
media::ChannelLayout channel_layout) {
int buffer_size = GetBufferSizeForSampleRate(sample_rate);
- if (!buffer_size) {
- DLOG(ERROR) << "Unsupported sample-rate: " << sample_rate;
- return false;
- }
+ DVLOG(1) << "Using WebRTC input buffer size: " << buffer_size;
media::AudioParameters::Format format =
media::AudioParameters::AUDIO_PCM_LOW_LATENCY;
diff --git a/content/renderer/media/webrtc_audio_device_impl.cc b/content/renderer/media/webrtc_audio_device_impl.cc
index cf4a644..d6588fb 100644
--- a/content/renderer/media/webrtc_audio_device_impl.cc
+++ b/content/renderer/media/webrtc_audio_device_impl.cc
@@ -101,10 +101,6 @@ void WebRtcAudioDeviceImpl::CaptureData(const int16* audio_data,
uint32_t new_mic_level = 0;
int samples_per_sec = input_sample_rate();
- if (samples_per_sec == 44100) {
- // Even if the hardware runs at 44.1kHz, we use 44.0 internally.
- samples_per_sec = 44000;
- }
const int samples_per_10_msec = (samples_per_sec / 100);
int bytes_per_sample = input_audio_parameters.bits_per_sample() / 8;
const int bytes_per_10_msec =
@@ -171,10 +167,6 @@ void WebRtcAudioDeviceImpl::RenderData(uint8* audio_data,
DCHECK_LE(channels, output_channels());
int samples_per_sec = output_sample_rate();
- if (samples_per_sec == 44100) {
- // Even if the hardware runs at 44.1kHz, we use 44.0 internally.
- samples_per_sec = 44000;
- }
int samples_per_10_msec = (samples_per_sec / 100);
int bytes_per_sample = output_audio_parameters_.bits_per_sample() / 8;
const int bytes_per_10_msec =
diff --git a/content/renderer/media/webrtc_audio_renderer.cc b/content/renderer/media/webrtc_audio_renderer.cc
index 5b8d3d2..c19bd1c 100644
--- a/content/renderer/media/webrtc_audio_renderer.cc
+++ b/content/renderer/media/webrtc_audio_renderer.cc
@@ -46,7 +46,7 @@ const int kValidOutputRates[] = {44100};
enum AudioFramesPerBuffer {
k160,
k320,
- k440, // WebRTC works internally with 440 audio frames at 44.1kHz.
+ k440,
k480,
k640,
k880,
@@ -58,11 +58,14 @@ enum AudioFramesPerBuffer {
// Helper method to convert integral values to their respective enum values
// above, or kUnexpectedAudioBufferSize if no match exists.
+// We map 441 to k440 to avoid changes in the XML part for histograms.
+// It is still possible to map the histogram result to the actual buffer size.
+// See http://crbug.com/243450 for details.
AudioFramesPerBuffer AsAudioFramesPerBuffer(int frames_per_buffer) {
switch (frames_per_buffer) {
case 160: return k160;
case 320: return k320;
- case 440: return k440;
+ case 441: return k440;
case 480: return k480;
case 640: return k640;
case 880: return k880;
@@ -147,23 +150,12 @@ bool WebRtcAudioRenderer::Initialize(WebRtcAudioRendererSource* source) {
}
// Set up audio parameters for the source, i.e., the WebRTC client.
+
// The WebRTC client only supports multiples of 10ms as buffer size where
// 10ms is preferred for lowest possible delay.
-
media::AudioParameters source_params;
- int buffer_size = 0;
-
- if (sample_rate % 8000 == 0) {
- buffer_size = (sample_rate / 100);
- } else if (sample_rate == 44100) {
- // The resampler in WebRTC does not support 441 as input. We hard code
- // the size to 440 (~0.9977ms) instead and rely on the internal jitter
- // buffer in WebRTC to deal with the resulting drift.
- // TODO(henrika): ensure that WebRTC supports 44100Hz and use 441 instead.
- buffer_size = 440;
- } else {
- return false;
- }
+ int buffer_size = (sample_rate / 100);
+ DVLOG(1) << "Using WebRTC output buffer size: " << buffer_size;
int channels = ChannelLayoutToChannelCount(channel_layout);
source_params.Reset(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,