webaudio_capturer_source.h revision 868fa2fe829687343ffae624259930155e16dbd8
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CONTENT_RENDERER_MEDIA_WEBAUDIO_CAPTURER_SOURCE_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CONTENT_RENDERER_MEDIA_WEBAUDIO_CAPTURER_SOURCE_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/synchronization/lock.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/audio/audio_parameters.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/audio_capturer_source.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/audio_fifo.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebAudioDestinationConsumer.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebVector.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebRtcAudioCapturer; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebAudioCapturerSource is the missing link between 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebAudio's MediaStreamAudioDestinationNode and WebRtcAudioCapturer. 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1. WebKit calls the setFormat() method setting up the basic stream format 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (channels, and sample-rate). At this time, it dispatches this information 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to the WebRtcAudioCapturer by calling its SetCapturerSource() method. 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 2. Initialize() is called, where we should get back the same 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// stream format information as (1). We also get the CaptureCallback here. 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 3. consumeAudio() is called periodically by WebKit which dispatches the 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// audio stream to the CaptureCallback::Capture() method. 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebAudioCapturerSource 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public media::AudioCapturerSource, 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public WebKit::WebAudioDestinationConsumer { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit WebAudioCapturerSource(WebRtcAudioCapturer* capturer); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WebAudioDestinationConsumer implementation. 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // setFormat() is called early on, so that we can configure the capturer. 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void setFormat(size_t number_of_channels, float sample_rate) OVERRIDE; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // MediaStreamAudioDestinationNode periodically calls consumeAudio(). 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void consumeAudio(const WebKit::WebVector<const float*>& audio_data, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t number_of_frames) OVERRIDE; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // AudioCapturerSource implementation. 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Initialize( 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const media::AudioParameters& params, 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media::AudioCapturerSource::CaptureCallback* callback, 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int session_id) OVERRIDE; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Start() OVERRIDE; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Stop() OVERRIDE; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetVolume(double volume) OVERRIDE { } 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetAutomaticGainControl(bool enable) OVERRIDE { } 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~WebAudioCapturerSource(); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRtcAudioCapturer* capturer_; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int set_format_channels_; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media::AudioParameters params_; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media::AudioCapturerSource::CaptureCallback* callback_; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wraps data coming from HandleCapture(). 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<media::AudioBus> wrapper_bus_; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Bus for reading from FIFO and calling the CaptureCallback. 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<media::AudioBus> capture_bus_; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Handles mismatch between WebAudio buffer size and WebRTC. 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<media::AudioFifo> fifo_; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Synchronizes HandleCapture() with AudioCapturerSource calls. 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Lock lock_; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool started_; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebAudioCapturerSource); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CONTENT_RENDERER_MEDIA_WEBAUDIO_CAPTURER_SOURCE_H_ 82