| 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_local_audio_renderer.h" | 5 #include "content/renderer/media/webrtc_local_audio_renderer.h" |
| 6 | 6 |
| 7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/message_loop/message_loop_proxy.h" | 9 #include "base/message_loop/message_loop_proxy.h" |
| 10 #include "base/synchronization/lock.h" | 10 #include "base/synchronization/lock.h" |
| 11 #include "content/renderer/media/audio_device_factory.h" | 11 #include "content/renderer/media/audio_device_factory.h" |
| 12 #include "content/renderer/media/webrtc_audio_capturer.h" | 12 #include "content/renderer/media/webrtc_audio_capturer.h" |
| 13 #include "content/renderer/render_thread_impl.h" | |
| 14 #include "media/audio/audio_output_device.h" | 13 #include "media/audio/audio_output_device.h" |
| 15 #include "media/base/audio_bus.h" | 14 #include "media/base/audio_bus.h" |
| 16 #include "media/base/audio_fifo.h" | 15 #include "media/base/audio_fifo.h" |
| 17 #include "media/base/audio_hardware_config.h" | |
| 18 | 16 |
| 19 namespace content { | 17 namespace content { |
| 20 | 18 |
| 21 // media::AudioRendererSink::RenderCallback implementation | 19 // media::AudioRendererSink::RenderCallback implementation |
| 22 int WebRtcLocalAudioRenderer::Render( | 20 int WebRtcLocalAudioRenderer::Render( |
| 23 media::AudioBus* audio_bus, int audio_delay_milliseconds) { | 21 media::AudioBus* audio_bus, int audio_delay_milliseconds) { |
| 24 base::AutoLock auto_lock(thread_lock_); | 22 base::AutoLock auto_lock(thread_lock_); |
| 25 | 23 |
| 26 if (!playing_) { | 24 if (!playing_) { |
| 27 audio_bus->Zero(); | 25 audio_bus->Zero(); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 } | 87 } |
| 90 | 88 |
| 91 void WebRtcLocalAudioRenderer::SetCaptureFormat( | 89 void WebRtcLocalAudioRenderer::SetCaptureFormat( |
| 92 const media::AudioParameters& params) { | 90 const media::AudioParameters& params) { |
| 93 audio_params_ = params; | 91 audio_params_ = params; |
| 94 } | 92 } |
| 95 | 93 |
| 96 // WebRtcLocalAudioRenderer::WebRtcLocalAudioRenderer implementation. | 94 // WebRtcLocalAudioRenderer::WebRtcLocalAudioRenderer implementation. |
| 97 WebRtcLocalAudioRenderer::WebRtcLocalAudioRenderer( | 95 WebRtcLocalAudioRenderer::WebRtcLocalAudioRenderer( |
| 98 WebRtcLocalAudioTrack* audio_track, | 96 WebRtcLocalAudioTrack* audio_track, |
| 99 int source_render_view_id) | 97 int source_render_view_id, |
| 98 int session_id, |
| 99 int sample_rate, |
| 100 int frames_per_buffer) |
| 100 : audio_track_(audio_track), | 101 : audio_track_(audio_track), |
| 101 source_render_view_id_(source_render_view_id), | 102 source_render_view_id_(source_render_view_id), |
| 102 playing_(false) { | 103 session_id_(session_id), |
| 104 playing_(false), |
| 105 sample_rate_(sample_rate), |
| 106 frames_per_buffer_(frames_per_buffer) { |
| 103 DCHECK(audio_track); | 107 DCHECK(audio_track); |
| 104 DVLOG(1) << "WebRtcLocalAudioRenderer::WebRtcLocalAudioRenderer()"; | 108 DVLOG(1) << "WebRtcLocalAudioRenderer::WebRtcLocalAudioRenderer()"; |
| 105 } | 109 } |
| 106 | 110 |
| 107 WebRtcLocalAudioRenderer::~WebRtcLocalAudioRenderer() { | 111 WebRtcLocalAudioRenderer::~WebRtcLocalAudioRenderer() { |
| 108 DCHECK(thread_checker_.CalledOnValidThread()); | 112 DCHECK(thread_checker_.CalledOnValidThread()); |
| 109 DCHECK(!sink_.get()); | 113 DCHECK(!sink_.get()); |
| 110 DVLOG(1) << "WebRtcLocalAudioRenderer::~WebRtcLocalAudioRenderer()"; | 114 DVLOG(1) << "WebRtcLocalAudioRenderer::~WebRtcLocalAudioRenderer()"; |
| 111 } | 115 } |
| 112 | 116 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 126 // that we start to build up latency and that can be more difficult to | 130 // that we start to build up latency and that can be more difficult to |
| 127 // detect. Tests have shown that the FIFO never contains more than 2 or 3 | 131 // detect. Tests have shown that the FIFO never contains more than 2 or 3 |
| 128 // audio frames but I have selected a max size of ten buffers just | 132 // audio frames but I have selected a max size of ten buffers just |
| 129 // in case since these tests were performed on a 16 core, 64GB Win 7 | 133 // in case since these tests were performed on a 16 core, 64GB Win 7 |
| 130 // machine. We could also add some sort of error notifier in this area if | 134 // machine. We could also add some sort of error notifier in this area if |
| 131 // the FIFO overflows. | 135 // the FIFO overflows. |
| 132 DCHECK(!loopback_fifo_); | 136 DCHECK(!loopback_fifo_); |
| 133 loopback_fifo_.reset(new media::AudioFifo( | 137 loopback_fifo_.reset(new media::AudioFifo( |
| 134 audio_params_.channels(), 10 * audio_params_.frames_per_buffer())); | 138 audio_params_.channels(), 10 * audio_params_.frames_per_buffer())); |
| 135 | 139 |
| 136 #if defined(OS_ANDROID) | |
| 137 media::AudioHardwareConfig* hardware_config = | |
| 138 RenderThreadImpl::current()->GetAudioHardwareConfig(); | |
| 139 #endif | |
| 140 | |
| 141 media::AudioParameters sink_params(audio_params_.format(), | 140 media::AudioParameters sink_params(audio_params_.format(), |
| 142 audio_params_.channel_layout(), | 141 audio_params_.channel_layout(), |
| 143 audio_params_.sample_rate(), | 142 audio_params_.sample_rate(), |
| 144 audio_params_.bits_per_sample(), | 143 audio_params_.bits_per_sample(), |
| 145 #if defined(OS_ANDROID) | 144 #if defined(OS_ANDROID) |
| 146 // On Android, input and output are using same sampling rate. In order to | 145 // On Android, input and output are using same sampling rate. In order to |
| 147 // achieve low latency mode, we need use buffer size suggested by | 146 // achieve low latency mode, we need use buffer size suggested by |
| 148 // AudioManager for the sink paramters which will be used to decide | 147 // AudioManager for the sink paramters which will be used to decide |
| 149 // buffer size for shared memory buffer. | 148 // buffer size for shared memory buffer. |
| 150 hardware_config->GetOutputBufferSize() | 149 frames_per_buffer_ |
| 151 #else | 150 #else |
| 152 2 * audio_params_.frames_per_buffer() | 151 2 * audio_params_.frames_per_buffer() |
| 153 #endif | 152 #endif |
| 154 ); | 153 ); |
| 154 |
| 155 sink_ = AudioDeviceFactory::NewOutputDevice(source_render_view_id_); | 155 sink_ = AudioDeviceFactory::NewOutputDevice(source_render_view_id_); |
| 156 | 156 |
| 157 // TODO(henrika): we could utilize the unified audio here instead and do | 157 // TODO(henrika): we could utilize the unified audio here instead and do |
| 158 // sink_->InitializeIO(sink_params, 2, callback_.get()); | 158 // sink_->InitializeIO(sink_params, 2, callback_.get()); |
| 159 // It would then be possible to avoid using the WebRtcAudioCapturer. | 159 // It would then be possible to avoid using the WebRtcAudioCapturer. |
| 160 sink_->Initialize(sink_params, this); | 160 sink_->InitializeUnifiedStream(sink_params, this, session_id_); |
| 161 | 161 |
| 162 // Start the capturer and local rendering. Note that, the capturer is owned | 162 // Start the capturer and local rendering. Note that, the capturer is owned |
| 163 // by the WebRTC ADM and might already bee running. | 163 // by the WebRTC ADM and might already bee running. |
| 164 sink_->Start(); | 164 sink_->Start(); |
| 165 | 165 |
| 166 last_render_time_ = base::Time::Now(); | 166 last_render_time_ = base::Time::Now(); |
| 167 playing_ = false; | 167 playing_ = false; |
| 168 } | 168 } |
| 169 | 169 |
| 170 void WebRtcLocalAudioRenderer::Stop() { | 170 void WebRtcLocalAudioRenderer::Stop() { |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 if (!sink_.get()) | 240 if (!sink_.get()) |
| 241 return base::TimeDelta(); | 241 return base::TimeDelta(); |
| 242 return total_render_time(); | 242 return total_render_time(); |
| 243 } | 243 } |
| 244 | 244 |
| 245 bool WebRtcLocalAudioRenderer::IsLocalRenderer() const { | 245 bool WebRtcLocalAudioRenderer::IsLocalRenderer() const { |
| 246 return true; | 246 return true; |
| 247 } | 247 } |
| 248 | 248 |
| 249 } // namespace content | 249 } // namespace content |
| OLD | NEW |