feat(studio,core,player): stream VST-processed audio in the studio player - #2922
Open
vanceingalls wants to merge 1 commit into
Open
feat(studio,core,player): stream VST-processed audio in the studio player#2922vanceingalls wants to merge 1 commit into
vanceingalls wants to merge 1 commit into
Conversation
…ayer Wires the browser half of the pipeline. The sidecar returns processed PCM over one WebSocket, which a ring buffer feeds to an AudioWorklet so a track plays its wet signal in preview. The whole app shares exactly one sidecar connection, mounted once in NLEProvider and handed to consumers through context. The wire protocol cannot safely tell two independent connections apart, so a second connection is a correctness problem, not just overhead. Because the worklet now owns a VST track's audio, the element itself must stay muted. Every place that writes .muted or .volume across media elements — the runtime control bridge, the player's parent-media adoption, the timeline scrub helper — skips elements marked data-vst-chain. Without that, an unrelated volume or mute change silently swaps the processed stream back for the untreated one. STUDIO_VST_ENABLED gates the surface off by default from its first commit, so no partially-wired FX UI is reachable while the stack lands. The VstHostApi contract lives in propertyPanelVstShared (a plain module) rather than in the panel component, so these hooks no longer import their own interface back out of the UI layer.
This was referenced Jul 31, 2026
Collaborator
Author
|
Warning This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
This stack of pull requests is managed by Graphite. Learn more about stacking. |
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.

Stack 4/5 — replaces #2602–#2605. Base: #2921.
The browser half of the pipeline. The sidecar returns processed PCM over one WebSocket; a ring buffer feeds it to an
AudioWorkletso a track plays its wet signal in preview.The whole app shares exactly one sidecar connection, mounted once in
NLEProviderand handed to consumers through context. The wire protocol cannot safely tell two independent connections apart, so a second connection is a correctness problem, not just overhead.Because the worklet now owns a VST track's audio, the element itself must stay muted. Every place that writes
.mutedor.volumeacross media elements — the runtime control bridge, the player's parent-media adoption, the timeline scrub helper — skips elements markeddata-vst-chain. Without that, an unrelated volume or mute change silently swaps the processed stream back for the untreated one.STUDIO_VST_ENABLEDgates the surface off from this commit, not from a trailing PR, so no partially-wired FX UI is reachable while the stack lands.One structural change vs. the original
The
VstHostApicontract now lives inpropertyPanelVstShared(a plain module) instead of being re-exported from the panel component. The transport hooks were importing their own interface back out of the UI layer, which made this layer impossible to land without the panel. The types were already defined inpropertyPanelVstShared; only the import path changed.Deletions in this PR: 15 lines.
🤖 Generated with Claude Code