// Copyright 2012 The Chromium Authors // 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. // // audio::OutputController AudioOutputDevice // ^ ^ // | | // v IPC v // audio::OutputStream <---------> AudioOutputIPC (MojoAudioOutputIPC) // // 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 AudioOutputDevice user registers an // AudioOutputDevice::RenderCallback at construction and will be polled by the // AudioOutputController for audio to be played out by the underlying audio // layers. // // State sequences. // // Task [IO thread] IPC [IO thread] // RequestDeviceAuthorization -> RequestDeviceAuthorizationOnIOThread ------> // RequestDeviceAuthorization -> // <- OnDeviceAuthorized <- AudioMsg_NotifyDeviceAuthorized <- // // 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) // // AudioOutputDevice::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 AudioOutputDeviceThreadCallback // 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: // - The user must call Stop() before deleting the class instance. #ifndef MEDIA_AUDIO_AUDIO_OUTPUT_DEVICE_H_ #define MEDIA_AUDIO_AUDIO_OUTPUT_DEVICE_H_ #include <memory> #include <string> #include "base/functional/bind.h" #include "base/memory/raw_ptr.h" #include "base/memory/unsafe_shared_memory_region.h" #include "base/synchronization/waitable_event.h" #include "base/thread_annotations.h" #include "base/time/time.h" #include "media/audio/audio_device_thread.h" #include "media/audio/audio_output_ipc.h" #include "media/audio/audio_sink_parameters.h" #include "media/base/audio_parameters.h" #include "media/base/audio_renderer_sink.h" #include "media/base/media_export.h" #include "media/base/output_device_info.h" namespace base { class OneShotTimer; class SingleThreadTaskRunner; } namespace media { class AudioOutputDeviceThreadCallback; class MEDIA_EXPORT AudioOutputDevice : public AudioRendererSink, public AudioOutputIPCDelegate { … }; } // namespace media #endif // MEDIA_AUDIO_AUDIO_OUTPUT_DEVICE_H_