// 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.

//TODO(fxbug.dev/36191): Move to fuchsia.media.audio

library fuchsia.media;

/// A state of audio usages in which no policy actions are taken on any streams with the usage.
table UsageStateUnadjusted {
};

/// A state of audio usages in which a policy decision has been made to temporarily
/// lower the volume of all streams with this usage.
table UsageStateDucked {
};

/// A state of audio usages in which a policy decision has been made to temporarily
/// mute the volume of all streams with this usage.
table UsageStateMuted {
};

/// The state of audio policy enforcement on a stream or set of streams.
flexible union UsageState {
    1: UsageStateUnadjusted unadjusted;
    2: UsageStateDucked ducked;
    3: UsageStateMuted muted;
};

/// A protocol for listening to changes to the policy state of an audio usage.
///
/// User actions, such as lowering the volume or muting a stream, are not reflected in this
/// API.
protocol UsageWatcher {
    /// Called on first connection and whenever the watched usage changes. The provided
    /// usage will always be the bound usage; it is provided so that an implementation of
    /// this protocol may be bound to more than one usage.
    ///
    /// Clients must respond to acknowledge the event. Clients that do not acknowledge their
    /// events will eventually be disconnected.
    OnStateChanged(Usage usage, UsageState state) -> ();
};

/// A protocol for setting up watchers of audio usages.
[Discoverable]
protocol UsageReporter {
    Watch(
        Usage usage,
        UsageWatcher usage_watcher);
};

/// A protocol for setting up watchers of usage gain.
[Discoverable]
protocol UsageGainReporter {
    /// Connects a listener to a stream of usage gain setting changes
    /// for `usage` on the device identified by `device_token`. Usage
    /// Gain is not set directly by any client; it is a translation of
    /// the usage volume setting for each device.
    ///
    /// Devices may map the same volume level to different dbfs, so
    /// a `device_unique_id` is needed to indentify the device.
    ///
    /// `AudioDeviceEnumerator` provides programmatic access to devices
    /// and their unique ids if it is necessary for a client to select
    /// an id at runtime.
    RegisterListener(
        string:36 device_unique_id,
        Usage usage,
        UsageGainListener usage_gain_listener);
};

/// A protocol for watching changes to usage gain settings.
///
/// The channel will close when the device is not present.
protocol UsageGainListener {
    /// Called immediately on connection and afterward any time
    /// the usage gain setting changes.
    ///
    /// Clients must respond to acknowledge the event. Clients that do not acknowledge their
    /// events will eventually be disconnected.
    OnGainMuteChanged(bool muted, float32 gain_dbfs) -> ();
};
