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" 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/threading/thread_checker.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/audio/audio_parameters.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/audio_capturer_source.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/audio_fifo.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebAudioDestinationConsumer.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebVector.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class WebRtcAudioCapturer; 20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class WebRtcLocalAudioTrack; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebAudioCapturerSource is the missing link between 23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// WebAudio's MediaStreamAudioDestinationNode and WebRtcLocalAudioTrack. 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1. WebKit calls the setFormat() method setting up the basic stream format 26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// (channels, and sample-rate). 27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// 2. consumeAudio() is called periodically by WebKit which dispatches the 28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// audio stream to the WebRtcLocalAudioTrack::Capture() method. 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebAudioCapturerSource 30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) : public base::RefCountedThreadSafe<WebAudioCapturerSource>, 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public blink::WebAudioDestinationConsumer { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) WebAudioCapturerSource(); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WebAudioDestinationConsumer implementation. 36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // setFormat() is called early on, so that we can configure the audio track. 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void setFormat(size_t number_of_channels, float sample_rate) OVERRIDE; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // MediaStreamAudioDestinationNode periodically calls consumeAudio(). 39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Called on the WebAudio audio thread. 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void consumeAudio(const blink::WebVector<const float*>& audio_data, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t number_of_frames) OVERRIDE; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Called when the WebAudioCapturerSource is hooking to a media audio track. 44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // |track| is the sink of the data flow. |source_provider| is the source of 45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // the data flow where stream information like delay, volume, key_pressed, 46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // is stored. 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Start(WebRtcLocalAudioTrack* track, WebRtcAudioCapturer* capturer); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Called when the media audio track is stopping. 50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void Stop(); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) protected: 53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) friend class base::RefCountedThreadSafe<WebAudioCapturerSource>; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~WebAudioCapturerSource(); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private: 57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Used to DCHECK that some methods are called on the correct thread. 58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::ThreadChecker thread_checker_; 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // The audio track this WebAudioCapturerSource is feeding data to. 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // WebRtcLocalAudioTrack is reference counted, and owning this object. 62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // To avoid circular reference, a raw pointer is kept here. 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) WebRtcLocalAudioTrack* track_; 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // A raw pointer to the capturer to get audio processing params like 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // delay, volume, key_pressed information. 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This |capturer_| is guaranteed to outlive this object. 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WebRtcAudioCapturer* capturer_; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media::AudioParameters params_; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Flag to help notify the |track_| when the audio format has changed. 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool audio_format_changed_; 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wraps data coming from HandleCapture(). 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<media::AudioBus> wrapper_bus_; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Bus for reading from FIFO and calling the CaptureCallback. 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<media::AudioBus> capture_bus_; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Handles mismatch between WebAudio buffer size and WebRTC. 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<media::AudioFifo> fifo_; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Buffer to pass audio data to WebRtc. 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<int16[]> audio_data_; 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Synchronizes HandleCapture() with AudioCapturerSource calls. 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Lock lock_; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool started_; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebAudioCapturerSource); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CONTENT_RENDERER_MEDIA_WEBAUDIO_CAPTURER_SOURCE_H_ 97