blob: 43446b8def581f5dda14a9b7e692fb99acd57c60 [file] [log] [blame] [view]
# Loudness
The loudness of a given audio stream on Fuchsia is a product of five factors:
* [Usage of the stream](#usage-of-stream)
* [System-global volume setting for that Usage](#usage-volume)
* [System-global gain adjustment for that Usage](#usage-gain-adjustment)
* [Stream-local gain adjustment for the stream](#stream-gain-adjustment)
* [Mute state](#mute-state)
## Usages {#usage-of-stream}
[Usages](https://fuchsia.dev/reference/fidl/fuchsia.media#Usage) are a hint to the system about
the meaning of the audio to a user. Two supported Usages are `MEDIA`, for media content such as
music and videos, and `INTERRUPTION` for things like alarms that interrupt the user's task. Each
Usage has a separate volume control.
Audio streams such as `AudioRenderers` and `AudioCapturers` must be tagged with a Usage.
## Usage Volume {#usage-volume}
Volume is a floating point value between 0 and 1, where 0 is muted and 1 is
the maximum volume for the stream.
Some examples:
* If `MEDIA` is set to 0.5 volume and `INTERRUPTION` to 1.0, a stream tagged as
`INTERRUPTION` would play back at half its loudness if played back instead as a `MEDIA` stream.
* If `INTERRUPTION` is set to 0 volume, all streams tagged as `INTERRUPTION` are
inaudible to the user.
## Usage Gain Adjustment {#usage-gain-adjustment}
To realize the stream, the Fuchsia audio subsystem must translate volume settings to gain in dbfs
for each output device. Since devices have different ranges of gain and different mappings from
volume to gain, this translation may result in a different value for each output device.
After this translation, the usage's gain adjustment is applied. The gain adjustment is a
persistent setting in units of gain dbfs.
This is useful to enforce deltas between two usages when they are at the same volume.
For example, if `MEDIA` and `INTERRUPTION` are both set to 0.7 volume, but `MEDIA` has a gain
adjustment of -10db, a stream tagged as `INTERRUPTION` would not be as loud as if it is played back
tagged as `MEDIA`.
## Stream Gain Adjustment {#stream-gain-adjustment}
Another gain adjustment can be applied, directly to the stream. This gain adjustment value is local.
For example, if two `AudioRenderer`s exist on the system and one has a gain adjustment of -5db, the
other, if unmodified, still has a no-op gain adjustment of 0db.
## Mute State {#mute-state}
A stream, or usage, may be muted. When a stream is muted, it is not output to the user. When a
usage is muted, no stream tagged with that usage is output to the user.
During mute, other settings such as volume and gain are retained; muted is not the same as 0 volume
because the volume may be changed while muted but the stream remains inaudible.
When unmuted, streams will resume output at their previous loudness settings if those were not
modified during mute.
## Gain Adjustment Considerations
Volume is not a precisely linear mapping to loudness but it is relatively close for the human ear.
Gain is logarithmic, so a gain adjustment has a significantly different effect on loudness
depending on the current loudness of the stream to which it is applied.