0.20.1-lotus.2, bump the pin and delete the CallControl.ts .muted DOM fallback
Done in bbcbdad5 (pin is now 0.25.0-lotus.4, which is well past the lotus.2 gate):
CallControl.setSound()/applyScreenshareAudioMuted()no longer touch<audio>.mutedinside the EC…
0.20.1-lotus.2, bump the pin and delete the CallControl.ts .muted DOM fallback
Verified headless (Chromium):
- G1 PiP badges: own mute → "Your microphone is muted (alice)" bottom-left only; remote mute → "All other participants are muted" top-right only; both…
L1 verified (with a nuance). Instrumented getUserMedia in both the host page and the EC iframe during a call with AFK auto-mute enabled:
joined, unmuted: host gUM=0 liveAudio=0
Verified headless on the local calls stack (Chromium; OscillatorNode.start and HTMLMediaElement.play instrumented for the sound checks, so "sounds" here means "the right synth/clip was…
Root-caused — and it is a test artifact, not a product bug.
livekit-client only ever learns about speaking via server deltas (SpeakersChanged → Room.handleSpeakersChanged, "updates…
Verified end-to-end on the local calls stack (fork 0.25.0-lotus.4; two headless clients; widget messages recorded on both sides of the iframe, SFU state from ListParticipants).
Verified, then implemented on the local calls stack (two headless clients, OscillatorNode.start instrumented to classify the chimes).
Before: bob leaves and rejoins ~3 s later → alice…
Swept end-to-end on the local calls stack (Synapse + LiveKit + JWT service + voice-limit-guard, two headless Chromium clients with fake mic/camera/desktop-capture; ground truth taken from the…