c382afe2a6
Linux parts (0L1-4L1 per TASKS_LINUX_WINDOWS.md): - native_bridge: FxGuiServer.cpp HTTP server (Winsock) — /frame BitBlt + PrintWindow fallback -> JPEG (libjpeg-turbo q70), /input PostMessage relay (mouse/wheel/key, coords scaled), /close, /ping; RenderFxJob fxGuiSetup + run_fx_gui_server (offscreen); main.cpp --fx-gui dispatch; vcpkg + CMakeLists WIN32-only + JPEG. - api: open_fx_gui embed flag spawn --fx-gui, parse SF_FXGUI_PORT -> embed_url, fx-gui/close endpoint; 4 unit tests. - ui: VstGuiEmbed component (frame refresh 100ms, ping 2s, input relay, scale coords) shared by MasteringModal + FXRackModal; swap graph<->GUI, cleanup on unmount, dead-bridge toast fallback. - docs: TASKS_LINUX_WINDOWS.md, WALKTHROUGH_WINDOWS.md, PLAN status. Windows tasks 0W1-4W1 remain (build + E2E real VST).
57 lines
3.0 KiB
C++
57 lines
3.0 KiB
C++
// native_bridge/include/RenderFxJob.h
|
|
#ifndef RENDER_FX_JOB_H
|
|
#define RENDER_FX_JOB_H
|
|
|
|
#include <string>
|
|
|
|
// Offline FX render mode (Phase 0 of PLAN_MASTERBUS_FX_RACK_VST.md):
|
|
// `daw_vst_bridge --render-fx <job.json> --in <input.wav> --out <output.wav>`
|
|
// reads a stereo WAV, runs the input through a chain of VST3 audio effects
|
|
// (audio-in/audio-out, NO MIDI) plus builtin DSP (gain/normalize), and writes
|
|
// a 16-bit stereo WAV. Same exit-code contract as --render: 0 ok, 1 job/argument
|
|
// error, 2 plugin load failure, 3 plugin crashed mid-render (SEH guarded).
|
|
//
|
|
// job.json: { sample_rate, block_size?,
|
|
// fx_chain: [
|
|
// { type: "vst3", path, preset_b64?, bypass? },
|
|
// { type: "builtin", id: "gain", params: { db } },
|
|
// { type: "builtin", id: "normalize", params: { peak } }
|
|
// ] }
|
|
// vst3: path = .vst3 module; preset_b64 = base64 of a .vstpreset FILE (raw
|
|
// SDK chunk format) or of the bridge state blob — both applied via
|
|
// setState before processing. bypass=true → slot skipped (passthrough).
|
|
// gain: multiply by 10^(db/20), block-wise.
|
|
// normalize: post-chain global pass — scale down to peak (0.95) only when
|
|
// the peak EXCEEDS it (mirrors render_project's clip guard).
|
|
int run_render_fx_job(const std::string& jobPath, const std::string& inPath,
|
|
const std::string& outPath);
|
|
|
|
// Plugin scan mode (Phase 1): `daw_vst_bridge --scan <dir>` walks <dir>
|
|
// recursively, loads every .vst3 module and classifies its classes
|
|
// (kVstAudioEffectClass without "Instrument" subcategory → effect, else
|
|
// instrument), and prints JSON to stdout:
|
|
// {"plugins":[{"path":"...","name":"...","is_fx":true,"is_instrument":false,"type":"VST3"}]}
|
|
// .dll/.so (VST2) cannot be introspected headlessly → classified as instrument.
|
|
// Returns 0 on success, non-zero on unrecoverable error (a single plugin that
|
|
// crashes the module loader is skipped, not fatal).
|
|
int run_scan_dir(const std::string& dirPath);
|
|
|
|
// GUI mode (Mastering/FX Rack → "mở VST GUI"): `daw_vst_bridge --open-fx-gui
|
|
// <job.json>` loads ONE VST3 effect plugin, opens its native editor window and
|
|
// runs a message loop until the user closes the window (WM_DESTROY), then
|
|
// detaches the view and exits 0. job.json: { "path": "...", "name": "..." }.
|
|
// Windows only. Exit codes: 0 ok, 1 job/argument error, 2 plugin load or
|
|
// editor attach failure.
|
|
int run_open_fx_gui(const std::string& jobPath);
|
|
|
|
// Embedded GUI server mode (Phase 0 of PLAN_MASTERBUS_VST_GUI_EMBED.md):
|
|
// `daw_vst_bridge --fx-gui <job.json>` — same plugin load + editor attach as
|
|
// --open-fx-gui but the host window is parked off-screen and a tiny HTTP
|
|
// server (FxGuiServer.cpp) serves JPEG frames (GET /frame) and relays pointer/
|
|
// key input (POST /input) so the web UI can embed the native GUI in a panel.
|
|
// Prints `SF_FXGUI_PORT=<port>` to stdout. Windows only. Exit codes same as
|
|
// --open-fx-gui.
|
|
int run_fx_gui_server(const std::string& jobPath);
|
|
|
|
#endif // RENDER_FX_JOB_H
|