Index: content/renderer/media/renderer_webaudiodevice_impl.cc |
=================================================================== |
--- content/renderer/media/renderer_webaudiodevice_impl.cc (revision 156123) |
+++ content/renderer/media/renderer_webaudiodevice_impl.cc (working copy) |
@@ -4,8 +4,10 @@ |
#include "content/renderer/media/renderer_webaudiodevice_impl.h" |
+#include "base/command_line.h" |
#include "base/logging.h" |
#include "content/renderer/media/audio_device_factory.h" |
+#include "media/base/media_switches.h" |
using content::AudioDeviceFactory; |
using WebKit::WebAudioDevice; |
@@ -17,7 +19,17 @@ |
: is_running_(false), |
client_callback_(callback) { |
audio_device_ = AudioDeviceFactory::NewOutputDevice(); |
- audio_device_->Initialize(params, this); |
+ |
+ // TODO(crogers): remove once we properly handle input device selection. |
+ // https://code.google.com/p/chromium/issues/detail?id=147327 |
+ if (CommandLine::ForCurrentProcess()->HasSwitch( |
+ 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); |
+ } else { |
+ audio_device_->Initialize(params, this); |
+ } |
} |
RendererWebAudioDeviceImpl::~RendererWebAudioDeviceImpl() { |
@@ -42,20 +54,35 @@ |
return 44100.0; |
} |
-int RendererWebAudioDeviceImpl::Render(media::AudioBus* audio_bus, |
+int RendererWebAudioDeviceImpl::Render(media::AudioBus* dest, |
int audio_delay_milliseconds) { |
- // Make the client callback to get rendered audio. |
+ RenderIO(NULL, dest, audio_delay_milliseconds); |
+ return dest->frames(); |
+} |
+ |
+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 pointers using WebVector. |
+ // Wrap the input pointers using WebVector. |
+ size_t input_channels = |
+ source ? static_cast<size_t>(source->channels()) : 0; |
+ WebVector<float*> web_audio_input_data(input_channels); |
+ for (size_t i = 0; i < input_channels; ++i) |
+ web_audio_input_data[i] = source->channel(i); |
+ |
+ // Wrap the output pointers using WebVector. |
WebVector<float*> web_audio_data( |
- static_cast<size_t>(audio_bus->channels())); |
- for (int i = 0; i < audio_bus->channels(); ++i) |
- web_audio_data[i] = audio_bus->channel(i); |
+ static_cast<size_t>(dest->channels())); |
+ for (int i = 0; i < dest->channels(); ++i) |
+ web_audio_data[i] = dest->channel(i); |
- client_callback_->render(web_audio_data, audio_bus->frames()); |
+ client_callback_->render(web_audio_input_data, |
+ web_audio_data, |
+ dest->frames()); |
} |
- return audio_bus->frames(); |
} |
void RendererWebAudioDeviceImpl::OnRenderError() { |