#include "services/audio/local_muter.h"
#include <utility>
#include "base/functional/bind.h"
namespace audio {
LocalMuter::LocalMuter(LoopbackCoordinator* coordinator,
const base::UnguessableToken& group_id)
: loopback_group_observer_(
LoopbackGroupObserver::CreateMatchingGroupObserver(coordinator,
group_id)),
group_id_(group_id) {
loopback_group_observer_->StartObserving(this);
loopback_group_observer_->ForEachSource(
base::BindRepeating(&LocalMuter::OnSourceAdded, base::Unretained(this)));
receivers_.set_disconnect_handler(
base::BindRepeating(&LocalMuter::OnBindingLost, base::Unretained(this)));
}
LocalMuter::~LocalMuter() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
loopback_group_observer_->ForEachSource(base::BindRepeating(
[](LoopbackSource* source) { source->StopMuting(); }));
loopback_group_observer_->StopObserving();
}
void LocalMuter::SetAllBindingsLostCallback(base::RepeatingClosure callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
all_bindings_lost_callback_ = callback;
}
void LocalMuter::AddReceiver(
mojo::PendingAssociatedReceiver<media::mojom::LocalMuter> receiver) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
receivers_.Add(this, std::move(receiver));
}
void LocalMuter::OnBindingLost() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (!HasReceivers()) {
all_bindings_lost_callback_.Run();
}
}
void LocalMuter::OnSourceAdded(LoopbackSource* source) {
source->StartMuting();
}
void LocalMuter::OnSourceRemoved(LoopbackSource* source) {
}
}