#ifndef MEDIA_AUDIO_AUDIO_MANAGER_BASE_H_
#define MEDIA_AUDIO_AUDIO_MANAGER_BASE_H_
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "base/task/single_thread_task_runner.h"
#include "base/threading/thread.h"
#include "build/build_config.h"
#include "media/audio/aecdump_recording_manager.h"
#include "media/audio/audio_debug_recording_manager.h"
#include "media/audio/audio_device_name.h"
#include "media/audio/audio_manager.h"
#include "media/audio/audio_output_dispatcher.h"
#include "arkweb/build/features/features.h"
#include "third_party/abseil-cpp/absl/container/flat_hash_set.h"
namespace media {
class AudioOutputDispatcher;
class MEDIA_EXPORT AudioManagerBase : public AudioManager {
public:
AudioManagerBase(const AudioManagerBase&) = delete;
AudioManagerBase& operator=(const AudioManagerBase&) = delete;
~AudioManagerBase() override;
AudioOutputStream* MakeAudioOutputStream(
const AudioParameters& params,
const std::string& device_id,
const LogCallback& log_callback) override;
AudioInputStream* MakeAudioInputStream(
const AudioParameters& params,
const std::string& device_id,
const LogCallback& log_callback) override;
AudioOutputStream* MakeAudioOutputStreamProxy(
const AudioParameters& params,
const std::string& device_id) override;
void AddOutputDeviceChangeListener(AudioDeviceListener* listener) override;
void RemoveOutputDeviceChangeListener(AudioDeviceListener* listener) override;
std::unique_ptr<AudioLog> CreateAudioLog(
AudioLogFactory::AudioComponent component,
int component_id) override;
virtual void ReleaseOutputStream(AudioOutputStream* stream);
virtual void ReleaseInputStream(AudioInputStream* stream);
virtual AudioOutputStream* MakeLinearOutputStream(
const AudioParameters& params,
const LogCallback& log_callback) = 0;
virtual AudioOutputStream* MakeLowLatencyOutputStream(
const AudioParameters& params,
const std::string& device_id,
const LogCallback& log_callback) = 0;
virtual AudioOutputStream* MakeBitstreamOutputStream(
const AudioParameters& params,
const std::string& device_id,
const LogCallback& log_callback);
virtual AudioInputStream* MakeLinearInputStream(
const AudioParameters& params,
const std::string& device_id,
const LogCallback& log_callback) = 0;
virtual AudioInputStream* MakeLowLatencyInputStream(
const AudioParameters& params,
const std::string& device_id,
const LogCallback& log_callback) = 0;
int input_stream_count() const {
return static_cast<int>(input_streams_.size());
}
int output_stream_count() const { return num_output_streams_; }
#if BUILDFLAG(ARKWEB_WEBRTC)
absl::flat_hash_set<raw_ptr<AudioInputStream, CtnExperimental>>
GetInputStream() override {
if (input_streams_.size()) {
return input_streams_;
}
return {};
}
#endif
protected:
AudioManagerBase(std::unique_ptr<AudioThread> audio_thread,
AudioLogFactory* audio_log_factory);
void ShutdownOnAudioThread() override;
void GetAudioInputDeviceDescriptions(
AudioDeviceDescriptions* device_descriptions) final;
void GetAudioOutputDeviceDescriptions(
AudioDeviceDescriptions* device_descriptions) final;
AudioParameters GetOutputStreamParameters(
const std::string& device_id) override;
AudioParameters GetInputStreamParameters(
const std::string& device_id) override;
std::string GetAssociatedOutputDeviceID(
const std::string& input_device_id) override;
void SetMaxOutputStreamsAllowed(int max) { max_num_output_streams_ = max; }
void NotifyAllOutputDeviceChangeListeners();
static int GetUserBufferSize();
virtual AudioParameters GetPreferredOutputStreamParameters(
const std::string& output_device_id,
const AudioParameters& input_params) = 0;
#if BUILDFLAG(ARKWEB_WEBRTC)
virtual AudioParameters GetPreferredInputStreamParameters(
const std::string& input_device_id) = 0;
#endif
virtual void GetAudioInputDeviceNames(AudioDeviceNames* device_names);
virtual void GetAudioOutputDeviceNames(AudioDeviceNames* device_names);
std::string GetDefaultInputDeviceID() override;
std::string GetDefaultOutputDeviceID() override;
std::string GetCommunicationsInputDeviceID() override;
std::string GetCommunicationsOutputDeviceID() override;
virtual std::unique_ptr<AudioDebugRecordingManager>
CreateAudioDebugRecordingManager();
AudioDebugRecordingManager* GetAudioDebugRecordingManager() final;
void SetAecDumpRecordingManager(base::WeakPtr<AecdumpRecordingManager>
aecdump_recording_manager) override;
virtual std::string GetGroupIDOutput(const std::string& output_device_id);
virtual std::string GetGroupIDInput(const std::string& input_device_id);
void CloseAllInputStreams();
private:
FRIEND_TEST_ALL_PREFIXES(AudioManagerTest, AudioDebugRecording);
struct DispatcherParams;
typedef std::vector<std::unique_ptr<DispatcherParams>> AudioOutputDispatchers;
void InitializeDebugRecording() final;
void GetAudioDeviceDescriptions(
AudioDeviceDescriptions* descriptions,
void (AudioManagerBase::*get_device_names)(AudioDeviceNames*),
std::string (AudioManagerBase::*get_default_device_id)(),
std::string (AudioManagerBase::*get_communications_device_id)(),
std::string (AudioManagerBase::*get_group_id)(const std::string&));
int max_num_output_streams_;
int num_output_streams_;
base::ObserverList<AudioDeviceListener> output_listeners_;
absl::flat_hash_set<raw_ptr<AudioInputStream, CtnExperimental>>
input_streams_;
AudioOutputDispatchers output_dispatchers_;
const raw_ptr<AudioLogFactory, DanglingUntriaged> audio_log_factory_;
std::unique_ptr<AudioDebugRecordingManager> debug_recording_manager_;
};
}
#endif