Files
fkwp 9a68de193f Show a live microphone level in the audio menu
- 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
2026-09-16 14:52:59 +02:00
..
2026-04-22 12:29:57 +00:00
2026-07-20 14:58:37 +00:00
2026-04-22 12:29:57 +00:00
2026-04-22 12:29:57 +00:00
2026-04-22 12:29:57 +00:00
2026-04-22 12:29:57 +00:00
2026-07-20 14:58:37 +00:00
2025-02-28 13:38:53 +00:00
2026-07-20 14:58:37 +00:00
2026-04-22 12:29:57 +00:00
2026-04-22 12:29:57 +00:00
2026-04-22 12:29:57 +00:00
2026-04-22 12:29:57 +00:00
2026-04-22 12:29:57 +00:00
2026-04-22 12:29:57 +00:00
2026-07-20 14:58:37 +00:00
2026-04-22 12:29:57 +00:00
2026-04-22 12:29:57 +00:00
2026-04-22 12:29:57 +00:00
2026-04-22 12:29:57 +00:00
2026-04-22 12:29:57 +00:00
2026-04-22 12:29:57 +00:00
2025-02-28 13:38:53 +00:00
2026-04-22 12:29:57 +00:00