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
16namespace content {
17
18class 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.
30class 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