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

Unified Diff: content/renderer/media/webaudio_capturer_source.cc

Issue 11369171: Add chromium support for MediaStreamAudioDestinationNode (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: content/renderer/media/webaudio_capturer_source.cc
===================================================================
--- content/renderer/media/webaudio_capturer_source.cc (revision 0)
+++ content/renderer/media/webaudio_capturer_source.cc (revision 0)
@@ -0,0 +1,102 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/renderer/media/webaudio_capturer_source.h"
+
+#include "base/logging.h"
+#include "content/renderer/media/webrtc_audio_capturer.h"
+
+using media::AudioBus;
+using media::AudioFifo;
+using media::AudioParameters;
+using media::ChannelLayout;
+using media::CHANNEL_LAYOUT_MONO;
+using media::CHANNEL_LAYOUT_STEREO;
+
+static const int kFifoSize = 2048;
+
+namespace content {
+
+WebAudioCapturerSource::WebAudioCapturerSource(WebRtcAudioCapturer* capturer)
+ : capturer_(capturer),
+ set_format_channels_(0),
+ callback_(0),
+ started_(false) {
+}
+
+WebAudioCapturerSource::~WebAudioCapturerSource() {
+}
+
+void WebAudioCapturerSource::setFormat(
+ size_t number_of_channels, float sample_rate) {
+ if (number_of_channels <= 2) {
+ set_format_channels_ = number_of_channels;
+ ChannelLayout channel_layout =
+ number_of_channels == 1 ? CHANNEL_LAYOUT_MONO : CHANNEL_LAYOUT_STEREO;
+ capturer_->SetCapturerSource(this, channel_layout, sample_rate);
+ capturer_->Start();
+ } else {
+ // TODO(crogers): Handle more than just the mono and stereo cases.
+ LOG(WARNING) << "WebAudioCapturerSource::setFormat() : unhandled format.";
+ }
+}
+
+void WebAudioCapturerSource::Initialize(
+ const media::AudioParameters& params,
+ media::AudioCapturerSource::CaptureCallback* callback,
+ media::AudioCapturerSource::CaptureEventHandler* event_handler) {
+ // The downstream client should be configured the same as what WebKit
+ // is feeding it.
+ DCHECK_EQ(set_format_channels_, params.channels());
+
+ base::AutoLock auto_lock(lock_);
+ params_ = params;
+ callback_ = callback;
+ wrapper_bus_ = AudioBus::CreateWrapper(params.channels());
+ capture_bus_ = AudioBus::Create(params);
+ fifo_.reset(new AudioFifo(params.channels(), kFifoSize));
+}
+
+void WebAudioCapturerSource::Start() {
+ started_ = true;
+}
+
+void WebAudioCapturerSource::Stop() {
+ started_ = false;
+}
+
+void WebAudioCapturerSource::consumeAudio(
+ const WebKit::WebVector<const float*>& audio_data,
+ size_t number_of_frames) {
+ base::AutoLock auto_lock(lock_);
+
+ if (!callback_)
+ return;
+
+ wrapper_bus_->set_frames(number_of_frames);
+
+ // Make sure WebKit is honoring what it told us up front
+ // about the channels.
+ DCHECK_EQ(set_format_channels_, static_cast<int>(audio_data.size()));
+ DCHECK_EQ(set_format_channels_, wrapper_bus_->channels());
+
+ for (size_t i = 0; i < audio_data.size(); ++i)
+ wrapper_bus_->SetChannelData(i, const_cast<float*>(audio_data[i]));
+
+ // Handle mismatch between WebAudio buffer-size and WebRTC.
+ int available = fifo_->max_frames() - fifo_->frames();
+ if (available < static_cast<int>(number_of_frames)) {
+ LOG(ERROR) << "WebAudioCapturerSource::Consume() : FIFO overrun.";
+ return;
+ }
+
+ fifo_->Push(wrapper_bus_.get());
+ int capture_frames = params_.frames_per_buffer();
+ while (fifo_->frames() >= capture_frames) {
+ fifo_->Consume(capture_bus_.get(), 0, capture_frames);
+ callback_->Capture(capture_bus_.get(), 0, 1.0);
+ }
+}
+
+} // namespace content

Powered by Google App Engine
This is Rietveld 408576698