docs/tickets: 0001 fedora chrome silence → fixed (chromium decoder anchor)
This commit is contained in:
parent
dad697d141
commit
da7181f6d2
2 changed files with 47 additions and 3 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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. |
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue