blob: ab2a11c5ffdaee68c79a4e5fb8c57ce966144082 [file] [log] [blame]
// 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.
};