#ifndef SERVICES_AUDIO_OUTPUT_DEVICE_MIXER_MANAGER_H_
#define SERVICES_AUDIO_OUTPUT_DEVICE_MIXER_MANAGER_H_
#include <memory>
#include <set>
#include <string>
#include "base/containers/flat_map.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "media/base/audio_parameters.h"
#include "services/audio/output_device_mixer.h"
#include "services/audio/reference_output.h"
#include "services/audio/reference_signal_provider.h"
namespace media {
class AudioManager;
class AudioOutputStream;
}
namespace audio {
class OutputDeviceMixerReferenceProvider;
class OutputDeviceMixerManager : public ReferenceSignalProviderFactory {
public:
OutputDeviceMixerManager(
media::AudioManager* audio_manager,
OutputDeviceMixer::CreateCallback create_mixer_callback);
OutputDeviceMixerManager(const OutputDeviceMixerManager&) = delete;
OutputDeviceMixerManager& operator=(const OutputDeviceMixerManager&) = delete;
~OutputDeviceMixerManager() override;
media::AudioOutputStream* MakeOutputStream(
const std::string& device_id,
const media::AudioParameters& params,
base::OnceClosure close_stream_on_device_change);
std::unique_ptr<ReferenceSignalProvider> GetReferenceSignalProvider() final;
private:
friend class OutputDeviceMixerManagerTest;
friend class OutputDeviceMixerReferenceProvider;
void StartListening(ReferenceOutput::Listener* listener,
const std::string& device_id);
void StopListening(ReferenceOutput::Listener* listener);
using OutputDeviceMixers = std::vector<std::unique_ptr<OutputDeviceMixer>>;
using ListenerToDeviceMap =
base::flat_map<raw_ptr<ReferenceOutput::Listener, DanglingUntriaged>,
std::string>;
void OnDeviceChange();
std::string ToMixerDeviceId(const std::string& device_id);
base::OnceClosure GetOnDeviceChangeCallback();
media::AudioOutputStream* CreateMixerOwnedStream(
const std::string& device_id,
const media::AudioParameters& params);
media::AudioOutputStream* CreateDeviceListenerStream(
base::OnceClosure on_device_change_callback,
const std::string& device_id,
const media::AudioParameters& params);
OutputDeviceMixer* FindMixer(const std::string& physical_device_id);
OutputDeviceMixer* AddMixer(const std::string& physical_device_id);
void StartNewListener(ReferenceOutput::Listener* listener,
const std::string& device_id);
bool IsNormalizedIfDefault(const std::string& device_id);
SEQUENCE_CHECKER(owning_sequence_);
const raw_ptr<media::AudioManager> audio_manager_;
std::string current_default_device_id_;
std::string current_communication_device_id_;
OutputDeviceMixer::CreateCallback create_mixer_callback_;
OutputDeviceMixers output_device_mixers_;
ListenerToDeviceMap listener_registration_;
base::WeakPtrFactory<OutputDeviceMixerManager> device_change_weak_ptr_factory_
GUARDED_BY_CONTEXT(owning_sequence_);
};
}
#endif