Skip to content

feat(studio,core,player): stream VST-processed audio in the studio player - #2922

Open
vanceingalls wants to merge 1 commit into
vst-2-engine-bouncefrom
vst-3-studio-preview
Open

feat(studio,core,player): stream VST-processed audio in the studio player#2922
vanceingalls wants to merge 1 commit into
vst-2-engine-bouncefrom
vst-3-studio-preview

Conversation

@vanceingalls

Copy link
Copy Markdown
Collaborator

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 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 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 VstHostApi contract now lives in propertyPanelVstShared (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 in propertyPanelVstShared; only the import path changed.

Deletions in this PR: 15 lines.

🤖 Generated with Claude Code

…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.

Copy link
Copy Markdown
Collaborator Author

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