| Index: content/renderer/media/audio_input_device.h
|
| diff --git a/content/renderer/media/audio_input_device.h b/content/renderer/media/audio_input_device.h
|
| index 8ef72b7e277704866cce16215f96b760ab671ad3..cf05f85a6ad61c2567034c5d233e5a702fa8ff79 100644
|
| --- a/content/renderer/media/audio_input_device.h
|
| +++ b/content/renderer/media/audio_input_device.h
|
| @@ -2,8 +2,8 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -// Low-latency audio capturing unit utilizing audio input stream provided
|
| -// by browser process through IPC.
|
| +// Low-latency audio capturing class utilizing audio input stream provided
|
| +// by a server (browser) process by use of an IPC interface.
|
| //
|
| // Relationship of classes:
|
| //
|
| @@ -11,58 +11,51 @@
|
| // ^ ^
|
| // | |
|
| // v IPC v
|
| -// AudioInputRendererHost <---------> AudioInputMessageFilter
|
| -// ^
|
| +// AudioInputRendererHost <---------> media::AudioInputIPCDelegate
|
| +// ^ (impl in AudioInputMessageFilter)
|
| // |
|
| // v
|
| // AudioInputDeviceManager
|
| //
|
| // Transportation of audio samples from the browser to the render process
|
| -// is done by using shared memory in combination with a sync socket pair
|
| -// to generate a low latency transport. The AudioInputDevice user registers
|
| -// an AudioInputDevice::CaptureCallback at construction and will be called
|
| -// by the AudioInputDevice with recorded audio from the underlying audio layers.
|
| +// is done by using shared memory in combination with a SyncSocket.
|
| +// The AudioInputDevice user registers an AudioInputDevice::CaptureCallback by
|
| +// calling Initialize(). The callback will be called with recorded audio from
|
| +// the underlying audio layers.
|
| // The session ID is used by the AudioInputRendererHost to start the device
|
| // referenced by this ID.
|
| //
|
| // State sequences:
|
| //
|
| -// Task [IO thread] IPC [IO thread]
|
| -//
|
| // Sequence where session_id has not been set using SetDevice():
|
| -// Start -> InitializeOnIOThread -----> AudioInputHostMsg_CreateStream ------->
|
| -// <- OnLowLatencyCreated <- AudioInputMsg_NotifyLowLatencyStreamCreated <-
|
| -// ---> StartOnIOThread ---------> AudioInputHostMsg_PlayStream -------->
|
| +// ('<-' signifies callbacks, -> signifies calls made by AudioInputDevice)
|
| +// Start -> InitializeOnIOThread -> CreateStream ->
|
| +// <- OnStreamCreated <-
|
| +// -> StartOnIOThread -> PlayStream ->
|
| //
|
| // Sequence where session_id has been set using SetDevice():
|
| -// Start -> InitializeOnIOThread --> AudioInputHostMsg_StartDevice --->
|
| -// <---- OnStarted <-------------- AudioInputMsg_NotifyDeviceStarted <----
|
| -// -> OnDeviceReady ------------> AudioInputHostMsg_CreateStream ------->
|
| -// <- OnLowLatencyCreated <- AudioInputMsg_NotifyLowLatencyStreamCreated <-
|
| -// ---> StartOnIOThread ---------> AudioInputHostMsg_PlayStream -------->
|
| +// Start -> InitializeOnIOThread -> StartDevice ->
|
| +// <- OnDeviceReady <-
|
| +// -> CreateStream ->
|
| +// <- OnStreamCreated <-
|
| +// -> StartOnIOThread -> PlayStream ->
|
| //
|
| // AudioInputDevice::Capture => low latency audio transport on audio thread =>
|
| // |
|
| -// Stop --> ShutDownOnIOThread ------> AudioInputHostMsg_CloseStream -> Close
|
| +// Stop --> ShutDownOnIOThread ------> CloseStream -> Close
|
| //
|
| -// This class utilizes three threads during its lifetime, namely:
|
| +// This class depends on two threads to function:
|
| //
|
| -// 1. Creating thread.
|
| -// Must be the main render thread. Start and Stop should be called on
|
| -// this thread.
|
| -// 2. IO thread.
|
| -// The thread within which this class receives all the IPC messages and
|
| -// IPC communications can only happen in this thread.
|
| -// 3. Audio transport thread.
|
| -// Responsible for calling the CaptrureCallback and feed audio samples from
|
| -// the audio layer in the browser process using sync sockets and shared
|
| -// memory.
|
| +// 1. An IO thread.
|
| +// This thread is used to asynchronously process Start/Stop etc operations
|
| +// that are available via the public interface. The public methods are
|
| +// asynchronous and simply post a task to the IO thread to actually perform
|
| +// the work.
|
| +// 2. Audio transport thread.
|
| +// Responsible for calling the CaptureCallback and feed audio samples from
|
| +// the server side audio layer using a socket and shared memory.
|
| //
|
| // Implementation notes:
|
| -//
|
| -// - Start() is asynchronous/non-blocking.
|
| -// - Stop() is synchronous/blocking.
|
| -// - SetDevice() is asynchronous/non-blocking.
|
| // - The user must call Stop() before deleting the class instance.
|
|
|
| #ifndef CONTENT_RENDERER_MEDIA_AUDIO_INPUT_DEVICE_H_
|
| @@ -87,7 +80,7 @@
|
| // OnCaptureStopped etc.) and ensure that we can deliver these notifications
|
| // to any clients using this class.
|
| class CONTENT_EXPORT AudioInputDevice
|
| - : public AudioInputMessageFilter::Delegate,
|
| + : NON_EXPORTED_BASE(public media::AudioInputIPCDelegate),
|
| NON_EXPORTED_BASE(public ScopedLoopObserver),
|
| public base::RefCountedThreadSafe<AudioInputDevice> {
|
| public:
|
| @@ -116,10 +109,14 @@ class CONTENT_EXPORT AudioInputDevice
|
| virtual ~CaptureEventHandler() {}
|
| };
|
|
|
| - // Methods called on main render thread -------------------------------------
|
| - AudioInputDevice(const media::AudioParameters& params,
|
| - CaptureCallback* callback,
|
| - CaptureEventHandler* event_handler);
|
| + AudioInputDevice(media::AudioInputIPC* ipc,
|
| + const scoped_refptr<base::MessageLoopProxy>& io_loop);
|
| +
|
| + // Initializes the AudioInputDevice. This method must be called before
|
| + // any other methods can be used.
|
| + void Initialize(const media::AudioParameters& params,
|
| + CaptureCallback* callback,
|
| + CaptureEventHandler* event_handler);
|
|
|
| // Specify the |session_id| to query which device to use. This method is
|
| // asynchronous/non-blocking.
|
| @@ -138,38 +135,27 @@ class CONTENT_EXPORT AudioInputDevice
|
| // Returns |true| on success.
|
| bool SetVolume(double volume);
|
|
|
| - // Gets the capture volume scaling, with range [0.0, 1.0] inclusive.
|
| - // Returns |true| on success.
|
| - bool GetVolume(double* volume);
|
| -
|
| - double sample_rate() const {
|
| - return audio_parameters_.sample_rate();
|
| - }
|
| -
|
| - int buffer_size() const {
|
| - return audio_parameters_.frames_per_buffer();
|
| - }
|
| -
|
| // Sets the Automatic Gain Control state to on or off.
|
| // This method must be called before Start(). It will not have any effect
|
| // if it is called while capturing has already started.
|
| void SetAutomaticGainControl(bool enabled);
|
|
|
| + protected:
|
| // Methods called on IO thread ----------------------------------------------
|
| - // AudioInputMessageFilter::Delegate impl., called by AudioInputMessageFilter.
|
| + // media::AudioInputIPCDelegate implementation.
|
| virtual void OnStreamCreated(base::SharedMemoryHandle handle,
|
| base::SyncSocket::Handle socket_handle,
|
| - uint32 length) OVERRIDE;
|
| + int length) OVERRIDE;
|
| virtual void OnVolume(double volume) OVERRIDE;
|
| - virtual void OnStateChanged(AudioStreamState state) OVERRIDE;
|
| + virtual void OnStateChanged(
|
| + media::AudioInputIPCDelegate::State state) OVERRIDE;
|
| virtual void OnDeviceReady(const std::string& device_id) OVERRIDE;
|
| + virtual void OnIPCClosed() OVERRIDE;
|
|
|
| - protected:
|
| + friend class base::RefCountedThreadSafe<AudioInputDevice>;
|
| virtual ~AudioInputDevice();
|
|
|
| private:
|
| - friend class base::RefCountedThreadSafe<AudioInputDevice>;
|
| -
|
| // Methods called on IO thread ----------------------------------------------
|
| // The following methods are tasks posted on the IO thread that needs to
|
| // be executed on that thread. They interact with AudioInputMessageFilter and
|
| @@ -181,26 +167,19 @@ class CONTENT_EXPORT AudioInputDevice
|
| void SetVolumeOnIOThread(double volume);
|
| void SetAutomaticGainControlOnIOThread(bool enabled);
|
|
|
| - void Send(IPC::Message* message);
|
| -
|
| // MessageLoop::DestructionObserver implementation for the IO loop.
|
| // If the IO loop dies before we do, we shut down the audio thread from here.
|
| virtual void WillDestroyCurrentMessageLoop() OVERRIDE;
|
|
|
| - // Format
|
| media::AudioParameters audio_parameters_;
|
|
|
| CaptureCallback* callback_;
|
| CaptureEventHandler* event_handler_;
|
|
|
| - // The current volume scaling [0.0, 1.0] of the audio stream.
|
| - double volume_;
|
| -
|
| - // Cached audio input message filter (lives on the main render thread).
|
| - scoped_refptr<AudioInputMessageFilter> filter_;
|
| + media::AudioInputIPC* ipc_;
|
|
|
| // Our stream ID on the message filter. Only modified on the IO thread.
|
| - int32 stream_id_;
|
| + int stream_id_;
|
|
|
| // The media session ID used to identify which input device to be started.
|
| // Only modified on the IO thread.
|
|
|