| 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 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 source_render_view_id_(source_render_view_id), | 211 source_render_view_id_(source_render_view_id), |
| 212 source_render_frame_id_(source_render_frame_id), | 212 source_render_frame_id_(source_render_frame_id), |
| 213 session_id_(session_id), | 213 session_id_(session_id), |
| 214 media_stream_(media_stream), | 214 media_stream_(media_stream), |
| 215 source_(NULL), | 215 source_(NULL), |
| 216 play_ref_count_(0), | 216 play_ref_count_(0), |
| 217 start_ref_count_(0), | 217 start_ref_count_(0), |
| 218 audio_delay_milliseconds_(0), | 218 audio_delay_milliseconds_(0), |
| 219 fifo_delay_milliseconds_(0), | 219 fifo_delay_milliseconds_(0), |
| 220 sink_params_(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, | 220 sink_params_(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, |
| 221 media::CHANNEL_LAYOUT_STEREO, 0, sample_rate, 16, | 221 media::CHANNEL_LAYOUT_STEREO, sample_rate, 16, |
| 222 frames_per_buffer, | 222 frames_per_buffer, |
| 223 GetCurrentDuckingFlag(source_render_frame_id)) { | 223 GetCurrentDuckingFlag(source_render_frame_id)) { |
| 224 WebRtcLogMessage(base::StringPrintf( | 224 WebRtcLogMessage(base::StringPrintf( |
| 225 "WAR::WAR. source_render_view_id=%d" | 225 "WAR::WAR. source_render_view_id=%d" |
| 226 ", session_id=%d, sample_rate=%d, frames_per_buffer=%d, effects=%i", | 226 ", session_id=%d, sample_rate=%d, frames_per_buffer=%d, effects=%i", |
| 227 source_render_view_id, | 227 source_render_view_id, |
| 228 session_id, | 228 session_id, |
| 229 sample_rate, | 229 sample_rate, |
| 230 frames_per_buffer, | 230 frames_per_buffer, |
| 231 sink_params_.effects())); | 231 sink_params_.effects())); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 | 278 |
| 279 // Set up audio parameters for the source, i.e., the WebRTC client. | 279 // Set up audio parameters for the source, i.e., the WebRTC client. |
| 280 | 280 |
| 281 // The WebRTC client only supports multiples of 10ms as buffer size where | 281 // The WebRTC client only supports multiples of 10ms as buffer size where |
| 282 // 10ms is preferred for lowest possible delay. | 282 // 10ms is preferred for lowest possible delay. |
| 283 media::AudioParameters source_params; | 283 media::AudioParameters source_params; |
| 284 const int frames_per_10ms = (sample_rate / 100); | 284 const int frames_per_10ms = (sample_rate / 100); |
| 285 DVLOG(1) << "Using WebRTC output buffer size: " << frames_per_10ms; | 285 DVLOG(1) << "Using WebRTC output buffer size: " << frames_per_10ms; |
| 286 | 286 |
| 287 source_params.Reset(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, | 287 source_params.Reset(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, |
| 288 sink_params_.channel_layout(), sink_params_.channels(), 0, | 288 sink_params_.channel_layout(), sink_params_.channels(), |
| 289 sample_rate, 16, frames_per_10ms); | 289 sample_rate, 16, frames_per_10ms); |
| 290 | 290 |
| 291 // Update audio parameters for the sink, i.e., the native audio output stream. | 291 // Update audio parameters for the sink, i.e., the native audio output stream. |
| 292 // We strive to open up using native parameters to achieve best possible | 292 // We strive to open up using native parameters to achieve best possible |
| 293 // performance and to ensure that no FIFO is needed on the browser side to | 293 // performance and to ensure that no FIFO is needed on the browser side to |
| 294 // match the client request. Any mismatch between the source and the sink is | 294 // match the client request. Any mismatch between the source and the sink is |
| 295 // taken care of in this class instead using a pull FIFO. | 295 // taken care of in this class instead using a pull FIFO. |
| 296 | 296 |
| 297 // Use native output size as default. | 297 // Use native output size as default. |
| 298 int frames_per_buffer = sink_params_.frames_per_buffer(); | 298 int frames_per_buffer = sink_params_.frames_per_buffer(); |
| 299 #if defined(OS_ANDROID) | 299 #if defined(OS_ANDROID) |
| 300 // TODO(henrika): Keep tuning this scheme and espcicially for low-latency | 300 // TODO(henrika): Keep tuning this scheme and espcicially for low-latency |
| 301 // cases. Might not be possible to come up with the perfect solution using | 301 // cases. Might not be possible to come up with the perfect solution using |
| 302 // the render side only. | 302 // the render side only. |
| 303 if (frames_per_buffer < 2 * frames_per_10ms) { | 303 if (frames_per_buffer < 2 * frames_per_10ms) { |
| 304 // Examples of low-latency frame sizes and the resulting |buffer_size|: | 304 // Examples of low-latency frame sizes and the resulting |buffer_size|: |
| 305 // Nexus 7 : 240 audio frames => 2*480 = 960 | 305 // Nexus 7 : 240 audio frames => 2*480 = 960 |
| 306 // Nexus 10 : 256 => 2*441 = 882 | 306 // Nexus 10 : 256 => 2*441 = 882 |
| 307 // Galaxy Nexus: 144 => 2*441 = 882 | 307 // Galaxy Nexus: 144 => 2*441 = 882 |
| 308 frames_per_buffer = 2 * frames_per_10ms; | 308 frames_per_buffer = 2 * frames_per_10ms; |
| 309 DVLOG(1) << "Low-latency output detected on Android"; | 309 DVLOG(1) << "Low-latency output detected on Android"; |
| 310 } | 310 } |
| 311 #endif | 311 #endif |
| 312 DVLOG(1) << "Using sink output buffer size: " << frames_per_buffer; | 312 DVLOG(1) << "Using sink output buffer size: " << frames_per_buffer; |
| 313 | 313 |
| 314 sink_params_.Reset(sink_params_.format(), sink_params_.channel_layout(), | 314 sink_params_.Reset(sink_params_.format(), sink_params_.channel_layout(), |
| 315 sink_params_.channels(), 0, sample_rate, 16, | 315 sink_params_.channels(), sample_rate, 16, |
| 316 frames_per_buffer); | 316 frames_per_buffer); |
| 317 | 317 |
| 318 // Create a FIFO if re-buffering is required to match the source input with | 318 // Create a FIFO if re-buffering is required to match the source input with |
| 319 // the sink request. The source acts as provider here and the sink as | 319 // the sink request. The source acts as provider here and the sink as |
| 320 // consumer. | 320 // consumer. |
| 321 fifo_delay_milliseconds_ = 0; | 321 fifo_delay_milliseconds_ = 0; |
| 322 if (source_params.frames_per_buffer() != sink_params_.frames_per_buffer()) { | 322 if (source_params.frames_per_buffer() != sink_params_.frames_per_buffer()) { |
| 323 DVLOG(1) << "Rebuffering from " << source_params.frames_per_buffer() | 323 DVLOG(1) << "Rebuffering from " << source_params.frames_per_buffer() |
| 324 << " to " << sink_params_.frames_per_buffer(); | 324 << " to " << sink_params_.frames_per_buffer(); |
| 325 audio_fifo_.reset(new media::AudioPullFifo( | 325 audio_fifo_.reset(new media::AudioPullFifo( |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 603 if (RemovePlayingState(source, state)) | 603 if (RemovePlayingState(source, state)) |
| 604 EnterPauseState(); | 604 EnterPauseState(); |
| 605 } else if (AddPlayingState(source, state)) { | 605 } else if (AddPlayingState(source, state)) { |
| 606 EnterPlayState(); | 606 EnterPlayState(); |
| 607 } | 607 } |
| 608 UpdateSourceVolume(source); | 608 UpdateSourceVolume(source); |
| 609 } | 609 } |
| 610 } | 610 } |
| 611 | 611 |
| 612 } // namespace content | 612 } // namespace content |
| OLD | NEW |