mirror of
https://github.com/vector-im/element-call.git
synced 2026-09-22 22:29:30 +00:00
- Draw the input level beneath the microphone list as 32 discrete segments, so the level reads by count and not by hue alone. - Expose it through role="meter" with aria-valuenow and aria-valuetext, so a screen reader announces it. - Give denied permission and no input device their own message and next action, rather than a flat meter that reads as silence. - Read the level only while the menu is open, so nothing holds a second capture of the microphone for the length of a call. - Read the device the picker has selected, so the meter re-points as soon as the selection changes. - Ignore anything below a noise floor: a quiet room is never digitally silent, and its hiss otherwise lights the first segments permanently, which reads as "it can hear me" when nobody is speaking. - Quantise loudness with a square root above that floor: amplitude puts ordinary speech near the bottom of the range, where a linear meter barely moves. - Withhold the output select callback where the platform cannot route audio to a chosen device, which is what renders the speaker section disabled. Safari and most Firefox builds land here. - Track the in-flight device by kind as well as id: Chrome names both an input and an output "default", so the spinner appeared on the wrong row. - Disable every device in the menu while a selection is settling, so a second request cannot overtake the first. The meter opens its own short-lived capture rather than tapping the call's audio track. That is what lets it follow the picker instantly, and it avoids the pre-join track, which is deliberately frozen to the device selected when the screen mounted. The cost is a second capture of the same device while the menu is open. See the spec's notes sidecar. Spec: FEATURES_SPEC/2026-09_Quick_Audio_Menu.md — AC1, AC6, AC7, AC13, AC14, AC15, AC17, AC18, AC21, AC22