#ifndef MEDIA_AUDIO_AUDIO_OUTPUT_DISPATCHER_IMPL_H_
#define MEDIA_AUDIO_AUDIO_OUTPUT_DISPATCHER_IMPL_H_
#include <stddef.h>
#include <memory>
#include <string>
#include <vector>
#include "base/containers/flat_map.h"
#include "base/memory/raw_ptr.h"
#include "base/timer/timer.h"
#include "media/audio/audio_io.h"
#include "media/audio/audio_manager.h"
#include "media/audio/audio_output_dispatcher.h"
#include "media/base/audio_parameters.h"
namespace media {
class AudioLog;
class MEDIA_EXPORT AudioOutputDispatcherImpl
: public AudioOutputDispatcher,
public AudioManager::AudioDeviceListener {
public:
AudioOutputDispatcherImpl(AudioManager* audio_manager,
const AudioParameters& params,
const std::string& output_device_id,
base::TimeDelta close_delay);
AudioOutputDispatcherImpl(const AudioOutputDispatcherImpl&) = delete;
AudioOutputDispatcherImpl& operator=(const AudioOutputDispatcherImpl&) =
delete;
~AudioOutputDispatcherImpl() override;
AudioOutputProxy* CreateStreamProxy() override;
bool OpenStream() override;
bool StartStream(AudioOutputStream::AudioSourceCallback* callback,
AudioOutputProxy* stream_proxy) override;
void StopStream(AudioOutputProxy* stream_proxy) override;
void StreamVolumeSet(AudioOutputProxy* stream_proxy, double volume) override;
void CloseStream(AudioOutputProxy* stream_proxy) override;
void FlushStream(AudioOutputProxy* stream_proxy) override;
void OnDeviceChange() override;
bool HasOutputProxies() const;
void CloseAllIdleStreams();
private:
bool CreateAndOpenStream();
void CloseIdleStreams(size_t keep_alive);
void StopPhysicalStream(AudioOutputStream* stream);
const AudioParameters params_;
const std::string device_id_;
size_t idle_proxies_;
std::vector<raw_ptr<AudioOutputStream, VectorExperimental>> idle_streams_;
base::DelayTimer close_timer_;
typedef base::flat_map<AudioOutputProxy*,
raw_ptr<AudioOutputStream, CtnExperimental>>
AudioStreamMap;
AudioStreamMap proxy_to_physical_map_;
using AudioLogMap =
base::flat_map<AudioOutputStream*, std::unique_ptr<media::AudioLog>>;
AudioLogMap audio_logs_;
int audio_stream_id_;
base::WeakPtrFactory<AudioOutputDispatcherImpl> weak_factory_{this};
};
}
#endif