The fork's guard typeof audioOutputId === "string" correctly avoids setSinkId(undefined) before MediaDevices resolves. But the same guard also applies after resolution: if the selected output device is unplugged and audioOutput.selected$ emits undefined again, the effect re-runs and does nothing, leaving the context pinned to the sink id of a device that no longer exists. EC's sound effects (join/leave, ringtone, reactions) then play to a dead sink until a new device is explicitly selected.
How to trigger
Select a non-default output device, then unplug it mid-call.
Suggested fix
Treat undefined as "revert to default" by calling setSinkId("") in that case, rather than skipping the call entirely.
Filed from the September 2026 audit (branch lotus).
**Severity:** low · **Type:** bug · **Confidence:** medium
**Location:** `src/useAudioContext.tsx:178-193`
### Problem
The fork's guard `typeof audioOutputId === "string"` correctly avoids `setSinkId(undefined)` before MediaDevices resolves. But the same guard also applies *after* resolution: if the selected output device is unplugged and `audioOutput.selected$` emits `undefined` again, the effect re-runs and does nothing, leaving the context pinned to the sink id of a device that no longer exists. EC's sound effects (join/leave, ringtone, reactions) then play to a dead sink until a new device is explicitly selected.
### How to trigger
Select a non-default output device, then unplug it mid-call.
### Suggested fix
Treat `undefined` as "revert to default" by calling `setSinkId("")` in that case, rather than skipping the call entirely.
---
---
_Filed from the September 2026 audit (branch `lotus`)._
jared
added this to the EC fork audit 2026-09 · Medium & Low milestone 2026-09-12 02:13:11 -04:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Severity: low · Type: bug · Confidence: medium
Location:
src/useAudioContext.tsx:178-193Problem
The fork's guard
typeof audioOutputId === "string"correctly avoidssetSinkId(undefined)before MediaDevices resolves. But the same guard also applies after resolution: if the selected output device is unplugged andaudioOutput.selected$emitsundefinedagain, the effect re-runs and does nothing, leaving the context pinned to the sink id of a device that no longer exists. EC's sound effects (join/leave, ringtone, reactions) then play to a dead sink until a new device is explicitly selected.How to trigger
Select a non-default output device, then unplug it mid-call.
Suggested fix
Treat
undefinedas "revert to default" by callingsetSinkId("")in that case, rather than skipping the call entirely.Filed from the September 2026 audit (branch
lotus).