Skip to content

Key meeting-mix at a synthetic id, not the first roster guest (#465) - #488

Merged
iamfatness merged 2 commits into
mainfrom
codex/fix-465-meeting-mix-anchor
Sep 11, 2026
Merged

iamfatness merged 2 commits into
mainfrom
codex/fix-465-meeting-mix-anchor

Conversation

@iamfatness

Copy link
Copy Markdown
Owner

Fixes #465. Owner, live: Jamal's isolated audio never arrives (channel silent while talking); meeting mix is clean. Diagnostic on beta-2026-09-11-404602b (Extra logs on ~90s): isolate for Jamal (16778240, roster[0]) is subscribed, the engine writes audio_one_way_frame_received (byte_len=960, count 1→1250), the core opens that ring — and the mixer strip stays inputRmsDbfs=-120 (status=silent, not waiting-for-pcm). Susan Cho's isolate on the same path meters -37.

The bug. ZoomMediaSpinePayloadBuilder keyed meeting-audio at participants[0].sdkUserId. Mix uuid was meeting-audio-16778240-program — the same Zoom user as Jamal's isolate. Mix subscribe is Zoom's mixed callback (no user id); sharing a guest id made that guest's isolate strip measure silence.

The fix

  • Shell/spine. Meeting-mix participantId is synthetic numeric "0" (MeetingMixParticipantId), not a roster guest. Uuid is stable meeting-audio-0-program (no roster-anchor mix churn).
  • Core ingest. Mix PCM with participantId == 0 is ingested as zoom-mix. Isolate still requires a real Zoom user id.
  • Fake engine. Accepts pid 0 only for meeting-audio-* so the 330Hz mix tone still runs in tests.

Tests (proven red on old code, then green)

  • C#: MeetingMixIsNotKeyedToTheFirstRosterParticipant — Expected 0, Actual 16778240 on the old builder. LiveCase478_AudioIsSubscribedForTheSameSourcesAndNobodyElse mix id Host → "0". Speaker-flip signature meeting-audio:0:program.
  • Native: IngestsDedicatedMeetingMixPcmWhenParticipantIdIsZero; MeetingMixUsesDedicatedNonIsolatedAudioSubscription uuid meeting-audio-0-program. ZoomEngineRuntime.* 29 passed; MediaCore 2205 passed.
  • Review: one pass, no Critical/High.

Live check. Per the batch plan, one beta at the end. On that beta, python scripts/qa/live-check-sources-audio.py then Extra-logs: Jamal talks → isolate strip meters (not -120); mix uuid is meeting-audio-0-program.

Jamal (roster[0]) isolate was subscribed and the engine wrote one-way
frames, but the mixer strip measured digital silence. Meeting-mix was
keyed to participants[0], so Zoom''s mixed subscribe used his user id.

Key meeting-audio at numeric 0 (not a guest). Ingest mix PCM when
participantId is 0 so zoom-mix still receives the mixed callback. Fake
engine accepts pid 0 only for meeting-audio.

Tests were proven red on the old builder (Expected 0, Actual 16778240)
and green after.
@iamfatness
iamfatness merged commit af7a787 into main Sep 11, 2026
18 of 19 checks passed
iamfatness added a commit that referenced this pull request Sep 12, 2026
* docs(backlog): reconcile with main and the issue tracker

Three things the file and the tracker disagreed on, all verified against
main @ eefee0c and `gh issue`/`gh pr` state. No re-ranking.

- T1.17 (#479) was still the next open Tier 1 item. It is closed by #490,
  which is on main. Moved to Done; the open order renumbers 1-3, so the
  top of the list is now T1.11 (#449), T1.12 (#475), T1.13 (#473).
- T3.8 (#482, ISO crops/pads a guest on a mid-recording frame-size change)
  was filed 2026-09-11 with no tier row, against this file's own rule that
  a new defect gets an issue AND a row. Placed in Tier 3 as a proposal,
  labelled as such — the tier is not an owner ruling.
- The "shipped in beta-2026-09-11-404602b" line covered the whole Done
  table, but T1.14-T1.17 (#487, #488, #489, #490) merged after that beta
  was cut. Each one's Done row asks for a "live check with the batch
  beta", and no such beta exists yet. Said so explicitly.

Also noted why Tier 3 has no T3.6 (#465 was promoted to T1.15).

Separately, #432 (T1.5) was closed on GitHub: #462 said "Fixes #432" and
merged as 3a3bedf but never auto-closed it, so the issue contradicted
this file's Done row. #457 (T1.7) has the same unclosed-by-#462 shape but
is left open deliberately — its own PR says the real check is a long
in-meeting close, which has not run.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014yuH7EMvWCWdkhvevrtMyJ

* docs(backlog): the batch beta exists; T1.11 step 2 shipped

beta-2026-09-12-aac2d98 is cut and published, so the "live check with the
batch beta" that T1.14-T1.17 each name is now possible. It is still OWED:
none of those fixes, nor T1.11 step 2, has been seen in a real meeting, and
none may be ranked verified until it has. Build provenance recorded next to
the claim so a later reader can tell what the beta actually proves.

T1.11 stays at order 1 and drops from "S then M" to "S": #492 shipped step 2
(the warm cue decoder is handed to Program), so a clip cued in Preview no
longer flashes. Step 1 remains for a clip taken without a cue, which has no
warm decoder to adopt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014yuH7EMvWCWdkhvevrtMyJ

---------

Co-authored-by: Claude <noreply@anthropic.com>
@iamfatness
iamfatness deleted the codex/fix-465-meeting-mix-anchor branch October 1, 2026 23:45
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.

One guest's (Jamal) audio is distorted and low quality in CoreVideo; the meeting audio is clean

1 participant