// instrument_bake — the instrument's half of the resample chain: render the dialed sound // offline, stage it outside the bank, ask the extension to bank it, then re-point and go // neutral. UI thread only; nothing here is on any audio path. // // The extension is REQUIRED. Without it the bank has no writer, so the affordance reads // Disabled and this refuses rather than half-baking. #pragma once #include namespace reasampler::vst { class ReaSamplerProcessor; class ReaperBridge; // Whether a bake can run at all right now: a REAPER host, and the extension's bake action // registered. Runs one NamedCommandLookup and builds one std::string per call — cost // unmeasured. It is on the editor's sync tick because that is where the button's paint // state is decided, and the control must never be enabled and then refuse. bool bakeAvailable(ReaperBridge& bridge); struct BakeChainResult { bool ok = false; std::string message; // always populated — the editor prints it either way }; // Runs the whole chain against `processor`. On failure NOTHING has changed: no temp file // survives, no bank entry was added, no assign was written, and the dialed state is // exactly as it was before the click. // // MUST NOT be called from a mouse handler. It invokes a REAPER action synchronously — an // offline landing nested inside a click, with the mouse captured, re-pointing the very // instance whose frame is on the stack. The editor defers it to its own timer tick. BakeChainResult runBake(ReaSamplerProcessor& processor); } // namespace reasampler::vst