#ifndef SERVICES_AUDIO_LOOPBACK_MIXIN_H_
#define SERVICES_AUDIO_LOOPBACK_MIXIN_H_
#include <memory>
#include <string_view>
#include "base/feature_list.h"
#include "base/time/time.h"
#include "media/base/audio_bus.h"
namespace base {
class UnguessableToken;
}
namespace media {
struct AudioGlitchInfo;
class AudioParameters;
}
namespace audio {
class LoopbackCoordinator;
class LoopbackSignalProviderInterface;
BASE_DECLARE_FEATURE(kRestrictOwnAudioAddChromiumBack);
class LoopbackMixin {
public:
using OnDataCallback = base::RepeatingCallback<void(
const media::AudioBus* source,
base::TimeTicks capture_time,
double volume,
const media::AudioGlitchInfo& audio_glitch_info)>;
using MaybeCreateCallback = base::OnceCallback<std::unique_ptr<LoopbackMixin>(
std::string_view device_id,
const media::AudioParameters& params,
OnDataCallback on_data_callback)>;
static std::unique_ptr<LoopbackMixin>
MaybeCreateRestrictOwnAudioLoopbackMixin(
LoopbackCoordinator* coordinator,
const base::UnguessableToken& group_id,
std::string_view device_id,
const media::AudioParameters& params,
OnDataCallback on_data_callback);
~LoopbackMixin();
LoopbackMixin(const LoopbackMixin&) = delete;
LoopbackMixin& operator=(const LoopbackMixin&) = delete;
void Start();
void OnData(const media::AudioBus* source,
base::TimeTicks capture_time,
double volume,
const media::AudioGlitchInfo& audio_glitch_info);
protected:
LoopbackMixin(
std::unique_ptr<LoopbackSignalProviderInterface> signal_provider,
const media::AudioParameters& params,
OnDataCallback on_data_callback);
private:
const std::unique_ptr<LoopbackSignalProviderInterface> signal_provider_;
const std::unique_ptr<media::AudioBus> mix_bus_;
OnDataCallback on_data_callback_;
};
}
#endif