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/processed_local_audio_source.h" | 5 #include "content/renderer/media/webrtc/processed_local_audio_source.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/metrics/histogram_macros.h" | 8 #include "base/metrics/histogram_macros.h" |
9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
10 #include "content/renderer/media/audio_device_factory.h" | 10 #include "content/renderer/media/audio_device_factory.h" |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
194 new_source->SetAutomaticGainControl(true); | 194 new_source->SetAutomaticGainControl(true); |
195 { | 195 { |
196 base::AutoLock auto_lock(source_lock_); | 196 base::AutoLock auto_lock(source_lock_); |
197 source_ = std::move(new_source); | 197 source_ = std::move(new_source); |
198 } | 198 } |
199 source_->Start(); | 199 source_->Start(); |
200 | 200 |
201 // Register this source with the WebRtcAudioDeviceImpl. | 201 // Register this source with the WebRtcAudioDeviceImpl. |
202 rtc_audio_device->AddAudioCapturer(this); | 202 rtc_audio_device->AddAudioCapturer(this); |
203 | 203 |
204 // Start detecting no callbacks. | |
205 base::subtle::Release_Store(&input_callback_is_active_, false); | |
206 last_callback_time_ = base::TimeTicks::Now(); | |
207 check_alive_timer_.Start( | |
208 FROM_HERE, base::TimeDelta::FromSeconds(5), | |
209 this, &ProcessedLocalAudioSource::CheckIfInputStreamIsAlive); | |
210 DCHECK(check_alive_timer_.IsRunning()); | |
211 | |
204 return true; | 212 return true; |
205 } | 213 } |
206 | 214 |
207 void ProcessedLocalAudioSource::EnsureSourceIsStopped() { | 215 void ProcessedLocalAudioSource::EnsureSourceIsStopped() { |
208 DCHECK(thread_checker_.CalledOnValidThread()); | 216 DCHECK(thread_checker_.CalledOnValidThread()); |
209 | 217 |
218 check_alive_timer_.Stop(); | |
219 DCHECK(!check_alive_timer_.IsRunning()); | |
220 | |
210 scoped_refptr<media::AudioCapturerSource> source_to_stop; | 221 scoped_refptr<media::AudioCapturerSource> source_to_stop; |
211 { | 222 { |
212 base::AutoLock auto_lock(source_lock_); | 223 base::AutoLock auto_lock(source_lock_); |
213 if (!source_) | 224 if (!source_) |
214 return; | 225 return; |
215 source_to_stop = std::move(source_); | 226 source_to_stop = std::move(source_); |
216 } | 227 } |
217 | 228 |
218 if (WebRtcAudioDeviceImpl* rtc_audio_device = | 229 if (WebRtcAudioDeviceImpl* rtc_audio_device = |
219 pc_factory_->GetWebRtcAudioDevice()) { | 230 pc_factory_->GetWebRtcAudioDevice()) { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
260 } | 271 } |
261 | 272 |
262 void ProcessedLocalAudioSource::OnCaptureStarted() { | 273 void ProcessedLocalAudioSource::OnCaptureStarted() { |
263 started_callback_.Run(this, MEDIA_DEVICE_OK, ""); | 274 started_callback_.Run(this, MEDIA_DEVICE_OK, ""); |
264 } | 275 } |
265 | 276 |
266 void ProcessedLocalAudioSource::Capture(const media::AudioBus* audio_bus, | 277 void ProcessedLocalAudioSource::Capture(const media::AudioBus* audio_bus, |
267 int audio_delay_milliseconds, | 278 int audio_delay_milliseconds, |
268 double volume, | 279 double volume, |
269 bool key_pressed) { | 280 bool key_pressed) { |
281 base::subtle::Release_Store(&input_callback_is_active_, true); | |
ossu-chromium
2017/05/18 13:38:54
Perhaps just store last_callback_time_ atomically?
Henrik Grunell
2017/05/19 06:00:00
Yeah, this is going away. The CL is not ready for
| |
282 // TODO: Post task. | |
283 last_callback_time_ = base::TimeTicks::Now(); | |
284 | |
270 #if defined(OS_WIN) || defined(OS_MACOSX) | 285 #if defined(OS_WIN) || defined(OS_MACOSX) |
271 DCHECK_LE(volume, 1.0); | 286 DCHECK_LE(volume, 1.0); |
272 #elif (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_OPENBSD) | 287 #elif (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_OPENBSD) |
273 // We have a special situation on Linux where the microphone volume can be | 288 // We have a special situation on Linux where the microphone volume can be |
274 // "higher than maximum". The input volume slider in the sound preference | 289 // "higher than maximum". The input volume slider in the sound preference |
275 // allows the user to set a scaling that is higher than 100%. It means that | 290 // allows the user to set a scaling that is higher than 100%. It means that |
276 // even if the reported maximum levels is N, the actual microphone level can | 291 // even if the reported maximum levels is N, the actual microphone level can |
277 // go up to 1.5x*N and that corresponds to a normalized |volume| of 1.5x. | 292 // go up to 1.5x*N and that corresponds to a normalized |volume| of 1.5x. |
278 DCHECK_LE(volume, 1.6); | 293 DCHECK_LE(volume, 1.6); |
279 #endif | 294 #endif |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
366 return hardware_buffer_size; | 381 return hardware_buffer_size; |
367 | 382 |
368 // If the buffer size is missing from the StreamDeviceInfo, provide 10ms as a | 383 // If the buffer size is missing from the StreamDeviceInfo, provide 10ms as a |
369 // fall-back. | 384 // fall-back. |
370 // | 385 // |
371 // TODO(miu): Identify where/why the buffer size might be missing, fix the | 386 // TODO(miu): Identify where/why the buffer size might be missing, fix the |
372 // code, and then require it here. http://crbug.com/638081 | 387 // code, and then require it here. http://crbug.com/638081 |
373 return (sample_rate / 100); | 388 return (sample_rate / 100); |
374 } | 389 } |
375 | 390 |
391 void ProcessedLocalAudioSource::CheckIfInputStreamIsAlive() { | |
392 DCHECK(thread_checker_.CalledOnValidThread()); | |
393 | |
394 // bool active = base::subtle::Acquire_Load(&input_callback_is_active_); | |
395 base::TimeDelta time_since_last_callback = | |
396 base::TimeTicks::Now() - last_callback_time_; | |
397 if (time_since_last_callback > base::TimeDelta::FromSeconds(5)) { | |
398 // if (!active) { | |
399 LOG(ERROR) << "********** Detected missing callbacks. Stopping."; | |
400 StopSourceOnError("Detected missing callbacks."); | |
401 } | |
402 } | |
403 | |
376 } // namespace content | 404 } // namespace content |
OLD | NEW |