Skip to content

quest: plan push-to-talk DTX, capture smoothing, and the DTX route spike - #7816

Merged
kixelated merged 9 commits into
mainfrom
quest-plan/ptt-dtx-latency
Nov 4, 2026
Merged

kixelated merged 9 commits into
mainfrom
quest-plan/ptt-dtx-latency

Conversation

@kixelated

@kixelated kixelated commented Nov 4, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

moq-dev/moq#7760 broke push-to-talk latency down on an ideal path (469 ms median press to audible, of which ~300 ms is the fixed playout delay the test pins and ~115 ms is headless Chromium's declared output latency). The maintainer asked how to improve it. Planning found the catalog toggle itself forces a round trip of jitter buffer, so the plan replaces push-to-talk's hold design with DTX.

Approach

Three new m1 quests under the Push-to-talk epic:

  • [S] dtx-route.md - measure silence suppression routes (gate before the encoder; WASM libopus; native WebCodecs DTX where the timeline holds) on Chromium, Firefox and Safari, then pick one with the maintainer.
  • [M] dtx.md - push-to-talk mutes by suppressing silence instead of flipping enabled in the catalog; listeners play comfort noise across the gap (no underrun, ignored by the jitter estimator); hold retires in the same change. Requires the route spike.
  • [S] capture-smoothing.md - the capture graph delivers frames on a steady cadence (today 25-109 ms bursts, read by "auto" as ~46 ms of jitter).

The epic README records the reversal of its 2026-10-28 "Hold, not DTX" decision and lists the children.

Decisions

Planned with the maintainer on 2026-11-04:

  • Goal: on an ideal path with the browser defaults ("auto", 20 ms Opus), press to audible (excluding device output) stays under a budget set from a real-device (kixtop) measurement, enforced by just test push-to-talk with the breakdown. ✅ Budget the default path / Measure auto, no budget / Just lower the fixed delay
  • Device output: ✅ measure on kixtop first / treat 115 ms as platform
  • Scope: ✅ browser only / both browser and native
  • Capture burstiness: ✅ reduce it / measure only
  • Test rows: ✅ defaults only / keep the fixed 300 ms row
  • Hold vs DTX: the maintainer would rather fix DTX and avoid the catalog toggle ("I kind of hate hold"). ✅ DTX replaces the toggle
  • DTX route: ✅ measure both (gate vs WASM libopus) first / gate before encoder / WASM libopus
  • Retire hold: ✅ when DTX lands / now
  • Gap playback: ✅ comfort noise / plain silence
  • Milestone: ✅ m1 / m2
  • Upstream: the repro shows a Chromium bug (Chrome 156 ends 14 s of DTX input at 8.92 s and ignores input timestamp jumps; Firefox keeps DTX right; Safari ignores usedtx). Workaround exists? ✅ yes: gate silence before the encoder and stamp chunks from our own inputs, now route 1 in dtx-route.md.
  • Filing: ✅ Chromium bug only (maintainer submits). A spec issue, w3c/webcodecs#986, was filed and then closed by the maintainer, because §5.6 already requires the input timestamp.
  • Tracking quest for the Chromium fix: ✅ m2 (quest/m2/chromium-opus-timestamps.md) / m1 / none

Latency quest

quest/m1/push-to-talk-latency.md (from #7760, now on main) becomes [M]: on an ideal path with the browser defaults ("auto", 20 ms Opus), press-to-audible excluding device output stays under a budget set from a kixtop measurement, enforced by just test push-to-talk with the breakdown. The fixed 300 ms / 60 ms row is dropped. It Requires dtx.md and capture-smoothing.md.

Impact

  • Public API: none. Wire: none. Quest files only.

Review

Codex (quest review --base origin/main, gpt-6.1-sol, medium), session 01a1a6e8 after merging main:

  • Round 1 on dc10c56226: one low finding, the m2 Chromium quest recorded its upstream wait only under Plan. Fixed: it now has a ## Waiting item naming Chromium, the check, and how to advance it.
  • Round 2 on 8ba6a58719: no findings.

Earlier sessions (01a1a4ff, 01a1a565) on a33ec406bf, 82da4b628e and 6b1df2021a: no findings.

Online reviews on 6b1df2021a, all fixed in dc10c56226: pullfrog's route-1 ✅ (it marked the confirmed workaround, not the pick; reworded so only the measured pick will carry ✅), Safari's "wasn't measured" (dated), and the stale m1 index entries for the push-to-talk epic and latency quest.

Checks

  • quest check --base origin/main: 617 documents ok
  • sh/markdown.sh check

🤖 Generated with Claude Code

kixelated and others added 6 commits November 3, 2026 21:19
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…timestamp bug

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ady capture

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated
kixelated marked this pull request as ready for review November 4, 2026 07:11
@coderabbitai

coderabbitai Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 57 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 4 included reviews currently available.

Learn how review limits work.

Review configuration:

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 185df6b0-3a32-4775-8a18-5eea6c5f5257
Commits

Reviewing files that changed from the base of the PR and between b50557d and 8ba6a58.

Files selected for processing: 8
  • quest/m1/README.md
  • quest/m1/push-to-talk-latency.md
  • quest/m1/push-to-talk/README.md
  • quest/m1/push-to-talk/capture-smoothing.md
  • quest/m1/push-to-talk/dtx-route.md
  • quest/m1/push-to-talk/dtx.md
  • quest/m2/README.md
  • quest/m2/chromium-opus-timestamps.md
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by review (OpenAI)

Reviewed head 6b1df20. No actionable issue found in the push-to-talk plan. The route comparison precedes DTX implementation, and DTX plus capture smoothing precede the measured latency budget; the documented encoder and timing behavior matches the inspected source.

Verification: GitHub-only static inspection of the quests and relevant audio paths. I did not run browser repros, latency measurements or tests; the reported measurements remain author-provided.

(Written by review (OpenAI))

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ℹ️ No critical issues; minor suggestions inline.

Reviewed changes

Reviewed the full seven-file quest-only diff at 6b1df20; no code, wire, or API changes.

  • Latency quest requalified - quest/m1/push-to-talk-latency.md is retitled [M] and now budgets press-to-audible on the browser defaults (delay: "auto", 20 ms Opus) from a kixtop measurement, dropping the fixed 300 ms / 60 ms row.
  • Epic decision reversed - quest/m1/push-to-talk/README.md records the 2026-11-04 reversal of "Hold, not DTX" because the catalog toggle costs a round trip, and adds the three child quests.
  • DTX route spike - quest/m1/push-to-talk/dtx-route.md plans a measured comparison of gate-before-encoder, WASM libopus, and native WebCodecs DTX across Chromium, Firefox, and Safari.
  • DTX implementation - quest/m1/push-to-talk/dtx.md replaces hold with silence suppression, comfort noise across gaps, and retires hold when it lands.
  • Capture smoothing - quest/m1/push-to-talk/capture-smoothing.md targets the 25-109 ms capture bursts that inflate "auto" jitter.
  • Chromium tracking - quest/m2/chromium-opus-timestamps.md and its quest/m2/README.md entry track the Chromium Opus timestamp bug that blocks native usedtx.

ℹ️ m1's index still lists the old latency quest

quest/m1/README.md:165 still carries the old title and the 469 ms / 300 ms rationale this PR retires, so the m1 index points at a goal that no longer exists. The quest file was retitled and retargeted here; the index needs the same line.

Technical details
# Stale m1 index entry

## Affected sites
- `quest/m1/README.md:165`: still lists "Push-to-talk's press-to-audible latency is chosen, not inherited" and "each part of an ideal-path press's 469 ms, chiefly the 300 ms delay and 115 ms device output, is reduced through its knob or kept with a reason".

## Required outcome
- The index entry matches the new `[M]` title and goal in `quest/m1/push-to-talk-latency.md`.

## Suggested approach
```markdown
- [Push-to-talk's press-to-audible latency fits a budget on the defaults](/quest/m1/push-to-talk-latency.md) - press to audible stays under a kixtop-measured budget on the browser defaults, enforced by `just test push-to-talk`
```

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

Comment thread quest/m1/push-to-talk/dtx-route.md Resolved
Comment thread quest/m1/push-to-talk/dtx-route.md Resolved
kixelated and others added 3 commits November 4, 2026 06:13
Address review: dtx-route.md no longer marks the gate-and-restamp route with
the pick's ✅, dates Safari's first measurement, and the m1 index describes
the reworked push-to-talk epic and latency quest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

Reviewed the delta since the prior pullfrog review at 6b1df20; quest-only, no code, wire, or API changes.

  • m1 index refreshed — quest/m1/README.md now carries the new DTX epic wording and the [M] latency-budget title/goal, so no stale 469 ms / 300 ms entry remains.
  • Route 1 un-picked — dtx-route.md no longer marks gate-before-encoder with ✅; it reads as a confirmed workaround, measured like the others and not yet chosen.
  • Safari note dated — dtx-route.md now says Safari wasn't measured until the 2026-11-04 repro, matching the result below it.
  • Chromium wait recorded — chromium-opus-timestamps.md gains a ## Waiting section naming chromium#581458361, the repro check, and how to advance it.

All three prior findings are addressed. sh/markdown.sh check passes and the new ## Waiting section matches the repo's existing convention.

Pullfrog  | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by review (OpenAI)

Reviewed head: 8ba6a58

The follow-up addresses the earlier review notes: the m1 index reflects the new latency goal, Safari's earlier unmeasured status is dated, and route 1 is identified as a confirmed workaround rather than the chosen route. No additional actionable finding in this quest-only delta.

Verification: GitHub-only static inspection of the plans and discussion. I did not reproduce browser behavior or measurements, run tests, or run quest context.

(Written by review (OpenAI))

@kixelated
kixelated added this pull request to the merge queue Nov 4, 2026
Merged via the queue into main with commit 3b7fa51 Nov 4, 2026
8 of 9 checks passed
@kixelated
kixelated deleted the quest-plan/ptt-dtx-latency branch November 4, 2026 14:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant