Index: content/renderer/media/audio_device.h |
=================================================================== |
--- content/renderer/media/audio_device.h (revision 148738) |
+++ content/renderer/media/audio_device.h (working copy) |
@@ -1,169 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
-// |
-// Audio rendering unit utilizing audio output stream provided by browser |
-// process through IPC. |
-// |
-// Relationship of classes. |
-// |
-// AudioOutputController AudioDevice |
-// ^ ^ |
-// | | |
-// v IPC v |
-// AudioRendererHost <---------> AudioMessageFilter |
-// |
-// Transportation of audio samples from the render to the browser process |
-// is done by using shared memory in combination with a sync socket pair |
-// to generate a low latency transport. The AudioDevice user registers an |
-// AudioDevice::RenderCallback at construction and will be polled by the |
-// AudioDevice for audio to be played out by the underlying audio layers. |
-// |
-// State sequences. |
-// |
-// Task [IO thread] IPC [IO thread] |
-// |
-// Start -> CreateStreamOnIOThread -----> CreateStream ------> |
-// <- OnStreamCreated <- AudioMsg_NotifyStreamCreated <- |
-// ---> PlayOnIOThread -----------> PlayStream --------> |
-// |
-// Optionally Play() / Pause() sequences may occur: |
-// Play -> PlayOnIOThread --------------> PlayStream ---------> |
-// Pause -> PauseOnIOThread ------------> PauseStream --------> |
-// (note that Play() / Pause() sequences before OnStreamCreated are |
-// deferred until OnStreamCreated, with the last valid state being used) |
-// |
-// AudioDevice::Render => audio transport on audio thread => |
-// | |
-// Stop --> ShutDownOnIOThread --------> CloseStream -> Close |
-// |
-// This class utilizes several threads during its lifetime, namely: |
-// 1. Creating thread. |
-// Must be the main render thread. |
-// 2. Control thread (may be the main render thread or another thread). |
-// The methods: Start(), Stop(), Play(), Pause(), SetVolume() |
-// must be called on the same thread. |
-// 3. IO thread (internal implementation detail - not exposed to public API) |
-// The thread within which this class receives all the IPC messages and |
-// IPC communications can only happen in this thread. |
-// 4. Audio transport thread (See AudioDeviceThread). |
-// Responsible for calling the AudioThreadCallback implementation that in |
-// turn calls AudioRendererSink::RenderCallback which feeds audio samples to |
-// the audio layer in the browser process using sync sockets and shared |
-// memory. |
-// |
-// Implementation notes: |
-// |
-// - Start() is asynchronous/non-blocking. |
-// - Stop() is asynchronous/non-blocking. |
-// - Play() is asynchronous/non-blocking. |
-// - Pause() is asynchronous/non-blocking. |
-// - The user must call Stop() before deleting the class instance. |
- |
-#ifndef CONTENT_RENDERER_MEDIA_AUDIO_DEVICE_H_ |
-#define CONTENT_RENDERER_MEDIA_AUDIO_DEVICE_H_ |
- |
-#include "base/basictypes.h" |
-#include "base/bind.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/message_loop.h" |
-#include "base/shared_memory.h" |
-#include "content/common/content_export.h" |
-#include "content/renderer/media/audio_device_thread.h" |
-#include "content/renderer/media/scoped_loop_observer.h" |
-#include "media/audio/audio_output_ipc.h" |
-#include "media/audio/audio_parameters.h" |
-#include "media/base/audio_renderer_sink.h" |
- |
-namespace media { |
-class AudioParameters; |
-} |
- |
-class CONTENT_EXPORT AudioDevice |
- : NON_EXPORTED_BASE(public media::AudioRendererSink), |
- public media::AudioOutputIPCDelegate, |
- NON_EXPORTED_BASE(public ScopedLoopObserver) { |
- public: |
- // Methods called on main render thread ------------------------------------- |
- |
- // AudioRendererSink implementation. |
- virtual void Initialize(const media::AudioParameters& params, |
- RenderCallback* callback) OVERRIDE; |
- virtual void Start() OVERRIDE; |
- virtual void Stop() OVERRIDE; |
- virtual void Play() OVERRIDE; |
- virtual void Pause(bool flush) OVERRIDE; |
- virtual bool SetVolume(double volume) OVERRIDE; |
- |
- // Methods called on IO thread ---------------------------------------------- |
- // AudioOutputIPCDelegate methods. |
- virtual void OnStateChanged( |
- media::AudioOutputIPCDelegate::State state) OVERRIDE; |
- virtual void OnStreamCreated(base::SharedMemoryHandle handle, |
- base::SyncSocket::Handle socket_handle, |
- int length) OVERRIDE; |
- virtual void OnIPCClosed() OVERRIDE; |
- |
- // Creates an uninitialized AudioDevice. Clients must call Initialize() |
- // before using. |
- // TODO(tommi): When all dependencies on |content| have been removed |
- // from AudioDevice, move this class over to media/audio. |
- AudioDevice(media::AudioOutputIPC* ipc, |
- const scoped_refptr<base::MessageLoopProxy>& io_loop); |
- |
- protected: |
- // Magic required by ref_counted.h to avoid any code deleting the object |
- // accidentally while there are references to it. |
- friend class base::RefCountedThreadSafe<AudioDevice>; |
- virtual ~AudioDevice(); |
- |
- private: |
- // 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 AudioMessageFilter and |
- // sends IPC messages on that thread. |
- void CreateStreamOnIOThread(const media::AudioParameters& params); |
- void PlayOnIOThread(); |
- void PauseOnIOThread(bool flush); |
- void ShutDownOnIOThread(); |
- void SetVolumeOnIOThread(double volume); |
- |
- // 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; |
- |
- media::AudioParameters audio_parameters_; |
- |
- RenderCallback* callback_; |
- |
- // A pointer to the IPC layer that takes care of sending requests over to |
- // the AudioRendererHost. |
- media::AudioOutputIPC* ipc_; |
- |
- // Our stream ID on the message filter. Only accessed on the IO thread. |
- // Must only be modified on the IO thread. |
- int stream_id_; |
- |
- // State of Play() / Pause() calls before OnStreamCreated() is called. |
- bool play_on_start_; |
- |
- // Set to |true| when OnStreamCreated() is called. |
- // Set to |false| when ShutDownOnIOThread() is called. |
- // This is for use with play_on_start_ to track Play() / Pause() state. |
- // Must only be touched from the IO thread. |
- bool is_started_; |
- |
- // Our audio thread callback class. See source file for details. |
- class AudioThreadCallback; |
- |
- // In order to avoid a race between OnStreamCreated and Stop(), we use this |
- // guard to control stopping and starting the audio thread. |
- base::Lock audio_thread_lock_; |
- AudioDeviceThread audio_thread_; |
- scoped_ptr<AudioDevice::AudioThreadCallback> audio_callback_; |
- |
- |
- DISALLOW_COPY_AND_ASSIGN(AudioDevice); |
-}; |
- |
-#endif // CONTENT_RENDERER_MEDIA_AUDIO_DEVICE_H_ |