| // Copyright 2019 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_STREAM_VOLUME_MANAGER_H_ |
| #define SRC_MEDIA_AUDIO_AUDIO_CORE_STREAM_VOLUME_MANAGER_H_ |
| |
| #include <fuchsia/media/cpp/fidl.h> |
| #include <lib/fit/function.h> |
| |
| #include <optional> |
| #include <unordered_set> |
| |
| #include "src/media/audio/audio_core/mixer/gain.h" |
| #include "src/media/audio/audio_core/usage_settings.h" |
| #include "src/media/audio/audio_core/volume_control.h" |
| |
| namespace media::audio { |
| |
| struct Ramp { |
| zx::duration duration; |
| fuchsia::media::audio::RampType ramp_type; |
| }; |
| |
| // A command to realize a volume on all a stream's links. |
| struct VolumeCommand { |
| // Volume in the range [0.0, 1.0]. |
| float volume; |
| // A gain adjustment to be applied after volume is converted to gain for the link. |
| float gain_db_adjustment; |
| // A ramp with which to apply the change in volume. |
| std::optional<Ramp> ramp; |
| }; |
| |
| // An interface for persisting and realizing stream volumes. |
| class StreamVolume { |
| public: |
| virtual fuchsia::media::Usage GetStreamUsage() const = 0; |
| virtual bool GetStreamMute() const = 0; |
| |
| // Propagate a volume to all the stream's links. |
| virtual void RealizeVolume(VolumeCommand volume_command) = 0; |
| }; |
| |
| // Manages the volume of streams, accounting for their usages. |
| class StreamVolumeManager { |
| public: |
| // Disable copy, assign, and move. |
| StreamVolumeManager(StreamVolumeManager&) = delete; |
| StreamVolumeManager(StreamVolumeManager&&) = delete; |
| StreamVolumeManager& operator=(StreamVolumeManager) = delete; |
| StreamVolumeManager& operator=(StreamVolumeManager&&) = delete; |
| |
| StreamVolumeManager(async_dispatcher_t* fidl_dispatcher); |
| |
| const UsageGainSettings& GetUsageGainSettings() const; |
| |
| // Sets usage gain settings and updates affected streams. |
| void SetUsageGain(fuchsia::media::Usage usage, float gain_db); |
| void SetUsageGainAdjustment(fuchsia::media::Usage usage, float gain_db); |
| |
| void BindUsageVolumeClient(fuchsia::media::Usage usage, |
| fidl::InterfaceRequest<fuchsia::media::audio::VolumeControl> request); |
| |
| // Prompts the volume manager to recompute the stream's adjusted gain and send a realization |
| // request. |
| void NotifyStreamChanged(StreamVolume* stream_volume); |
| void NotifyStreamChanged(StreamVolume* stream_volume, Ramp ramp); |
| |
| void AddStream(StreamVolume* stream_volume); |
| void RemoveStream(StreamVolume* stream_volume); |
| |
| private: |
| class VolumeSettingImpl final : public VolumeSetting { |
| public: |
| VolumeSettingImpl(fuchsia::media::Usage usage, StreamVolumeManager* owner); |
| |
| void SetVolume(float volume) override; |
| |
| private: |
| fuchsia::media::Usage usage_; |
| StreamVolumeManager* owner_; |
| }; |
| |
| void SetUsageVolume(fuchsia::media::Usage usage, float volume); |
| |
| void UpdateStreamsWithUsage(fuchsia::media::Usage usage); |
| void UpdateStream(StreamVolume* stream, std::optional<Ramp> ramp); |
| |
| std::array<VolumeSettingImpl, fuchsia::media::RENDER_USAGE_COUNT> |
| render_usage_volume_setting_impls_; |
| std::array<VolumeSettingImpl, fuchsia::media::CAPTURE_USAGE_COUNT> |
| capture_usage_volume_setting_impls_; |
| std::array<VolumeControl, fuchsia::media::RENDER_USAGE_COUNT> render_usage_volume_controls_; |
| std::array<VolumeControl, fuchsia::media::CAPTURE_USAGE_COUNT> capture_usage_volume_controls_; |
| std::unordered_set<StreamVolume*> stream_volumes_; |
| UsageGainSettings usage_gain_settings_; |
| UsageVolumeSettings usage_volume_settings_; |
| }; |
| |
| } // namespace media::audio |
| |
| #endif // SRC_MEDIA_AUDIO_AUDIO_CORE_STREAM_VOLUME_MANAGER_H_ |