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

library fuchsia.media.audio;

// fuchsia.media.audio contains definitions relating to audio. Definitions in
// this file concern control of audio gain.

using zx;

/// Enables control and monitoring of audio gain. This interface is typically
/// a tear-off of other interfaces. For example, `fuchsia.media.audio.Renderer`
/// has a `BindGainControl` method that binds to a gain control that controls
/// gain for the renderer.
// TODO(35393, 35311, 35309): Deprecate and remove.
protocol GainControl {
    /// Sets the gain in decibels.
    SetGain(float32 gain_db);

    /// Smoothly changes gain from its current value to specified value, over the
    /// specified duration (in milliseconds). If 'duration_ns' is 0, gain changes
    /// immediately. Otherwise, gain changes only while the stream is running.
    ///
    /// Any active or pending ramp is cancelled by subsequent call to SetGain.
    ///
    /// There can be at most 1 active ramp at any time. Any active or pending
    /// ramp is replaced by a later call to SetGainWithRamp (even if duration is
    /// 0). In this case gain would ramps directly from its most recent
    /// (mid-ramp) value to the newly-specified one, over the new duration,
    /// using the new easing.
    ///
    /// Usage example (using time in seconds):
    ///  Time 0
    ///      SetGainWithRamp(`MUTED_GAIN_DB`, 0, SCALE_LINEAR)         // Ramp 1
    ///      SetGainWithRamp(0.0f, `ZX_SEC`(4), SCALE_LINEAR)          // Ramp 2
    ///  Time 3
    ///      PlayNoReply(kNoTimestamp, any_media_time)
    ///  Time 4
    ///      PauseNoReply()
    ///  Time 7
    ///      PlayNoReply(kNoTimestamp, any_media_time)
    ///  Time 8
    ///      SetGainWithRamp(`MUTED_GAIN_DB`, ZX_SEC(1), SCALE_LINEAR) // Ramp 3
    ///
    ///
    /// Time 0: Ramp 1 completes immediately, changing the gain to `MUTED_GAIN_DB`.
    ///         Ramp 2 is pending, since we are not in playback.
    /// Time 3, Ramp 2 begins ramping from `MUTED_GAIN_DB` to 0 dB
    ///         (scale 0.0=>1.0).
    /// Time 4: Ramp 2 pauses (3s remain). Per `SCALE_LINEAR`, scale is approx.
    ///         0.25.
    /// Time 7: Ramp 2 resumes from most recent value toward the target.
    /// Time 8: Ramp 3 replaces Ramp 2 and starts from current scale
    ///         (approx 0.5).
    /// Time 9: Ramp 3 completes; current scale value is now 0.0 (`MUTED_GAIN_DB`).
    ///
    SetGainWithRamp(float32 gain_db,
                    zx.duration duration,
                    RampType rampType);

    /// Sets the mute value. Ramping and mute are fully independent, although
    /// they both affect the scaling that is applied.
    SetMute(bool muted);

    /// Notifies the client of changes in the current gain/mute values.
    //
    // TODO(mpuryear): provide ramp-related values in this event, as well.
    //
    // TODO(mpuryear): notify upon ramp milestones (not just SetGain/Mute) --
    // upon the start/pause/restart/completion of an active ramp?
    -> OnGainMuteChanged(float32 gain_db, bool muted);
};

/// Gain value producing silence. Gain values less than this value are permitted,
/// but produce the same effect as this value.
const float32 MUTED_GAIN_DB = -160.0;

/// Maximum permitted gain value.
const float32 MAX_GAIN_DB = 24.0;

/// Enumerates gain control ramp types.
enum RampType : uint16 {
    /// Amplitude scale changes at a fixed rate across the ramp duration.
    SCALE_LINEAR = 1;

    // TODO(mpuryear) Additional ramp shapes (easings) may be added in the
    // future, perhaps including logarithmic (i.e. linear wrt dB), cubic
    // (in/out/inout) or others.
};
