OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
10 #include "base/win/windows_version.h" | 10 #include "base/win/windows_version.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 audio_transport_callback_(NULL), | 25 audio_transport_callback_(NULL), |
26 input_delay_ms_(0), | 26 input_delay_ms_(0), |
27 output_delay_ms_(0), | 27 output_delay_ms_(0), |
28 initialized_(false), | 28 initialized_(false), |
29 playing_(false), | 29 playing_(false), |
30 recording_(false), | 30 recording_(false), |
31 microphone_volume_(0), | 31 microphone_volume_(0), |
32 is_audio_track_processing_enabled_( | 32 is_audio_track_processing_enabled_( |
33 MediaStreamAudioProcessor::IsAudioTrackProcessingEnabled()) { | 33 MediaStreamAudioProcessor::IsAudioTrackProcessingEnabled()) { |
34 DVLOG(1) << "WebRtcAudioDeviceImpl::WebRtcAudioDeviceImpl()"; | 34 DVLOG(1) << "WebRtcAudioDeviceImpl::WebRtcAudioDeviceImpl()"; |
35 // TODO(tommi): This object can be constructed on either the signaling thread | 35 // This object can be constructed on either the signaling thread or the main |
36 // or the main thread. As is, those threads are one and the same so we don't | 36 // thread, so we need to detach these thread checkers here and have them |
37 // detach either thread checkers, but once they're separate, we need to detach | 37 // initialize automatically when the first methods are called. |
38 // here: | 38 signaling_thread_checker_.DetachFromThread(); |
39 // signaling_thread_checker_.DetachFromThread(); | 39 main_thread_checker_.DetachFromThread(); |
40 // main_thread_checker_.DetachFromThread(); | |
41 | 40 |
42 worker_thread_checker_.DetachFromThread(); | 41 worker_thread_checker_.DetachFromThread(); |
43 } | 42 } |
44 | 43 |
45 WebRtcAudioDeviceImpl::~WebRtcAudioDeviceImpl() { | 44 WebRtcAudioDeviceImpl::~WebRtcAudioDeviceImpl() { |
46 DVLOG(1) << "WebRtcAudioDeviceImpl::~WebRtcAudioDeviceImpl()"; | 45 DVLOG(1) << "WebRtcAudioDeviceImpl::~WebRtcAudioDeviceImpl()"; |
47 DCHECK(main_thread_checker_.CalledOnValidThread()); | 46 DCHECK(main_thread_checker_.CalledOnValidThread()); |
48 Terminate(); | 47 Terminate(); |
49 } | 48 } |
50 | 49 |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 // initialize worker_thread_checker_ on the signaling thread. | 366 // initialize worker_thread_checker_ on the signaling thread. |
368 DCHECK(signaling_thread_checker_.CalledOnValidThread() || | 367 DCHECK(signaling_thread_checker_.CalledOnValidThread() || |
369 worker_thread_checker_.CalledOnValidThread()); | 368 worker_thread_checker_.CalledOnValidThread()); |
370 | 369 |
371 base::AutoLock auto_lock(lock_); | 370 base::AutoLock auto_lock(lock_); |
372 recording_ = false; | 371 recording_ = false; |
373 return 0; | 372 return 0; |
374 } | 373 } |
375 | 374 |
376 bool WebRtcAudioDeviceImpl::Recording() const { | 375 bool WebRtcAudioDeviceImpl::Recording() const { |
377 DCHECK(!main_thread_checker_.CalledOnValidThread()); | |
378 DCHECK(!signaling_thread_checker_.CalledOnValidThread()); | |
379 DCHECK(worker_thread_checker_.CalledOnValidThread()); | 376 DCHECK(worker_thread_checker_.CalledOnValidThread()); |
380 base::AutoLock auto_lock(lock_); | 377 base::AutoLock auto_lock(lock_); |
381 return recording_; | 378 return recording_; |
382 } | 379 } |
383 | 380 |
384 int32_t WebRtcAudioDeviceImpl::SetMicrophoneVolume(uint32_t volume) { | 381 int32_t WebRtcAudioDeviceImpl::SetMicrophoneVolume(uint32_t volume) { |
385 DVLOG(1) << "WebRtcAudioDeviceImpl::SetMicrophoneVolume(" << volume << ")"; | 382 DVLOG(1) << "WebRtcAudioDeviceImpl::SetMicrophoneVolume(" << volume << ")"; |
386 DCHECK(signaling_thread_checker_.CalledOnValidThread()); | 383 DCHECK(signaling_thread_checker_.CalledOnValidThread()); |
387 DCHECK(initialized_); | 384 DCHECK(initialized_); |
388 | 385 |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
513 base::AutoLock auto_lock(lock_); | 510 base::AutoLock auto_lock(lock_); |
514 DCHECK(std::find(capturers_.begin(), capturers_.end(), capturer) == | 511 DCHECK(std::find(capturers_.begin(), capturers_.end(), capturer) == |
515 capturers_.end()); | 512 capturers_.end()); |
516 capturers_.push_back(capturer); | 513 capturers_.push_back(capturer); |
517 } | 514 } |
518 | 515 |
519 void WebRtcAudioDeviceImpl::RemoveAudioCapturer( | 516 void WebRtcAudioDeviceImpl::RemoveAudioCapturer( |
520 const scoped_refptr<WebRtcAudioCapturer>& capturer) { | 517 const scoped_refptr<WebRtcAudioCapturer>& capturer) { |
521 DCHECK(main_thread_checker_.CalledOnValidThread()); | 518 DCHECK(main_thread_checker_.CalledOnValidThread()); |
522 DVLOG(1) << "WebRtcAudioDeviceImpl::AddAudioCapturer()"; | 519 DVLOG(1) << "WebRtcAudioDeviceImpl::AddAudioCapturer()"; |
523 // Called on the main render thread. | |
524 DCHECK(capturer.get()); | 520 DCHECK(capturer.get()); |
525 base::AutoLock auto_lock(lock_); | 521 base::AutoLock auto_lock(lock_); |
526 capturers_.remove(capturer); | 522 capturers_.remove(capturer); |
527 } | 523 } |
528 | 524 |
529 scoped_refptr<WebRtcAudioCapturer> | 525 scoped_refptr<WebRtcAudioCapturer> |
530 WebRtcAudioDeviceImpl::GetDefaultCapturer() const { | 526 WebRtcAudioDeviceImpl::GetDefaultCapturer() const { |
531 // Called on either the signaling thread (during initialization) or worker | 527 // Called on the signaling thread (during initialization), worker |
532 // thread during capture. | 528 // thread during capture or main thread for a WebAudio source. |
| 529 // We can't DCHECK on those three checks here since GetDefaultCapturer |
| 530 // may be the first call and therefore could incorrectly initialize the |
| 531 // thread checkers. |
533 DCHECK(initialized_); | 532 DCHECK(initialized_); |
534 DCHECK(signaling_thread_checker_.CalledOnValidThread() || | |
535 worker_thread_checker_.CalledOnValidThread()); | |
536 base::AutoLock auto_lock(lock_); | 533 base::AutoLock auto_lock(lock_); |
537 // Use the last |capturer| which is from the latest getUserMedia call as | 534 // Use the last |capturer| which is from the latest getUserMedia call as |
538 // the default capture device. | 535 // the default capture device. |
539 return capturers_.empty() ? NULL : capturers_.back(); | 536 return capturers_.empty() ? NULL : capturers_.back(); |
540 } | 537 } |
541 | 538 |
542 void WebRtcAudioDeviceImpl::AddPlayoutSink( | 539 void WebRtcAudioDeviceImpl::AddPlayoutSink( |
543 WebRtcPlayoutDataSource::Sink* sink) { | 540 WebRtcPlayoutDataSource::Sink* sink) { |
544 DCHECK(main_thread_checker_.CalledOnValidThread()); | 541 DCHECK(main_thread_checker_.CalledOnValidThread()); |
545 DCHECK(sink); | 542 DCHECK(sink); |
(...skipping 20 matching lines...) Expand all Loading... |
566 // If there is no capturer or there are more than one open capture devices, | 563 // If there is no capturer or there are more than one open capture devices, |
567 // return false. | 564 // return false. |
568 if (capturers_.size() != 1) | 565 if (capturers_.size() != 1) |
569 return false; | 566 return false; |
570 | 567 |
571 return capturers_.back()->GetPairedOutputParameters( | 568 return capturers_.back()->GetPairedOutputParameters( |
572 session_id, output_sample_rate, output_frames_per_buffer); | 569 session_id, output_sample_rate, output_frames_per_buffer); |
573 } | 570 } |
574 | 571 |
575 } // namespace content | 572 } // namespace content |
OLD | NEW |