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