| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/media/webrtc_audio_renderer.h" | 5 #include "content/renderer/media/webrtc_audio_renderer.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
| 9 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
| 10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 | 22 |
| 23 #if defined(OS_WIN) | 23 #if defined(OS_WIN) |
| 24 #include "base/win/windows_version.h" | 24 #include "base/win/windows_version.h" |
| 25 #include "media/audio/win/core_audio_util_win.h" | 25 #include "media/audio/win/core_audio_util_win.h" |
| 26 #endif | 26 #endif |
| 27 | 27 |
| 28 namespace content { | 28 namespace content { |
| 29 | 29 |
| 30 namespace { | 30 namespace { |
| 31 | 31 |
| 32 // Supported hardware sample rates for output sides. | |
| 33 #if defined(OS_WIN) || defined(OS_MACOSX) | |
| 34 // AudioHardwareConfig::GetOutputSampleRate() asks the audio layer for its | |
| 35 // current sample rate (set by the user) on Windows and Mac OS X. The listed | |
| 36 // rates below adds restrictions and Initialize() will fail if the user selects | |
| 37 // any rate outside these ranges. | |
| 38 const int kValidOutputRates[] = {96000, 48000, 44100, 32000, 16000}; | |
| 39 #elif defined(OS_LINUX) || defined(OS_OPENBSD) | |
| 40 const int kValidOutputRates[] = {48000, 44100}; | |
| 41 #elif defined(OS_ANDROID) | |
| 42 // TODO(leozwang): We want to use native sampling rate on Android to achieve | |
| 43 // low latency, currently 16000 is used to work around audio problem on some | |
| 44 // Android devices. | |
| 45 const int kValidOutputRates[] = {48000, 44100, 16000}; | |
| 46 #else | |
| 47 const int kValidOutputRates[] = {44100}; | |
| 48 #endif | |
| 49 | |
| 50 // This is a simple wrapper class that's handed out to users of a shared | 32 // This is a simple wrapper class that's handed out to users of a shared |
| 51 // WebRtcAudioRenderer instance. This class maintains the per-user 'playing' | 33 // WebRtcAudioRenderer instance. This class maintains the per-user 'playing' |
| 52 // and 'started' states to avoid problems related to incorrect usage which | 34 // and 'started' states to avoid problems related to incorrect usage which |
| 53 // might violate the implementation assumptions inside WebRtcAudioRenderer | 35 // might violate the implementation assumptions inside WebRtcAudioRenderer |
| 54 // (see the play reference count). | 36 // (see the play reference count). |
| 55 class SharedAudioRenderer : public MediaStreamAudioRenderer { | 37 class SharedAudioRenderer : public MediaStreamAudioRenderer { |
| 56 public: | 38 public: |
| 57 // Callback definition for a callback that is called when when Play(), Pause() | 39 // Callback definition for a callback that is called when when Play(), Pause() |
| 58 // or SetVolume are called (whenever the internal |playing_state_| changes). | 40 // or SetVolume are called (whenever the internal |playing_state_| changes). |
| 59 typedef base::Callback< | 41 typedef base::Callback< |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 } | 229 } |
| 248 media::AudioSampleRate asr; | 230 media::AudioSampleRate asr; |
| 249 if (media::ToAudioSampleRate(sample_rate, &asr)) { | 231 if (media::ToAudioSampleRate(sample_rate, &asr)) { |
| 250 UMA_HISTOGRAM_ENUMERATION( | 232 UMA_HISTOGRAM_ENUMERATION( |
| 251 "WebRTC.AudioOutputSampleRate", asr, media::kAudioSampleRateMax + 1); | 233 "WebRTC.AudioOutputSampleRate", asr, media::kAudioSampleRateMax + 1); |
| 252 } else { | 234 } else { |
| 253 UMA_HISTOGRAM_COUNTS("WebRTC.AudioOutputSampleRateUnexpected", | 235 UMA_HISTOGRAM_COUNTS("WebRTC.AudioOutputSampleRateUnexpected", |
| 254 sample_rate); | 236 sample_rate); |
| 255 } | 237 } |
| 256 | 238 |
| 257 // Verify that the reported output hardware sample rate is supported | |
| 258 // on the current platform. | |
| 259 if (std::find(&kValidOutputRates[0], | |
| 260 &kValidOutputRates[0] + arraysize(kValidOutputRates), | |
| 261 sample_rate) == | |
| 262 &kValidOutputRates[arraysize(kValidOutputRates)]) { | |
| 263 DLOG(ERROR) << sample_rate << " is not a supported output rate."; | |
| 264 return false; | |
| 265 } | |
| 266 | |
| 267 // Set up audio parameters for the source, i.e., the WebRTC client. | 239 // Set up audio parameters for the source, i.e., the WebRTC client. |
| 268 | 240 |
| 269 // The WebRTC client only supports multiples of 10ms as buffer size where | 241 // The WebRTC client only supports multiples of 10ms as buffer size where |
| 270 // 10ms is preferred for lowest possible delay. | 242 // 10ms is preferred for lowest possible delay. |
| 271 media::AudioParameters source_params; | 243 media::AudioParameters source_params; |
| 272 const int frames_per_10ms = (sample_rate / 100); | 244 const int frames_per_10ms = (sample_rate / 100); |
| 273 DVLOG(1) << "Using WebRTC output buffer size: " << frames_per_10ms; | 245 DVLOG(1) << "Using WebRTC output buffer size: " << frames_per_10ms; |
| 274 | 246 |
| 275 source_params.Reset(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, | 247 source_params.Reset(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, |
| 276 sink_params_.channel_layout(), sink_params_.channels(), | 248 sink_params_.channel_layout(), sink_params_.channels(), |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 566 if (RemovePlayingState(source, state)) | 538 if (RemovePlayingState(source, state)) |
| 567 EnterPauseState(); | 539 EnterPauseState(); |
| 568 } else if (AddPlayingState(source, state)) { | 540 } else if (AddPlayingState(source, state)) { |
| 569 EnterPlayState(); | 541 EnterPlayState(); |
| 570 } | 542 } |
| 571 UpdateSourceVolume(source); | 543 UpdateSourceVolume(source); |
| 572 } | 544 } |
| 573 } | 545 } |
| 574 | 546 |
| 575 } // namespace content | 547 } // namespace content |
| OLD | NEW |