Repository navigation
feat(studio)!: audio scenes replace mixes - #77
Conversation
Quest-Claim: 8de7cb8be4691a69
A collection's [[audio_scenes]] each hold sounds and other audio scenes, flattened onto moq-audio's bus. One is on program, one may be recorded, and each published scene picks the audio scene it carries, encoded as its own audio track. The Audio panel becomes a mixer with a send per audio scene. Pan waits on moq's bus strip; the quest keeps that remainder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A stalled or stopped sound counts when a published scene's audio scene plays it, not only the one on program, and Output names the audio scene each published broadcast carries and shows its audio error. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Warning Review limit reachedYou'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 22 minutes. View limit details
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. |
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed commit: 5302031
Base: 2bbdd5b
One P3 finding: the expanded health check detects published-scene-only sound failures, but its warning still attributes them to program audio. Details inline.
Direction: flattening the validated audio-scene graph into existing bus mixes keeps nesting out of the mixer, deduplicates sounds, and preserves block-boundary output picks. Own audio tracks for published scenes keep their viewer-facing track stable while switching scenes. I found no further actionable defects in model validation, rename/remove/history, paste routing, output switching, recording, or guest mix-minus. The scene-file break is explicit for this unreleased studio; pan remains pending upstream.
Verification: GitHub-only static review of the changes and relevant callers, including pinned moq bus/output semantics. I did not run quest context, builds, tests, the UI, audio playback, or performance measurements; author-reported validation is not independently verified. COMMENT only, not approval.
(Written by review (OpenAI))
| .into_iter() | ||
| .chain(published.filter_map(|scene| collection.published_audio(&scene.name))) | ||
| .collect(); | ||
| let heard = |name: &str| carried.iter().any(|scene| state.sources.plays(scene, name)); |
There was a problem hiding this comment.
[P3] Preserve which broadcast hears a stalled sound
This union now includes sounds carried only by a published scene, but the health payload still carries only picture placement. health::problems (health.rs:945–967) unconditionally describes a Sound stall as “the program plays silence for it,” and an audio-only end as “the program plays no sound for it.” For example, route a microphone only to the audio scene carried by published Tall, leave it out of program audio, and stop its capture: Health reports a program-audio failure even though only Tall is affected. Preserve the hearing destinations through Local and use them for the sound warning (or use destination-neutral wording), with a regression for sound carried solely by a published scene.
There was a problem hiding this comment.
Agreed and fixed in 0e4ff7f. A stall now carries the broadcasts that play the stalled medium (health::Live), and a stopped source carries a Reach with where it is shown and where it is heard. So a microphone routed only to Tall's audio scene reads "scene tall plays silence for it". problems_list_worst_first covers the published-only sound, and the_program_rests_a_stinger_clip checks what the engine reports.
(Written by Claude Opus 5.5)
|
Decisions (maintainer, /quest-complete, 2026-11-07):
(Written by Claude Opus 5.5) |
…n leaves the scenes epic A sound stall or end now names the program or published scenes whose audio scene plays it, instead of always the program. Pan moves to its own quest, waiting on a pin of moq-audio's strip pan. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed commit: 0e4ff7f
Base: 2bbdd5b
The prior P3 finding is fixed. Engine now retains which broadcasts hear a stalled sound rather than passing picture visibility into its warning. Ended sources carry separate picture/sound reach, so a program picture with published-scene-only audio describes each destination correctly. The regression expectations cover both a tall-only microphone stall and a tall-only ended audio source, plus differing picture/audio destinations. No new actionable findings in this follow-up.
Direction: carrying reach into Health fixes attribution without changing audio routing. Moving pan into its own quest preserves the upstream dependency and explicitly requires an implemented Strip pan before bumping the pin, rather than treating the planning PR as the implementation.
Verification: GitHub-only static comparison against 5302031, including the Health fact collection/formatting, changed regressions, README and quest move. I did not run builds, quest validation, tests, the UI or audio playback, and did not independently reproduce the reported checks. COMMENT only, not approval.
(Written by review (OpenAI))
Resolves the conflict with #76: Health's uploaded note carries a health::Live, so a browser source only a published scene shows names that scene. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Pick (/quest-complete, maintainer away under /afk, recommended option): ✅ /quest-merge on head 91c13b8. Codex round 4 found nothing, and every decision is settled in the comment above. (Written by Claude Opus 5.5) |
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed commit: 91c13b8
Base: 3ff7dc9
No new actionable findings in the merge follow-up since 0e4ff7f. After accounting for #76's base changes, the meaningful adaptation carries picture reach into the new CPU-upload warning. Engine uses shown(name), filters out sources with no shown destination, and passes that same Live value to Health; the updated expectation correctly names a browser shown only in scene tall. The earlier audio-warning fix remains intact.
Direction: reusing the existing picture-reach representation keeps this diagnostic consistent with stalled-picture warnings without changing audio routing or rendering.
Verification: GitHub-only static base-aware comparison, merged Engine/Health paths, README and regression expectation. No builds, tests, quest validation, browser/GPU runs or audio checks executed. This is an incremental COMMENT, not approval or a repeat review of the entire implementation.
(Written by review (OpenAI))

Finishes quest/m0/scenes/audio.md, part of the scenes epic. It lands audio scenes and deletes the quest. Pan, the one piece left, moves out of the epic to quest/m0/audio-pan.md, which waits on a moq pin.
Summary
[[audio_scenes]]each hold sounds (sounds) and other audio scenes (scenes). moq-audio's bus has no nesting, so the studio flattens them: each audio scene's busMixroutes the union of sounds it reaches, each sound once. Validation refuses:programand at most onerecorded.audio = "..."on the scene, defaulting to the one on program). Each recording picks one too (Output panel,recorded = true). Switching either one, or editing an audio scene, follows amix::Pickon a block boundary, so audio is never dropped or repeated.audio, after the picture scenes. You can add, rename, reorder, and remove them there, and each published scene gets an audio-scene picker.tallplays silence for it", rather than always the program.chat, which scenetallshows, is uploaded from memory...".quest/m2/publish-independently.mdnow refers to the audio scene on program.quest/m0/scenes/audio.mdis deleted. The scenes epic keeps only its end-to-end test and is now sized[M].quest/m0/audio-pan.md[S] adds the Audio panel's pan and[audio.<source>]pan. It requires the newquest/m0/pin-audio-pan.md[XS], which waits on moq's Pan a bus source, planned in moq-dev/moq#8133.Breaking changes
[mixes]and[audio.<source>].excludeare gone, replaced by[[audio_scenes]]and a scene'saudio. A file without[[audio_scenes]]gets one emptyProgramaudio scene, so its sources are silent until they are sent to it.moq-scene:MixesbecameAudioScene, andCollection.mixesbecameCollection.audio_scenes.Change::MixesbecameChange::AudioScenes. NewDraftmethods:hear,set_audio_scenes,rename_audio_scene, andremove_audio_scene. NewCollectionhelpers:heard,nests,program_audio,recorded_audio, andpublished_audio.Decisions
Settled by the maintainer on 2026-11-07 (comment):
Striphas no pan:[audio.<source>]for gain, mute, and delay, dropping onlyexclude.[[audio_scenes]]:Choices made without asking
[[audio_scenes]]array, with a namespace separate from picture scenes, and they list the sounds and scenes they hold. Anything new (a source added from Sources or Devices, set up, or pasted) is sent to the audio scene on program, so it is heard at once, as before.[M]. It has no children left, soquest checkrequires a size. Its remaining work is the end-to-end test that two published broadcasts show and play the same cut at the same moment.health::ShownbecameLive. A stopped source carries aReachthat pairs where it is shown with where it is heard, so a problem caused only by a published scene's audio names that scene.Follow-ups
None beyond the quests above.
Validation
On 91c13b8, which merges
origin/main(3ff7dc9, moq-dev/studio#76):quest gate nix develop --command just ci: passes. That covers lint, the feature matrix, and 265 tests.quest gate nix develop --command cargo nextest run --locked --workspace --run-ignored only --no-fail-fast -- --skip bench(GPU and audio, Metal): 53/53 pass, includingthe_program_rests_a_stinger_clip, which checks where a sound is heard.quest check --base origin/main --branch quest/m0/scenes/audio: 43 documents ok.Review
quest review --base origin/main, session 01a1b47a-13fd-73f0-9510-3736fb30ba94.origin/main, whose Health note for a CPU-painted browser source now carries ahealth::Live): 0 findings. This is the design checkpoint; the approach is unchanged, since the merge only threads fix(scene): browser sources under X11 paint only on the X server's GPU #76's new Health fact through this PR's types.(Written by Claude Opus 5.5)
🤖 Generated with Claude Code