// bridge_marshal.h — PURE marshalling helper for the REAPER VST-host bridge read. // NO VST3, NO REAPER types at the boundary. // // The bridge shell (reaper_bridge.cpp) resolves REAPER API functions by name over the // host callback and invokes them; the one fiddly-and-easy-to-get-wrong part around // GetProjExtState — interpreting its int return against the buffer it filled — is pure // and unit-tested here. Mirror of capture_paths / wav_trim splitting the arithmetic out // of a REAPER-facing shell. // // The S1 spike ALSO carried a string-scan JSON reader (extractJsonStringField) as a // stand-in until the instrument could parse the bank properly. S4 retired it: the // instrument now parses the "reasampler" bank blob through the SHARED bank_book / // bank_model JSON path (sample_map.cpp), so there is no second JSON parser. This module // is back to its one honest job — the API-return decode. // // Verified against vendor/reaper-sdk/sdk/reaper_plugin_functions.h: // int GetProjExtState (ReaProject*, extname, key, valOutNeedBig, valOutNeedBig_sz); // -- returns the length written (0 when the key is absent). #pragma once #include #include namespace reasampler::vst { // Interpret a GetProjExtState result: the int return value (bytes the API reports for // the key) and the buffer it filled. Returns the value only when the API reported a // non-empty result AND the buffer is non-empty — REAPER writes 0 and leaves the buffer // untouched for an absent key, and we must not treat stale buffer contents as a hit. // // `apiReturn` is GetProjExtState's return; `buffer` is the NUL-terminated string it // wrote (already truncated to the C string by the caller). std::optional decodeGetProjExtState(int apiReturn, const std::string& buffer); } // namespace reasampler::vst