| # 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. |