// 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. // AudioOutputDispatcher is a single-threaded base class that dispatches // creation and deletion of audio output streams. AudioOutputProxy objects use // this class to allocate and recycle actual audio output streams. When playback // is started, the proxy calls StartStream() to get an output stream that it // uses to play audio. When playback is stopped, the proxy returns the stream // back to the dispatcher by calling StopStream(). // // AudioManagerBase creates one specialization of AudioOutputDispatcher on the // audio thread for each possible set of audio parameters. I.e streams with // different parameters are managed independently. The AudioOutputDispatcher // instance is then deleted on the audio thread when the AudioManager shuts // down. #ifndef MEDIA_AUDIO_AUDIO_OUTPUT_DISPATCHER_H_ #define MEDIA_AUDIO_AUDIO_OUTPUT_DISPATCHER_H_ #include "base/basictypes.h" #include "base/memory/ref_counted.h" #include "base/timer/timer.h" #include "media/audio/audio_io.h" #include "media/audio/audio_manager.h" #include "media/audio/audio_parameters.h" namespace base { class SingleThreadTaskRunner; } namespace media { class AudioOutputProxy; class MEDIA_EXPORT AudioOutputDispatcher : public base::RefCountedThreadSafe<AudioOutputDispatcher> { public: AudioOutputDispatcher(AudioManager* audio_manager, const AudioParameters& params, const std::string& device_id); // Called by AudioOutputProxy to open the stream. // Returns false, if it fails to open it. virtual bool OpenStream() = 0; // Called by AudioOutputProxy when the stream is started. // Uses |callback| to get source data and report errors, if any. // Does *not* take ownership of this callback. // Returns true if started successfully, false otherwise. virtual bool StartStream(AudioOutputStream::AudioSourceCallback* callback, AudioOutputProxy* stream_proxy) = 0; // Called by AudioOutputProxy when the stream is stopped. // Ownership of the |stream_proxy| is passed to the dispatcher. virtual void StopStream(AudioOutputProxy* stream_proxy) = 0; // Called by AudioOutputProxy when the volume is set. virtual void StreamVolumeSet(AudioOutputProxy* stream_proxy, double volume) = 0; // Called by AudioOutputProxy when the stream is closed. virtual void CloseStream(AudioOutputProxy* stream_proxy) = 0; // Called on the audio thread when the AudioManager is shutting down. virtual void Shutdown() = 0; // Called by the AudioManager to restart streams when a wedge is detected. A // wedge means the OS failed to request any audio after StartStream(). When a // wedge is detected all streams across all dispatchers must be closed. After // all streams are closed, streams are restarted. See http://crbug.com/160920 virtual void CloseStreamsForWedgeFix() = 0; virtual void RestartStreamsForWedgeFix() = 0; const std::string& device_id() const { return device_id_; } protected: friend class base::RefCountedThreadSafe<AudioOutputDispatcher>; virtual ~AudioOutputDispatcher(); // A no-reference-held pointer (we don't want circular references) back to the // AudioManager that owns this object. AudioManager* audio_manager_; const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; const AudioParameters params_; std::string device_id_; private: DISALLOW_COPY_AND_ASSIGN(AudioOutputDispatcher); }; } // namespace media #endif // MEDIA_AUDIO_AUDIO_OUTPUT_DISPATCHER_H_