Ideas taken from CurryCaster's guest page:
- 'Hear yourself' plays the guest's own mic in their headphones
(refused when the headphones box is unticked - it would feed back)
- Mute shows a clear 'the show cannot hear you' state
- 'What is happening' log: connection events plus stats every 15 s in
both directions (kb/s, loss, jitter, buffer, concealment, round trip,
candidate types). Never includes IP addresses. Kept in the page only;
the guest presses Copy and sends it to the host.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Padding/probe packets use a sequence number but carry no audio. They were
treated as lost, so each one played an invented 20 ms frame (a glitch) and
pushed the buffer a frame deeper for drift correction to remove again.
Signature in the first live test: lost ~= drift-drops (74 vs 72 per minute).
They are now skipped and counted as 'padding'.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The cohost sounded jittery on the 2026-11-03 show. v1 skipped ahead on an
underrun and kept playing from an empty buffer, so after the first hiccup
every later wobble was another glitch. It also never corrected a slow guest
clock: ~12 glitches/min in simulation at 30 ppm slow.
- Underrun: hold the sequence position and refill to a larger target
- Drift correction both ways (drop/insert a frame in quiet moments),
quiet judged relative to the guest's own noise floor
- 80 ms start, 300 ms max, relaxes after 2 calm minutes
- Log 'rx 1m:' stats, the selected route, and call totals
- Ping the guest websocket every 25 s (the proxy closed it every 90 s)
- Simulation kept in test/jb_sim_test.go.txt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Go + Pion + libopus. One guest, live audio both ways, anonymous chat.
README for this version was not preserved; see the next commit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>