#ifndef MEDIA_AUDIO_PULSE_PULSE_LOOPBACK_MANAGER_H_
#define MEDIA_AUDIO_PULSE_PULSE_LOOPBACK_MANAGER_H_
#include <pulse/pulseaudio.h>
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/task/single_thread_task_runner.h"
#include "base/threading/thread_checker.h"
#include "pulse_loopback.h"
#include <memory>
#include <string>
namespace media {
class PulseLoopbackManager {
public:
using ReleaseStreamCallback =
base::RepeatingCallback<void(AudioInputStream*)>;
static std::unique_ptr<PulseLoopbackManager> Create(
ReleaseStreamCallback release_stream_callback,
pa_context* context,
pa_threaded_mainloop* mainloop);
~PulseLoopbackManager();
PulseLoopbackAudioStream* MakeLoopbackStream(
const AudioParameters& params,
AudioManager::LogCallback log_callback,
bool should_mute_system_audio);
void RemoveStream(AudioInputStream* stream);
const std::string& GetLoopbackSourceName();
private:
static void EventCallback(pa_context* context,
pa_subscription_event_type_t type,
uint32_t index,
void* user_data);
PulseLoopbackManager(const std::string& default_monitor_name,
ReleaseStreamCallback release_stream_callback,
pa_context* context,
pa_threaded_mainloop* mainloop);
void OnServerChangeEvent();
std::string default_monitor_name_;
ReleaseStreamCallback release_stream_callback_;
const raw_ptr<pa_context> context_;
const raw_ptr<pa_threaded_mainloop> mainloop_;
bool has_muting_loopback_ = false;
std::vector<raw_ptr<PulseLoopbackAudioStream>> streams_;
THREAD_CHECKER(thread_checker_);
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
base::WeakPtr<PulseLoopbackManager> weak_this_;
base::WeakPtrFactory<PulseLoopbackManager> weak_ptr_factory_{this};
};
}
#endif