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_device_impl.h" | 5 #include "content/renderer/media/webrtc_audio_device_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
10 #include "base/win/windows_version.h" | 10 #include "base/win/windows_version.h" |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 | 167 |
168 int32_t WebRtcAudioDeviceImpl::Release() { | 168 int32_t WebRtcAudioDeviceImpl::Release() { |
169 int ret = base::subtle::Barrier_AtomicIncrement(&ref_count_, -1); | 169 int ret = base::subtle::Barrier_AtomicIncrement(&ref_count_, -1); |
170 if (ret == 0) { | 170 if (ret == 0) { |
171 delete this; | 171 delete this; |
172 } | 172 } |
173 return ret; | 173 return ret; |
174 } | 174 } |
175 | 175 |
176 int WebRtcAudioDeviceImpl::Render( | 176 int WebRtcAudioDeviceImpl::Render( |
177 const std::vector<float*>& audio_data, | 177 media::AudioBus* audio_bus, |
178 int number_of_frames, | 178 int number_of_frames, |
179 int audio_delay_milliseconds) { | 179 int audio_delay_milliseconds) { |
180 DCHECK_LE(number_of_frames, output_buffer_size()); | 180 DCHECK_LE(number_of_frames, output_buffer_size()); |
181 | 181 |
182 { | 182 { |
183 base::AutoLock auto_lock(lock_); | 183 base::AutoLock auto_lock(lock_); |
184 // Store the reported audio delay locally. | 184 // Store the reported audio delay locally. |
185 output_delay_ms_ = audio_delay_milliseconds; | 185 output_delay_ms_ = audio_delay_milliseconds; |
186 } | 186 } |
187 | 187 |
188 const int channels = audio_data.size(); | 188 const int channels = audio_bus->channels(); |
189 DCHECK_LE(channels, output_channels()); | 189 DCHECK_LE(channels, output_channels()); |
190 | 190 |
191 int samples_per_sec = output_sample_rate(); | 191 int samples_per_sec = output_sample_rate(); |
192 if (samples_per_sec == 44100) { | 192 if (samples_per_sec == 44100) { |
193 // Even if the hardware runs at 44.1kHz, we use 44.0 internally. | 193 // Even if the hardware runs at 44.1kHz, we use 44.0 internally. |
194 samples_per_sec = 44000; | 194 samples_per_sec = 44000; |
195 } | 195 } |
196 int samples_per_10_msec = (samples_per_sec / 100); | 196 int samples_per_10_msec = (samples_per_sec / 100); |
197 const int bytes_per_10_msec = | 197 const int bytes_per_10_msec = |
198 channels * samples_per_10_msec * bytes_per_sample_; | 198 channels * samples_per_10_msec * bytes_per_sample_; |
(...skipping 16 matching lines...) Expand all Loading... |
215 num_audio_samples); | 215 num_audio_samples); |
216 accumulated_audio_samples += num_audio_samples; | 216 accumulated_audio_samples += num_audio_samples; |
217 audio_byte_buffer += bytes_per_10_msec; | 217 audio_byte_buffer += bytes_per_10_msec; |
218 } | 218 } |
219 | 219 |
220 // Deinterleave each channel and convert to 32-bit floating-point | 220 // Deinterleave each channel and convert to 32-bit floating-point |
221 // with nominal range -1.0 -> +1.0 to match the callback format. | 221 // with nominal range -1.0 -> +1.0 to match the callback format. |
222 for (int channel_index = 0; channel_index < channels; ++channel_index) { | 222 for (int channel_index = 0; channel_index < channels; ++channel_index) { |
223 media::DeinterleaveAudioChannel( | 223 media::DeinterleaveAudioChannel( |
224 output_buffer_.get(), | 224 output_buffer_.get(), |
225 audio_data[channel_index], | 225 audio_bus->channel(channel_index), |
226 channels, | 226 channels, |
227 channel_index, | 227 channel_index, |
228 bytes_per_sample_, | 228 bytes_per_sample_, |
229 number_of_frames); | 229 number_of_frames); |
230 } | 230 } |
231 return number_of_frames; | 231 return number_of_frames; |
232 } | 232 } |
233 | 233 |
234 void WebRtcAudioDeviceImpl::OnRenderError() { | 234 void WebRtcAudioDeviceImpl::OnRenderError() { |
235 DCHECK_EQ(MessageLoop::current(), ChildProcess::current()->io_message_loop()); | 235 DCHECK_EQ(MessageLoop::current(), ChildProcess::current()->io_message_loop()); |
236 // TODO(henrika): Implement error handling. | 236 // TODO(henrika): Implement error handling. |
237 LOG(ERROR) << "OnRenderError()"; | 237 LOG(ERROR) << "OnRenderError()"; |
238 } | 238 } |
239 | 239 |
240 void WebRtcAudioDeviceImpl::Capture(const std::vector<float*>& audio_data, | 240 void WebRtcAudioDeviceImpl::Capture(media::AudioBus* audio_bus, |
241 int number_of_frames, | 241 int number_of_frames, |
242 int audio_delay_milliseconds, | 242 int audio_delay_milliseconds, |
243 double volume) { | 243 double volume) { |
244 DCHECK_LE(number_of_frames, input_buffer_size()); | 244 DCHECK_LE(number_of_frames, input_buffer_size()); |
245 #if defined(OS_WIN) || defined(OS_MACOSX) | 245 #if defined(OS_WIN) || defined(OS_MACOSX) |
246 DCHECK_LE(volume, 1.0); | 246 DCHECK_LE(volume, 1.0); |
247 #elif defined(OS_LINUX) || defined(OS_OPENBSD) | 247 #elif defined(OS_LINUX) || defined(OS_OPENBSD) |
248 // We have a special situation on Linux where the microphone volume can be | 248 // We have a special situation on Linux where the microphone volume can be |
249 // "higher than maximum". The input volume slider in the sound preference | 249 // "higher than maximum". The input volume slider in the sound preference |
250 // allows the user to set a scaling that is higher than 100%. It means that | 250 // allows the user to set a scaling that is higher than 100%. It means that |
251 // even if the reported maximum levels is N, the actual microphone level can | 251 // even if the reported maximum levels is N, the actual microphone level can |
252 // go up to 1.5*N and that corresponds to a normalized |volume| of 1.5. | 252 // go up to 1.5*N and that corresponds to a normalized |volume| of 1.5. |
253 DCHECK_LE(volume, 1.5); | 253 DCHECK_LE(volume, 1.5); |
254 #endif | 254 #endif |
255 | 255 |
256 int output_delay_ms = 0; | 256 int output_delay_ms = 0; |
257 { | 257 { |
258 base::AutoLock auto_lock(lock_); | 258 base::AutoLock auto_lock(lock_); |
259 // Store the reported audio delay locally. | 259 // Store the reported audio delay locally. |
260 input_delay_ms_ = audio_delay_milliseconds; | 260 input_delay_ms_ = audio_delay_milliseconds; |
261 output_delay_ms = output_delay_ms_; | 261 output_delay_ms = output_delay_ms_; |
262 } | 262 } |
263 | 263 |
264 const int channels = audio_data.size(); | 264 const int channels = audio_bus->channels(); |
265 DCHECK_LE(channels, input_channels()); | 265 DCHECK_LE(channels, input_channels()); |
266 uint32_t new_mic_level = 0; | 266 uint32_t new_mic_level = 0; |
267 | 267 |
268 // Interleave, scale, and clip input to int and store result in | 268 // Interleave, scale, and clip input to int and store result in |
269 // a local byte buffer. | 269 // a local byte buffer. |
270 media::InterleaveFloatToInt(audio_data, | 270 media::InterleaveFloatToInt(*audio_bus, |
271 input_buffer_.get(), | 271 input_buffer_.get(), |
272 number_of_frames, | 272 number_of_frames, |
273 input_audio_parameters_.bits_per_sample() / 8); | 273 input_audio_parameters_.bits_per_sample() / 8); |
274 | 274 |
275 int samples_per_sec = input_sample_rate(); | 275 int samples_per_sec = input_sample_rate(); |
276 if (samples_per_sec == 44100) { | 276 if (samples_per_sec == 44100) { |
277 // Even if the hardware runs at 44.1kHz, we use 44.0 internally. | 277 // Even if the hardware runs at 44.1kHz, we use 44.0 internally. |
278 samples_per_sec = 44000; | 278 samples_per_sec = 44000; |
279 } | 279 } |
280 const int samples_per_10_msec = (samples_per_sec / 100); | 280 const int samples_per_10_msec = (samples_per_sec / 100); |
(...skipping 887 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1168 } | 1168 } |
1169 | 1169 |
1170 int32_t WebRtcAudioDeviceImpl::GetLoudspeakerStatus(bool* enabled) const { | 1170 int32_t WebRtcAudioDeviceImpl::GetLoudspeakerStatus(bool* enabled) const { |
1171 NOTIMPLEMENTED(); | 1171 NOTIMPLEMENTED(); |
1172 return -1; | 1172 return -1; |
1173 } | 1173 } |
1174 | 1174 |
1175 void WebRtcAudioDeviceImpl::SetSessionId(int session_id) { | 1175 void WebRtcAudioDeviceImpl::SetSessionId(int session_id) { |
1176 session_id_ = session_id; | 1176 session_id_ = session_id; |
1177 } | 1177 } |
OLD | NEW |