#ifndef CHROMECAST_MEDIA_AUDIO_CAST_AUDIO_MANAGER_H_
#define CHROMECAST_MEDIA_AUDIO_CAST_AUDIO_MANAGER_H_
#include <memory>
#include <string>
#include "base/gtest_prod_util.h"
#include "base/memory/weak_ptr.h"
#include "base/task/single_thread_task_runner.h"
#include "build/build_config.h"
#include "chromecast/media/audio/cast_audio_manager_helper.h"
#include "media/audio/audio_manager_base.h"
namespace chromecast {
namespace media {
class CastAudioMixer;
class CastAudioManagerTest;
class CastAudioOutputStreamTest;
class CmaBackendFactory;
class CastAudioManager : public ::media::AudioManagerBase {
public:
CastAudioManager(
std::unique_ptr<::media::AudioThread> audio_thread,
::media::AudioLogFactory* audio_log_factory,
CastAudioManagerHelper::Delegate* delegate,
base::RepeatingCallback<CmaBackendFactory*()> backend_factory_getter,
scoped_refptr<base::SingleThreadTaskRunner> browser_task_runner,
scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
bool use_mixer);
CastAudioManager(const CastAudioManager&) = delete;
CastAudioManager& operator=(const CastAudioManager&) = delete;
~CastAudioManager() override;
bool HasAudioOutputDevices() override;
void GetAudioOutputDeviceNames(
::media::AudioDeviceNames* device_names) override;
bool HasAudioInputDevices() override;
void GetAudioInputDeviceNames(
::media::AudioDeviceNames* device_names) override;
::media::AudioParameters GetInputStreamParameters(
const std::string& device_id) override;
const std::string_view GetName() override;
void ReleaseOutputStream(::media::AudioOutputStream* stream) override;
using ::media::AudioManagerBase::GetOutputStreamParameters;
protected:
::media::AudioOutputStream* MakeLinearOutputStream(
const ::media::AudioParameters& params,
const ::media::AudioManager::LogCallback& log_callback) override;
::media::AudioOutputStream* MakeLowLatencyOutputStream(
const ::media::AudioParameters& params,
const std::string& device_id_or_group_id,
const ::media::AudioManager::LogCallback& log_callback) override;
::media::AudioInputStream* MakeLinearInputStream(
const ::media::AudioParameters& params,
const std::string& device_id,
const ::media::AudioManager::LogCallback& log_callback) override;
::media::AudioInputStream* MakeLowLatencyInputStream(
const ::media::AudioParameters& params,
const std::string& device_id,
const ::media::AudioManager::LogCallback& log_callback) override;
::media::AudioParameters GetPreferredOutputStreamParameters(
const std::string& output_device_id,
const ::media::AudioParameters& input_params) override;
virtual ::media::AudioOutputStream* MakeMixerOutputStream(
const ::media::AudioParameters& params);
private:
FRIEND_TEST_ALL_PREFIXES(CastAudioManagerTest, CanMakeStreamProxy);
friend class CastAudioMixer;
friend class CastAudioManagerTest;
friend class CastAudioOutputStreamTest;
CastAudioManager(
std::unique_ptr<::media::AudioThread> audio_thread,
::media::AudioLogFactory* audio_log_factory,
CastAudioManagerHelper::Delegate* delegate,
base::RepeatingCallback<CmaBackendFactory*()> backend_factory_getter,
scoped_refptr<base::SingleThreadTaskRunner> browser_task_runner,
scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
bool use_mixer,
bool force_use_cma_backend_for_output);
bool UseMixerOutputStream(const ::media::AudioParameters& params);
CastAudioManagerHelper helper_;
scoped_refptr<base::SingleThreadTaskRunner> browser_task_runner_;
std::unique_ptr<::media::AudioOutputStream> mixer_output_stream_;
std::unique_ptr<CastAudioMixer> mixer_;
bool force_use_cma_backend_for_output_;
base::WeakPtr<CastAudioManager> weak_this_;
base::WeakPtrFactory<CastAudioManager> weak_factory_;
};
}
}
#endif