#ifndef SERVICES_AUDIO_LOOPBACK_SIGNAL_PROVIDER_H_
#define SERVICES_AUDIO_LOOPBACK_SIGNAL_PROVIDER_H_
#include <map>
#include <memory>
#include "base/sequence_checker.h"
#include "base/synchronization/lock.h"
#include "base/thread_annotations.h"
#include "base/time/time.h"
#include "base/unguessable_token.h"
#include "media/base/audio_parameters.h"
#include "services/audio/loopback_coordinator.h"
#include "services/audio/snooper_node.h"
namespace media {
class AudioBus;
}
namespace audio {
class LoopbackSource;
class LoopbackSignalProviderInterface {
public:
LoopbackSignalProviderInterface(const LoopbackSignalProviderInterface&) =
delete;
LoopbackSignalProviderInterface& operator=(
const LoopbackSignalProviderInterface&) = delete;
virtual ~LoopbackSignalProviderInterface() = default;
virtual void Start() = 0;
virtual base::TimeTicks PullLoopbackData(media::AudioBus* destination,
base::TimeTicks capture_time,
double volume) = 0;
protected:
LoopbackSignalProviderInterface() = default;
};
class LoopbackSignalProvider final : public LoopbackSignalProviderInterface,
public LoopbackGroupObserver::Listener {
public:
LoopbackSignalProvider(
const media::AudioParameters& output_params,
std::unique_ptr<LoopbackGroupObserver> loopback_group_observer);
~LoopbackSignalProvider() final;
void Start() final;
base::TimeTicks PullLoopbackData(media::AudioBus* destination,
base::TimeTicks capture_time,
double volume) final;
void OnSourceAdded(LoopbackSource* source) final;
void OnSourceRemoved(LoopbackSource* source) final;
private:
const media::AudioParameters output_params_;
const std::unique_ptr<LoopbackGroupObserver> loopback_group_observer_;
base::Lock lock_;
std::map<LoopbackSource*, std::unique_ptr<SnooperNode>> snoopers_
GUARDED_BY(lock_);
base::TimeDelta capture_delay_;
std::unique_ptr<media::AudioBus> transfer_bus_;
SEQUENCE_CHECKER(sequence_checker_);
};
}
#endif