// 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.
type UsageStateUnadjusted = table {};

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

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

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

/// 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(struct {
        usage Usage;
        state UsageState;
    }) -> ();
};

/// A protocol for setting up watchers of audio usages.
@discoverable
protocol UsageReporter {
    Watch(resource struct {
        usage Usage;
        usage_watcher client_end:UsageWatcher;
    });
};

/// A protocol for setting up watchers of usage gain.
@discoverable
protocol UsageGainReporter {
    // TODO(fxbug.dev/71946): Only report volume-to-gain translation, without
    // including muting/ducking gain adjustments. Determine whether separate
    // muting/ducking gain reporting is necessary
    //
    /// 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, summed with active
    /// muting/ducking gain adjustments.
    ///
    /// 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(resource struct {
        device_unique_id string:36;
        usage Usage;
        usage_gain_listener client_end:UsageGainListener;
    });
};

/// 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.
    ///
    /// Note: This API does not have mute reporting implemented; `muted` is always false.
    // TODO(fxbug.dev/54949): Update implementation to report on mute state.
    OnGainMuteChanged(struct {
        muted bool;
        gain_dbfs float32;
    }) -> ();
};
