blob: 25fb67916d1995a50d24731ce3af6f84a23abfd7 [file] [log] [blame] [edit]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/audio/device_notifier.h"
#include <utility>
#include "base/functional/bind.h"
#include "base/task/sequenced_task_runner.h"
#include "base/trace_event/trace_event.h"
namespace audio {
DeviceNotifier::DeviceNotifier()
: task_runner_(base::SequencedTaskRunner::GetCurrentDefault()) {
base::SystemMonitor::Get()->AddDevicesChangedObserver(this);
}
DeviceNotifier::~DeviceNotifier() {
DCHECK(task_runner_->RunsTasksInCurrentSequence());
base::SystemMonitor::Get()->RemoveDevicesChangedObserver(this);
}
void DeviceNotifier::Bind(
mojo::PendingReceiver<mojom::DeviceNotifier> receiver) {
DCHECK(task_runner_->RunsTasksInCurrentSequence());
receivers_.Add(this, std::move(receiver));
}
void DeviceNotifier::RegisterListener(
mojo::PendingRemote<mojom::DeviceListener> listener) {
DCHECK(task_runner_->RunsTasksInCurrentSequence());
const auto& id = listeners_.Add(std::move(listener));
TRACE_EVENT1("audio", "audio::DeviceNotifier::RegisterListener", "id",
id.value());
}
void DeviceNotifier::OnDevicesChanged(
base::SystemMonitor::DeviceType device_type) {
if (device_type != base::SystemMonitor::DEVTYPE_AUDIO)
return;
TRACE_EVENT0("audio", "audio::DeviceNotifier::OnDevicesChanged");
task_runner_->PostTask(FROM_HERE,
base::BindOnce(&DeviceNotifier::UpdateListeners,
weak_factory_.GetWeakPtr()));
}
void DeviceNotifier::UpdateListeners() {
DCHECK(task_runner_->RunsTasksInCurrentSequence());
TRACE_EVENT0("audio", "audio::DeviceNotifier::UpdateListeners");
for (const auto& listener : listeners_)
listener->DevicesChanged();
}
} // namespace audio