blob: 855a7283408017b9fe793844ac32c945e6e5b499 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_MEDIA_AUDIO_AUDIO_CORE_USAGE_GAIN_REPORTER_IMPL_H_
#define SRC_MEDIA_AUDIO_AUDIO_CORE_USAGE_GAIN_REPORTER_IMPL_H_
#include <fuchsia/media/cpp/fidl.h>
#include <lib/fidl/cpp/binding_set.h>
#include <unordered_set>
#include "src/media/audio/audio_core/audio_device_manager.h"
#include "src/media/audio/audio_core/context.h"
#include "src/media/audio/audio_core/loudness_transform.h"
#include "src/media/audio/audio_core/process_config.h"
#include "src/media/audio/audio_core/stream_volume_manager.h"
namespace media::audio {
class UsageGainReporterImpl : public fuchsia::media::UsageGainReporter {
public:
explicit UsageGainReporterImpl(Context* context)
: UsageGainReporterImpl(context->device_manager(), context->volume_manager(),
context->process_config()) {
FX_DCHECK(context);
}
UsageGainReporterImpl(DeviceRegistry& device_registry, StreamVolumeManager& stream_volume_manager,
const ProcessConfig& process_config)
: device_registry_(device_registry),
stream_volume_manager_(stream_volume_manager),
process_config_(process_config) {}
fidl::InterfaceRequestHandler<fuchsia::media::UsageGainReporter> GetFidlRequestHandler();
// |fuchsia::media::UsageGainReporter|
void RegisterListener(
std::string device_unique_id, fuchsia::media::Usage usage,
fidl::InterfaceHandle<fuchsia::media::UsageGainListener> usage_gain_listener_handler) final;
private:
friend class UsageGainReporterTest;
class Listener final : public StreamVolume {
public:
Listener(UsageGainReporterImpl& parent,
const DeviceConfig::OutputDeviceProfile& output_device_profile,
fuchsia::media::Usage usage, fuchsia::media::UsageGainListenerPtr usage_gain_listener);
private:
// |media::audio::StreamVolume|
fuchsia::media::Usage GetStreamUsage() const final { return fidl::Clone(usage_); }
bool GetStreamMute() const final { return false; }
void RealizeVolume(VolumeCommand volume_command) final;
UsageGainReporterImpl& parent_;
std::shared_ptr<LoudnessTransform> loudness_transform_;
bool independent_volume_control_;
fuchsia::media::Usage usage_;
fuchsia::media::UsageGainListenerPtr usage_gain_listener_;
size_t unacked_messages_ = 0;
};
// TODO(fxbug.dev/50074): Queue a function on the async loop to periodically execute and
// clean up any listeners with too many unacked messages
// TODO(fxbug.dev/50596): Disconnect listeners upon device removal
DeviceRegistry& device_registry_;
StreamVolumeManager& stream_volume_manager_;
const ProcessConfig& process_config_;
std::unordered_map<Listener*, std::unique_ptr<Listener>> listeners_;
fidl::BindingSet<fuchsia::media::UsageGainReporter, UsageGainReporterImpl*> bindings_;
};
} // namespace media::audio
#endif // SRC_MEDIA_AUDIO_AUDIO_CORE_USAGE_GAIN_REPORTER_IMPL_H_