Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(439)

Side by Side Diff: content/renderer/media/webrtc_audio_device_impl.cc

Issue 187913002: Support the Aec dump for the APM in chrome (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/platform_file.h"
9 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
10 #include "base/win/windows_version.h" 11 #include "base/win/windows_version.h"
11 #include "content/renderer/media/webrtc_audio_capturer.h" 12 #include "content/renderer/media/webrtc_audio_capturer.h"
12 #include "content/renderer/media/webrtc_audio_renderer.h" 13 #include "content/renderer/media/webrtc_audio_renderer.h"
13 #include "content/renderer/render_thread_impl.h" 14 #include "content/renderer/render_thread_impl.h"
14 #include "media/audio/audio_parameters.h" 15 #include "media/audio/audio_parameters.h"
15 #include "media/audio/sample_rates.h" 16 #include "media/audio/sample_rates.h"
16 17
17 using media::AudioParameters; 18 using media::AudioParameters;
18 using media::ChannelLayout; 19 using media::ChannelLayout;
19 20
20 namespace content { 21 namespace content {
21 22
22 WebRtcAudioDeviceImpl::WebRtcAudioDeviceImpl() 23 WebRtcAudioDeviceImpl::WebRtcAudioDeviceImpl()
23 : ref_count_(0), 24 : ref_count_(0),
24 audio_transport_callback_(NULL), 25 audio_transport_callback_(NULL),
25 input_delay_ms_(0), 26 input_delay_ms_(0),
26 output_delay_ms_(0), 27 output_delay_ms_(0),
27 initialized_(false), 28 initialized_(false),
28 playing_(false), 29 playing_(false),
29 recording_(false), 30 recording_(false),
30 microphone_volume_(0) { 31 microphone_volume_(0),
32 aec_dump_file_(base::kInvalidPlatformFileValue) {
31 DVLOG(1) << "WebRtcAudioDeviceImpl::WebRtcAudioDeviceImpl()"; 33 DVLOG(1) << "WebRtcAudioDeviceImpl::WebRtcAudioDeviceImpl()";
32 } 34 }
33 35
34 WebRtcAudioDeviceImpl::~WebRtcAudioDeviceImpl() { 36 WebRtcAudioDeviceImpl::~WebRtcAudioDeviceImpl() {
35 DVLOG(1) << "WebRtcAudioDeviceImpl::~WebRtcAudioDeviceImpl()"; 37 DVLOG(1) << "WebRtcAudioDeviceImpl::~WebRtcAudioDeviceImpl()";
36 DCHECK(thread_checker_.CalledOnValidThread()); 38 DCHECK(thread_checker_.CalledOnValidThread());
37 Terminate(); 39 Terminate();
38 } 40 }
39 41
40 int32_t WebRtcAudioDeviceImpl::AddRef() { 42 int32_t WebRtcAudioDeviceImpl::AddRef() {
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 // Calling Terminate() multiple times in a row is OK. 209 // Calling Terminate() multiple times in a row is OK.
208 if (!initialized_) 210 if (!initialized_)
209 return 0; 211 return 0;
210 212
211 StopRecording(); 213 StopRecording();
212 StopPlayout(); 214 StopPlayout();
213 215
214 DCHECK(!renderer_.get() || !renderer_->IsStarted()) 216 DCHECK(!renderer_.get() || !renderer_->IsStarted())
215 << "The shared audio renderer shouldn't be running"; 217 << "The shared audio renderer shouldn't be running";
216 218
219 DisableAecDump();
220
217 capturers_.clear(); 221 capturers_.clear();
218 222
219 initialized_ = false; 223 initialized_ = false;
220 return 0; 224 return 0;
221 } 225 }
222 226
223 bool WebRtcAudioDeviceImpl::Initialized() const { 227 bool WebRtcAudioDeviceImpl::Initialized() const {
224 return initialized_; 228 return initialized_;
225 } 229 }
226 230
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 renderer_ = renderer; 422 renderer_ = renderer;
419 return true; 423 return true;
420 } 424 }
421 425
422 void WebRtcAudioDeviceImpl::AddAudioCapturer( 426 void WebRtcAudioDeviceImpl::AddAudioCapturer(
423 const scoped_refptr<WebRtcAudioCapturer>& capturer) { 427 const scoped_refptr<WebRtcAudioCapturer>& capturer) {
424 DVLOG(1) << "WebRtcAudioDeviceImpl::AddAudioCapturer()"; 428 DVLOG(1) << "WebRtcAudioDeviceImpl::AddAudioCapturer()";
425 DCHECK(thread_checker_.CalledOnValidThread()); 429 DCHECK(thread_checker_.CalledOnValidThread());
426 DCHECK(capturer.get()); 430 DCHECK(capturer.get());
427 DCHECK(!capturer->device_id().empty()); 431 DCHECK(!capturer->device_id().empty());
428 base::AutoLock auto_lock(lock_); 432 {
429 DCHECK(std::find(capturers_.begin(), capturers_.end(), capturer) == 433 base::AutoLock auto_lock(lock_);
430 capturers_.end()); 434 DCHECK(std::find(capturers_.begin(), capturers_.end(), capturer) ==
431 capturers_.push_back(capturer); 435 capturers_.end());
436 capturers_.push_back(capturer);
437 }
438
439 // The default capturer might have been changed, call StartAecDump() to start
440 // the Aec dump on the new default capturer in case Aec dump has been enabled.
441 StartAecDump();
432 } 442 }
433 443
434 void WebRtcAudioDeviceImpl::RemoveAudioCapturer( 444 void WebRtcAudioDeviceImpl::RemoveAudioCapturer(
435 const scoped_refptr<WebRtcAudioCapturer>& capturer) { 445 const scoped_refptr<WebRtcAudioCapturer>& capturer) {
436 DVLOG(1) << "WebRtcAudioDeviceImpl::AddAudioCapturer()"; 446 DVLOG(1) << "WebRtcAudioDeviceImpl::AddAudioCapturer()";
437 DCHECK(thread_checker_.CalledOnValidThread()); 447 DCHECK(thread_checker_.CalledOnValidThread());
438 DCHECK(capturer.get()); 448 DCHECK(capturer.get());
439 base::AutoLock auto_lock(lock_); 449 {
440 capturers_.remove(capturer); 450 base::AutoLock auto_lock(lock_);
451 capturers_.remove(capturer);
452 }
453
454 // The default capturer might have been changed, call StartAecDump() to start
455 // the Aec dump on the new default capturer in case Aec dump has been enabled.
456 StartAecDump();
Henrik Grunell 2014/03/06 10:12:20 Hmm, we re-use |aec_dump_file_| but that likely wo
no longer working on chromium 2014/03/06 18:57:21 Done.
441 } 457 }
442 458
443 scoped_refptr<WebRtcAudioCapturer> 459 scoped_refptr<WebRtcAudioCapturer>
444 WebRtcAudioDeviceImpl::GetDefaultCapturer() const { 460 WebRtcAudioDeviceImpl::GetDefaultCapturer() const {
445 base::AutoLock auto_lock(lock_); 461 base::AutoLock auto_lock(lock_);
446 // Use the last |capturer| which is from the latest getUserMedia call as 462 // Use the last |capturer| which is from the latest getUserMedia call as
447 // the default capture device. 463 // the default capture device.
448 for (CapturerList::const_reverse_iterator iter = capturers_.rbegin(); 464 for (CapturerList::const_reverse_iterator iter = capturers_.rbegin();
449 iter != capturers_.rend(); ++iter) { 465 iter != capturers_.rend(); ++iter) {
450 return *iter; 466 return *iter;
(...skipping 27 matching lines...) Expand all
478 DCHECK(thread_checker_.CalledOnValidThread()); 494 DCHECK(thread_checker_.CalledOnValidThread());
479 // If there is no capturer or there are more than one open capture devices, 495 // If there is no capturer or there are more than one open capture devices,
480 // return false. 496 // return false.
481 if (capturers_.empty() || capturers_.size() > 1) 497 if (capturers_.empty() || capturers_.size() > 1)
482 return false; 498 return false;
483 499
484 return GetDefaultCapturer()->GetPairedOutputParameters( 500 return GetDefaultCapturer()->GetPairedOutputParameters(
485 session_id, output_sample_rate, output_frames_per_buffer); 501 session_id, output_sample_rate, output_frames_per_buffer);
486 } 502 }
487 503
504 void WebRtcAudioDeviceImpl::EnableAecDump(
505 IPC::PlatformFileForTransit file_handle) {
506 DCHECK(thread_checker_.CalledOnValidThread());
507 DCHECK_EQ(aec_dump_file_, base::kInvalidPlatformFileValue);
508 aec_dump_file_ = IPC::PlatformFileForTransitToPlatformFile(file_handle);
509 DCHECK_NE(aec_dump_file_, base::kInvalidPlatformFileValue);
510 StartAecDump();
511 }
512
513 void WebRtcAudioDeviceImpl::DisableAecDump() {
514 DCHECK(thread_checker_.CalledOnValidThread());
515 if (aec_dump_file_ == base::kInvalidPlatformFileValue)
516 return;
517
518 StopAecDump();
519 base::ClosePlatformFile(aec_dump_file_);
520 aec_dump_file_ = base::kInvalidPlatformFileValue;
521 }
522
523 void WebRtcAudioDeviceImpl::StartAecDump() {
524 DCHECK(thread_checker_.CalledOnValidThread());
525 if (aec_dump_file_ == base::kInvalidPlatformFileValue)
526 return;
527
528 scoped_refptr<WebRtcAudioCapturer> default_capturer(GetDefaultCapturer());
529 if (!default_capturer)
530 return;
531
532 // We support Aec dump on only one APM. Loop through all the non-default
533 // capturers and call StopAecDump().
534 for (CapturerList::const_iterator iter = capturers_.begin();
535 iter != capturers_.end(); ++iter) {
536 if (*iter != default_capturer)
537 (*iter)->StopAecDump();
538 }
539
540 // Start the Aec dump on the default capturer.
541 default_capturer->StartAecDump(aec_dump_file_);
542 }
543
544 void WebRtcAudioDeviceImpl::StopAecDump() {
545 DCHECK(thread_checker_.CalledOnValidThread());
546 // Only the default capturer can have the Aec dump.
547 scoped_refptr<WebRtcAudioCapturer> default_capturer(GetDefaultCapturer());
548 if (default_capturer)
549 default_capturer->StopAecDump();
550 }
551
488 } // namespace content 552 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698