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