38 lines
1.9 KiB
C++
38 lines
1.9 KiB
C++
// 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 <optional>
|
|
#include <string>
|
|
|
|
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<std::string> decodeGetProjExtState(int apiReturn,
|
|
const std::string& buffer);
|
|
|
|
} // namespace reasampler::vst
|