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