#pragma once // ext_keys — the SINGLE SOURCE OF TRUTH for the "reasampler" project ext-state // namespace + key names, shared by the extension (writer, via shell/persist) and the // VST3 instrument (reader, via the bridge), so the wire contract cannot drift // between the two artifacts. // // PURE HEADER: NO REAPER/VST3/SWELL/vendor types. Key spellings are string // constants; the namespace is channel-derived (delegates to app_version, also SDK-free). // // FOREVER-STABLE once shipped: these strings key every already-saved project's // stored state. Changing any of them orphans that state. See // shell/persist/ext_state_io.h for per-key retirement/migration semantics. #include "core/version/app_version.h" namespace reasampler { // Channel-derived so the extension (writer) and the VST3 instrument (reader) // resolve the SAME namespace per channel ("reasampler" / "reasampler_beta") — // without this a beta instrument would read the stable namespace and see nothing. inline const char* kProjExtNamespace() { return version::extStateNamespace().c_str(); } // The whole serialized BankBook (pool + named banks) — read-only by the VST3 // instrument. ext_state_io documents the legacy-key migration around it. inline constexpr const char* kProjExtBanksKey = "banks"; // The retired legacy single-bank key (read once on load to migrate into the pool). inline constexpr const char* kProjExtIndexKey = "bank_index"; // The Design-View model key. inline constexpr const char* kProjExtViewKey = "view_state"; // The docked panel's tail-setting key. inline constexpr const char* kProjExtTailKey = "tail_setting"; // The per-project minted-GUID identity key. inline constexpr const char* kProjExtGuidKey = "project_guid"; // The EXTENSION stamps a monotonic counter here, bumped on every bank-content // mutation that changes what a live instance would PLAY. The VST3 instrument reads // it on a UI-timer cadence and calls reloadInstrument() on a change; it never // writes this key. Additive: an absent stamp reads as generation 0 (pre-existing // projects). FOREVER-STABLE — changing the spelling resets every shipped instance's // change-detection baseline (a one-time spurious reload). inline constexpr const char* kProjExtBankGenKey = "bank_generation"; // The EXTENSION writes an assignment request here after an ingest-with-assign: // "the active sampler instance should now play THIS sample." Value is the pure // assignment_request wire format ("rsassign1" + bankId + sampleId + generation). // The instrument reads it to update its own selection and reload; it never writes // it. FOREVER-STABLE — changing the spelling strands any pending request an // already-shipped instrument watches. inline constexpr const char* kProjExtAssignKey = "assign_request"; // The INSTRUMENT writes one key per instance — "rsusage_" — carrying // the sample_usage wire record of every capture that instance holds; the EXTENSION // enumerates the prefix at prune-scan time so a held capture can never be pruned. // This is one of the TWO sanctioned instrument-side ext-state writes (the bake // request below is the other; neither mutates banks/view/tail/assign, and the // bridge's write entry points structurally accept only these two prefixes). The // "rs" qualifier keeps a future "usage_*"-prefixed key from being // swept into the FX-liveness fold. FOREVER-STABLE — changing the prefix strands // every saved project's usage records (prune falls back to bank-references-only // until instances republish). inline constexpr const char* kProjExtUsageKeyPrefix = "rsusage_"; // Shared by the instrument's writer and the extension's enumerator. inline std::string usageKeyFor(const std::string& instanceGuid) { return std::string(kProjExtUsageKeyPrefix) + instanceGuid; } // The resample bake's one key per asking instance — "rsbake_". The // INSTRUMENT writes the request here and the EXTENSION writes its outcome back over the // same key, within one synchronous action invocation; the instrument then clears it. The // second of the two prefixes the instrument may write (the guard itself lives in // reaper_bridge.h). Nothing durable is keyed off this spelling, but a stale value from a // crashed session must still decode or be ignored — so treat it as fixed anyway. inline constexpr const char* kProjExtBakeKeyPrefix = "rsbake_"; inline std::string bakeKeyFor(const std::string& instanceGuid) { return std::string(kProjExtBakeKeyPrefix) + instanceGuid; } } // namespace reasampler