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

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

Issue 11166002: Plumb render view ID from audio-related code in renderer through IPCs to AudioRendererHost in brows… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased. Created 8 years, 2 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 | Annotate | Revision Log
OLDNEW
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 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 // Report unexpected sample rates using a unique histogram name. 122 // Report unexpected sample rates using a unique histogram name.
123 if (dir == kAudioOutput) { 123 if (dir == kAudioOutput) {
124 UMA_HISTOGRAM_COUNTS("WebRTC.AudioOutputFramesPerBufferUnexpected", 124 UMA_HISTOGRAM_COUNTS("WebRTC.AudioOutputFramesPerBufferUnexpected",
125 param); 125 param);
126 } else { 126 } else {
127 UMA_HISTOGRAM_COUNTS("WebRTC.AudioInputFramesPerBufferUnexpected", param); 127 UMA_HISTOGRAM_COUNTS("WebRTC.AudioInputFramesPerBufferUnexpected", param);
128 } 128 }
129 } 129 }
130 } 130 }
131 131
132 WebRtcAudioDeviceImpl::WebRtcAudioDeviceImpl() 132 WebRtcAudioDeviceImpl::WebRtcAudioDeviceImpl(int render_view_id)
133 : ref_count_(0), 133 : ref_count_(0),
134 render_loop_(base::MessageLoopProxy::current()), 134 render_loop_(base::MessageLoopProxy::current()),
135 audio_transport_callback_(NULL), 135 audio_transport_callback_(NULL),
136 input_delay_ms_(0), 136 input_delay_ms_(0),
137 output_delay_ms_(0), 137 output_delay_ms_(0),
138 last_error_(AudioDeviceModule::kAdmErrNone), 138 last_error_(AudioDeviceModule::kAdmErrNone),
139 last_process_time_(base::TimeTicks::Now()), 139 last_process_time_(base::TimeTicks::Now()),
140 session_id_(0), 140 session_id_(0),
141 bytes_per_sample_(0), 141 bytes_per_sample_(0),
142 initialized_(false), 142 initialized_(false),
143 playing_(false), 143 playing_(false),
144 recording_(false), 144 recording_(false),
145 agc_is_enabled_(false) { 145 agc_is_enabled_(false) {
146 DVLOG(1) << "WebRtcAudioDeviceImpl::WebRtcAudioDeviceImpl()"; 146 DVLOG(1) << "WebRtcAudioDeviceImpl::WebRtcAudioDeviceImpl()";
147 // TODO(henrika): remove this restriction when factory is used for the 147 // TODO(henrika): remove this restriction when factory is used for the
148 // input side as well. 148 // input side as well.
149 DCHECK(RenderThreadImpl::current()) << 149 DCHECK(RenderThreadImpl::current()) <<
150 "WebRtcAudioDeviceImpl must be constructed on the render thread"; 150 "WebRtcAudioDeviceImpl must be constructed on the render thread";
151 audio_output_device_ = AudioDeviceFactory::NewOutputDevice(); 151 audio_input_device_ = AudioDeviceFactory::NewInputDevice(render_view_id);
152 DCHECK(audio_input_device_);
153 audio_output_device_ = AudioDeviceFactory::NewOutputDevice(render_view_id);
152 DCHECK(audio_output_device_); 154 DCHECK(audio_output_device_);
153 } 155 }
154 156
155 WebRtcAudioDeviceImpl::~WebRtcAudioDeviceImpl() { 157 WebRtcAudioDeviceImpl::~WebRtcAudioDeviceImpl() {
156 DVLOG(1) << "WebRtcAudioDeviceImpl::~WebRtcAudioDeviceImpl()"; 158 DVLOG(1) << "WebRtcAudioDeviceImpl::~WebRtcAudioDeviceImpl()";
157 if (playing_) 159 if (playing_)
158 StopPlayout(); 160 StopPlayout();
159 if (recording_) 161 if (recording_)
160 StopRecording(); 162 StopRecording();
161 if (initialized_) 163 if (initialized_)
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 base::Bind(&WebRtcAudioDeviceImpl::InitOnRenderThread, 403 base::Bind(&WebRtcAudioDeviceImpl::InitOnRenderThread,
402 this, &error, &event)); 404 this, &error, &event));
403 event.Wait(); 405 event.Wait();
404 return error; 406 return error;
405 } 407 }
406 408
407 // Calling Init() multiple times in a row is OK. 409 // Calling Init() multiple times in a row is OK.
408 if (initialized_) 410 if (initialized_)
409 return 0; 411 return 0;
410 412
411 DCHECK(!audio_input_device_);
412 DCHECK(!input_buffer_.get()); 413 DCHECK(!input_buffer_.get());
413 DCHECK(!output_buffer_.get()); 414 DCHECK(!output_buffer_.get());
414 415
415 // TODO(henrika): it could be possible to allow one of the directions (input 416 // TODO(henrika): it could be possible to allow one of the directions (input
416 // or output) to use a non-supported rate. As an example: if only the 417 // or output) to use a non-supported rate. As an example: if only the
417 // output rate is OK, we could finalize Init() and only set up an 418 // output rate is OK, we could finalize Init() and only set up an
418 // AudioOutputDevice. 419 // AudioOutputDevice.
419 420
420 // Ask the browser for the default audio output hardware sample-rate. 421 // Ask the browser for the default audio output hardware sample-rate.
421 // This request is based on a synchronous IPC message. 422 // This request is based on a synchronous IPC message.
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
565 // after a successful initialization. 566 // after a successful initialization.
566 output_audio_parameters_.Reset( 567 output_audio_parameters_.Reset(
567 AudioParameters::AUDIO_PCM_LOW_LATENCY, out_channel_layout, 568 AudioParameters::AUDIO_PCM_LOW_LATENCY, out_channel_layout,
568 out_sample_rate, 16, out_buffer_size); 569 out_sample_rate, 16, out_buffer_size);
569 570
570 input_audio_parameters_.Reset( 571 input_audio_parameters_.Reset(
571 in_format, in_channel_layout, in_sample_rate, 572 in_format, in_channel_layout, in_sample_rate,
572 16, in_buffer_size); 573 16, in_buffer_size);
573 574
574 // Create and configure the audio capturing client. 575 // Create and configure the audio capturing client.
575 audio_input_device_ = AudioDeviceFactory::NewInputDevice();
576 audio_input_device_->Initialize(input_audio_parameters_, this, this); 576 audio_input_device_->Initialize(input_audio_parameters_, this, this);
577 577
578 UMA_HISTOGRAM_ENUMERATION("WebRTC.AudioOutputChannelLayout", 578 UMA_HISTOGRAM_ENUMERATION("WebRTC.AudioOutputChannelLayout",
579 out_channel_layout, media::CHANNEL_LAYOUT_MAX); 579 out_channel_layout, media::CHANNEL_LAYOUT_MAX);
580 UMA_HISTOGRAM_ENUMERATION("WebRTC.AudioInputChannelLayout", 580 UMA_HISTOGRAM_ENUMERATION("WebRTC.AudioInputChannelLayout",
581 in_channel_layout, media::CHANNEL_LAYOUT_MAX); 581 in_channel_layout, media::CHANNEL_LAYOUT_MAX);
582 AddHistogramFramesPerBuffer(kAudioOutput, out_buffer_size); 582 AddHistogramFramesPerBuffer(kAudioOutput, out_buffer_size);
583 AddHistogramFramesPerBuffer(kAudioInput, in_buffer_size); 583 AddHistogramFramesPerBuffer(kAudioInput, in_buffer_size);
584 584
585 // Configure the audio rendering client. 585 // Configure the audio rendering client.
586 audio_output_device_->Initialize(output_audio_parameters_, this); 586 audio_output_device_->Initialize(output_audio_parameters_, this);
587 587
588 DCHECK(audio_input_device_);
589
590 // Allocate local audio buffers based on the parameters above. 588 // Allocate local audio buffers based on the parameters above.
591 // It is assumed that each audio sample contains 16 bits and each 589 // It is assumed that each audio sample contains 16 bits and each
592 // audio frame contains one or two audio samples depending on the 590 // audio frame contains one or two audio samples depending on the
593 // number of channels. 591 // number of channels.
594 input_buffer_.reset(new int16[input_buffer_size() * input_channels()]); 592 input_buffer_.reset(new int16[input_buffer_size() * input_channels()]);
595 output_buffer_.reset(new int16[output_buffer_size() * output_channels()]); 593 output_buffer_.reset(new int16[output_buffer_size() * output_channels()]);
596 594
597 DCHECK(input_buffer_.get()); 595 DCHECK(input_buffer_.get());
598 DCHECK(output_buffer_.get()); 596 DCHECK(output_buffer_.get());
599 597
(...skipping 17 matching lines...) Expand all
617 event->Signal(); 615 event->Signal();
618 } 616 }
619 617
620 int32_t WebRtcAudioDeviceImpl::Terminate() { 618 int32_t WebRtcAudioDeviceImpl::Terminate() {
621 DVLOG(1) << "Terminate()"; 619 DVLOG(1) << "Terminate()";
622 620
623 // Calling Terminate() multiple times in a row is OK. 621 // Calling Terminate() multiple times in a row is OK.
624 if (!initialized_) 622 if (!initialized_)
625 return 0; 623 return 0;
626 624
627 DCHECK(audio_input_device_);
628 DCHECK(input_buffer_.get()); 625 DCHECK(input_buffer_.get());
629 DCHECK(output_buffer_.get()); 626 DCHECK(output_buffer_.get());
630 627
631 // Release all resources allocated in Init(). 628 // Release all resources allocated in Init().
632 audio_input_device_ = NULL;
633 input_buffer_.reset(); 629 input_buffer_.reset();
634 output_buffer_.reset(); 630 output_buffer_.reset();
635 631
636 initialized_ = false; 632 initialized_ = false;
637 return 0; 633 return 0;
638 } 634 }
639 635
640 bool WebRtcAudioDeviceImpl::Initialized() const { 636 bool WebRtcAudioDeviceImpl::Initialized() const {
641 return initialized_; 637 return initialized_;
642 } 638 }
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after
1157 } 1153 }
1158 1154
1159 int32_t WebRtcAudioDeviceImpl::GetLoudspeakerStatus(bool* enabled) const { 1155 int32_t WebRtcAudioDeviceImpl::GetLoudspeakerStatus(bool* enabled) const {
1160 NOTIMPLEMENTED(); 1156 NOTIMPLEMENTED();
1161 return -1; 1157 return -1;
1162 } 1158 }
1163 1159
1164 void WebRtcAudioDeviceImpl::SetSessionId(int session_id) { 1160 void WebRtcAudioDeviceImpl::SetSessionId(int session_id) {
1165 session_id_ = session_id; 1161 session_id_ = session_id;
1166 } 1162 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698