docs/tickets: 0001 fedora chrome silence → fixed (chromium decoder anchor)

This commit is contained in:
Russell Ballestrini 2026-06-07 20:10:25 -04:00
parent dad697d141
commit da7181f6d2
No known key found for this signature in database
2 changed files with 47 additions and 3 deletions

View file

@ -1,10 +1,44 @@
# 0001: fedora chrome cannot hear speakers
**Status:** in-progress
**Status:** fixed
**Priority:** P0 (silent regression — every invariant green except audible output)
**Surface:** fedora chrome — observed under both listener and speaker roles
**First seen:** 2026-06-04 (or earlier — "for days")
**Reporter:** fox (blanka-chrome identity)
**Fixed:** 2026-06-07, commits `dad697d` (source) + `1f27b89` (deploy)
## Root cause
**Chromium will not run its WebRTC audio decoder for a remote
`MediaStreamTrack` whose only consumer is a `MediaStreamAudioSourceNode`.**
The decoder requires an `HTMLMediaElement` (an `<audio>` or `<video>`
element) bound to the track to actually decode. Without that anchor,
the source node produces silence even though packets arrive at full
rate, the worklet's `started` event fires, and `audioCtx.state ===
'running'`. Firefox does not have this restriction.
PulseAudio Playback during repro: chrome stream visible (chrome WAS
producing an output stream), level meter pinned at 0 (the stream's
content was silence). RTP telemetry: `aud.recv pkt=N → N+50/sec
bytes=growing level=0.000 jbuf=?`. Worklet telemetry:
`jitter-buffer started uuid=… target=0.7s` (queue filled — but with
zeros).
## Fix
In `attachAudioStreamViaWorklet`, alongside the existing
`createMediaStreamSource(stream) → gain → destination` chain, create a
hidden muted `<audio>` element with `srcObject = stream`, append it
to the DOM, and call `play()`. The element makes no audible output
(`muted = true`); its sole purpose is to keep chromium's WebRTC
decoder running so the worklet's `MediaStreamSource` sees real
samples. `setWorkletStream` swaps the anchor's `srcObject` alongside
the source node; `detachListenerStream` tears the anchor down.
Pinned by tests in `test/listener-audio-attach.test.js`:
- anchor created on attach
- anchor follows the stream on setWorkletStream
- anchor torn down on detach
## Symptom
@ -203,6 +237,15 @@ includes `want=…` so the mismatch jumps out.
## Status notes
- **2026-06-07 (fixed):** chrome decoder anchor landed in `dad697d`,
deployed `1f27b89`. fox confirmed audio working on chrome.
- **2026-06-07 (root cause pinned):** pavucontrol showed chrome stream
present + level=0 with worklet `started` fired — the chromium-only
MediaStreamSource-needs-anchor signature.
- **2026-06-07 (en-route fixes kept):** always-SFU receive
(`1984bb1`), `SPEAKER_PLAYOUT_DELAY_SEC` 0.5s → 0.7s, session
fingerprint telemetry (`1ed5263`), per-peer mesh.recv stats
(`b9e2541`), `audioCtx.setSinkId` re-apply on rejoin (`467146a`).
- **2026-06-07 (in-progress, fix C deployed):** sink-drift on
audioCtx-persistent path identified + patched. Need a third telemetry
pass to confirm the per-tick `ctx.sink=` line now stays on the

View file

@ -63,9 +63,10 @@ Running log of attempts, observations, retests. Newest at the top.
| # | Title | Priority | Surface | Status |
|---|-------|----------|---------|--------|
| [0001](0001-fedora-chrome-cannot-hear-speakers.md) | fedora chrome cannot hear speakers | P0 | fedora chrome (any role) | in-progress |
| [0002](0002-fedora-firefox-cannot-share-camera.md) | fedora firefox cannot share camera | High | fedora firefox (speaker/host) | open |
## Fixed
(none yet)
| # | Title | Fix |
|---|-------|-----|
| [0001](0001-fedora-chrome-cannot-hear-speakers.md) | fedora chrome cannot hear speakers (P0) | Hidden muted `<audio>` decoder-anchor alongside MediaStreamSource (`dad697d` / deploy `1f27b89`). Plus en-route improvements: always-SFU receive, 0.7s cushion, audioCtx sinkId re-apply, session-fingerprint + mesh.recv telemetry. |