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 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_RENDERER_MEDIA_WEBAUDIO_CAPTURER_SOURCE_H_ 6 #define CONTENT_RENDERER_MEDIA_WEBAUDIO_CAPTURER_SOURCE_H_ 7 8 #include "base/memory/ref_counted.h" 9 #include "base/synchronization/lock.h" 10 #include "media/audio/audio_parameters.h" 11 #include "media/base/audio_capturer_source.h" 12 #include "media/base/audio_fifo.h" 13 #include "third_party/WebKit/public/platform/WebAudioDestinationConsumer.h" 14 #include "third_party/WebKit/public/platform/WebVector.h" 15 16 namespace content { 17 18 class WebRtcAudioCapturer; 19 20 // WebAudioCapturerSource is the missing link between 21 // WebAudio's MediaStreamAudioDestinationNode and WebRtcAudioCapturer. 22 // 23 // 1. WebKit calls the setFormat() method setting up the basic stream format 24 // (channels, and sample-rate). At this time, it dispatches this information 25 // to the WebRtcAudioCapturer by calling its SetCapturerSource() method. 26 // 2. Initialize() is called, where we should get back the same 27 // stream format information as (1). We also get the CaptureCallback here. 28 // 3. consumeAudio() is called periodically by WebKit which dispatches the 29 // audio stream to the CaptureCallback::Capture() method. 30 class WebAudioCapturerSource 31 : public media::AudioCapturerSource, 32 public WebKit::WebAudioDestinationConsumer { 33 public: 34 explicit WebAudioCapturerSource(WebRtcAudioCapturer* capturer); 35 36 // WebAudioDestinationConsumer implementation. 37 // setFormat() is called early on, so that we can configure the capturer. 38 virtual void setFormat(size_t number_of_channels, float sample_rate) OVERRIDE; 39 // MediaStreamAudioDestinationNode periodically calls consumeAudio(). 40 virtual void consumeAudio(const WebKit::WebVector<const float*>& audio_data, 41 size_t number_of_frames) OVERRIDE; 42 43 // AudioCapturerSource implementation. 44 virtual void Initialize( 45 const media::AudioParameters& params, 46 media::AudioCapturerSource::CaptureCallback* callback, 47 int session_id) OVERRIDE; 48 49 virtual void Start() OVERRIDE; 50 virtual void Stop() OVERRIDE; 51 virtual void SetVolume(double volume) OVERRIDE { } 52 virtual void SetAutomaticGainControl(bool enable) OVERRIDE { } 53 54 private: 55 virtual ~WebAudioCapturerSource(); 56 57 WebRtcAudioCapturer* capturer_; 58 59 int set_format_channels_; 60 media::AudioParameters params_; 61 media::AudioCapturerSource::CaptureCallback* callback_; 62 63 // Wraps data coming from HandleCapture(). 64 scoped_ptr<media::AudioBus> wrapper_bus_; 65 66 // Bus for reading from FIFO and calling the CaptureCallback. 67 scoped_ptr<media::AudioBus> capture_bus_; 68 69 // Handles mismatch between WebAudio buffer size and WebRTC. 70 scoped_ptr<media::AudioFifo> fifo_; 71 72 // Synchronizes HandleCapture() with AudioCapturerSource calls. 73 base::Lock lock_; 74 bool started_; 75 76 DISALLOW_COPY_AND_ASSIGN(WebAudioCapturerSource); 77 }; 78 79 } // namespace content 80 81 #endif // CONTENT_RENDERER_MEDIA_WEBAUDIO_CAPTURER_SOURCE_H_ 82