Repository navigation
Comms: Zoom talkback station in Pro (ZComms port, SDK 7.1.5, Private comms) - #1207
Merged
Merged
Conversation
Ports the ZComms talkback station into Pro's Zoom engine, byte-identical to CoreVideo Edge's native/zoom-engine comms files @ Edge 28c06bc (engine-comms, engine/comms/** incl. mic_guard, fake-comms, miniaudio). Pro-specific hooks in main.cpp / fake-engine.cpp: start, handle_line first, on_meeting_status first in onMeetingStatusChanged, set_capture_only from the join line (Pro joins are never capture-only, so the operator's meeting mic is never touched), shutdown before Leave/CleanUPSDK. Media core: ZoomCommsRelay (Edge's CommsRelay verbatim) validates the shell's comms-* requests (key/latch with leaseMs, assign, mic, sidetone-out, sidetone, tone, gain, release-all); JsonRpcServer answers them lock-free (no coreMutex, no assembly slot); key-ups are urgent in the mailbox. The engine's comms_state is re-keyed to camelCase in ZoomEngineRuntime and pushed as a latest-wins "zoom-comms-state" fact on the zoom pump (repeated 1/s while held; comms:null on Leave, engine loss and restart). Build: Meeting SDK 7.1.5.43953 (scripts + docs); comms libraries in native/CMakeLists.txt (NOMINMAX scoped to the comms TUs). Tests: 45 native comms tests (relay, core, protocol, mic guard, ported ZComms, runtime). scripts/probe-comms.mjs drives the real core against the fake engine end to end (40 checks). Real Zoom talkback is untested. Docs: docs/reference/comms-talkback.md, CLAUDE.md row + SDK line, engine README. Co-Authored-By: Claude Opus 5.5 <[email protected]>
A Comms tab (after Audio) driven by the core's zoom-comms-state facts: a cell is a talk key (TalkKey: press = down, release/capture loss = up, Click never used, hover/pressed visuals suppressed so colour is engine truth), ALL CALL, Latch, Edit talent with one chip per channel, Settings (mic, sidetone output, sidetone/tone, gain, station counters), lamps LINK/MTG MIC/CHANNEL/TX, one-line ops strip that expands to history. Explicit not-in-meeting / waiting / not-up (verbatim reason) states. CommsViewModel carries Edge's behaviour and JSON; cells, people, device pickers and ops history are synced in place (ObservableCollectionSync, no Reset) and only on a structure change, so a press never loses its release. Held keys are leased (1500 ms, renewed every 500 ms); every key goes up on focus leaving the page, window deactivate, tab change, meeting end or a dropped report; shutdown sends comms-release-all. Digits 1-9 and Space are panel-scoped. Colours are Pro tokens only: on air = StudioAirBrush (Pro's on-air red) with StudioBackgroundBrush text, armed = StudioWarningBrush. MediaCore: ZoomCommsProtocol (verbs, state parser, reply), IZoomCommsTransport on MediaCoreBridgeService, supervisor push of zoom-comms-state, key-ups on the EngineHost reserved lane. Probe: CoreVideoPro.WinUI.exe --verify-comms-page (offscreen, no core), added to scripts/test-studio-layout.ps1. Tests: CommsViewModelTests (29), ZoomCommsProtocolTests (8). Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Owner ruling 2026-11-10. A "Private comms" strip button, OFF by default and
persisted (ProductionOutputPreferences.CommsPrivate):
- ON: the meeting mic becomes the never-fed silent virtual mic exactly like
the capture-only path (MicGuard: operator muted at once, HasRawdataLicense,
unmute only after onMicInitialize, 5 s timeout stays muted with the
"Talkback is silent" reason, drop = release then mute).
- OFF (and ON -> OFF): setExternalAudioSource(nullptr), operator left MUTED,
never auto-unmuted; the ops log says so. A non-capture-only meeting ending
also removes the silent mic.
Engine (shared with Edge): comms_private {"on"} verb; MicGuard install
condition is capture_only || private_on, new Act::Mute / Act::Uninstall,
private on again retries after a give-up, capture-only ignores private;
CommsCore keeps the request across meetings and reports comms_state.private
(capture_only || requested); fake engine runs the real MicGuard over a
scripted SDK (COREVIDEO_FAKE_SILENT_MIC=never, COREVIDEO_FAKE_OPERATOR_MUTED=1,
fakecomms::SetCaptureOnly from the join line; default capture-only).
Core: comms-private relayed (OFF never refused, urgent lane). Shell: toggle,
persistence, re-assert when a report disagrees (at most every 2 s).
Tests: MicGuard +7, CommsCore +1, CommsProtocol +1, CommsRelay +1,
CommsViewModel +4, ZoomCommsProtocol updated; probe-comms 53/53 incl. the
private on/off/never-unmute sequence; page probe checks the toggle.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Adds a Comms tab to Pro: ZComms-style talkback to talent in the meeting, built in Pro's own look. The operator presses a key to speak privately to one person, a group, or everyone (ALL CALL), and talent hears it through Zoom.
Talkback runs inside Pro's own Zoom engine. It has to: Zoom allows one participant per process, and a second app joining on the same account collides with it.
Changes
engine-comms,engine/comms/**, fake comms). CoreVideo Edge uses the same files byte-for-byte; Edge PR Redesign CoreVideo Pro UI with tabbed top-bar layout #5 is merged.IMeetingTalkbackController.comms-*commands. The core sendszoom-comms-stateevery second, and null on leave.Tests
--verify-comms-page) passes.Not proven
Nothing here has been run in a real Zoom meeting yet. Before relying on it, one session with Pro's account as host or co-host and a guest on the Zoom desktop app should confirm:
The EngineHost path does not relay Comms state yet.
🤖 Generated with Claude Code