Chromium Code Reviews| Index: content/renderer/media/renderer_webaudiodevice_impl.cc |
| diff --git a/content/renderer/media/renderer_webaudiodevice_impl.cc b/content/renderer/media/renderer_webaudiodevice_impl.cc |
| index 4c72e8ca65b3631bd80edc93927ba4bef49519a1..6fe3e961da8cfc18bd83d9c15c3bb0d4514484e4 100644 |
| --- a/content/renderer/media/renderer_webaudiodevice_impl.cc |
| +++ b/content/renderer/media/renderer_webaudiodevice_impl.cc |
| @@ -7,19 +7,38 @@ |
| #include "base/command_line.h" |
| #include "base/logging.h" |
| #include "content/renderer/media/audio_device_factory.h" |
| +#include "content/renderer/media/renderer_audio_output_device.h" |
| +#include "content/renderer/render_view_impl.h" |
| #include "media/base/media_switches.h" |
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
| using WebKit::WebAudioDevice; |
| +using WebKit::WebFrame; |
| using WebKit::WebVector; |
| +using WebKit::WebView; |
| namespace content { |
| RendererWebAudioDeviceImpl::RendererWebAudioDeviceImpl( |
| const media::AudioParameters& params, |
| WebAudioDevice::RenderCallback* callback) |
| - : is_running_(false), |
| + : params_(params), |
| client_callback_(callback) { |
| - audio_device_ = AudioDeviceFactory::NewOutputDevice(); |
| + DCHECK(client_callback_); |
| +} |
| + |
| +RendererWebAudioDeviceImpl::~RendererWebAudioDeviceImpl() { |
| + DCHECK(!output_device_); |
| +} |
| + |
| +void RendererWebAudioDeviceImpl::start() { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + |
| + if (output_device_) |
| + return; // Already started. |
| + |
| + output_device_ = AudioDeviceFactory::NewOutputDevice(); |
| // TODO(crogers): remove once we properly handle input device selection. |
| // https://code.google.com/p/chromium/issues/detail?id=147327 |
| @@ -27,32 +46,43 @@ RendererWebAudioDeviceImpl::RendererWebAudioDeviceImpl( |
| switches::kEnableWebAudioInput)) { |
| // TODO(crogers): support more than hard-coded stereo: |
| // https://code.google.com/p/chromium/issues/detail?id=147326 |
| - audio_device_->InitializeIO(params, 2, this); |
| + output_device_->InitializeIO(params_, 2, this); |
| } else { |
| - audio_device_->Initialize(params, this); |
| + output_device_->Initialize(params_, this); |
| } |
| -} |
| -RendererWebAudioDeviceImpl::~RendererWebAudioDeviceImpl() { |
| - stop(); |
| -} |
| - |
| -void RendererWebAudioDeviceImpl::start() { |
| - if (!is_running_) { |
| - audio_device_->Start(); |
| - is_running_ = true; |
| + // Assumption: This method is being invoked within a V8 call stack. CHECKs |
| + // will fail in the call to frameForCurrentContext() otherwise. |
| + // |
| + // Therefore, we can perform look-ups to determine which RenderView is |
| + // starting the audio device. The reason for all this is because the creator |
| + // of the WebAudio objects might not be the actual source of the audio (e.g., |
| + // an extension creates a object that is passed and used within a page). |
| + WebFrame* const web_frame = WebFrame::frameForCurrentContext(); |
| + WebView* const web_view = web_frame ? web_frame->view() : NULL; |
| + RenderViewImpl* const render_view = |
| + web_view ? RenderViewImpl::FromWebView(web_view) : NULL; |
| + if (render_view) { |
| + output_device_->SetSourceRenderView(render_view->routing_id()); |
| } |
| + |
| + output_device_->Start(); |
| + // Note: Default behavior is to auto-play on start. |
| } |
| void RendererWebAudioDeviceImpl::stop() { |
| - if (is_running_) { |
| - audio_device_->Stop(); |
| - is_running_ = false; |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + |
| + if (output_device_) { |
| + output_device_->Stop(); |
| + output_device_ = NULL; |
| } |
| } |
| double RendererWebAudioDeviceImpl::sampleRate() { |
| - return 44100.0; |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
|
Chris Rogers
2012/12/03 20:50:11
I would remove this DCHECK since params_ should be
miu
2012/12/03 22:39:14
Done.
|
| + |
| + return params_.sample_rate(); |
| } |
| int RendererWebAudioDeviceImpl::Render(media::AudioBus* dest, |
| @@ -65,7 +95,6 @@ void RendererWebAudioDeviceImpl::RenderIO(media::AudioBus* source, |
| media::AudioBus* dest, |
| int audio_delay_milliseconds) { |
| // Make the client callback for an I/O cycle. |
| - DCHECK(client_callback_); |
| if (client_callback_) { |
| // Wrap the input pointers using WebVector. |
| size_t input_channels = |