C++ native client¶
Apple-SDK consumers can adopt complete schema/control/text and isolated state preflight through the native AUv2 helpers. Their normalized-f32 parameter policy and CONTROL CF ownership are separate from processor precision, rendering, SDK queues and host notifications.
include/RavetNativeClient.hpp supplies SDK-independent C++17
ravet::native::NativeProcessorClient. Construct it on control from the native
processor table and optional direct audio-state/telemetry tables. It validates
exact v1 shapes, needed callbacks, counts/precisions and exact originating
core table addresses, creates companion caches, then the processor. Invalid profiles
or factory failures stay invalid, with acquired partial resources retired on
stopped destruction. Tables/library/types remain alive throughout; no copy/move
or hidden state/mailbox/codec is introduced.
Companions must return the exact supplied core address. Byte-identical copied
core tables with equivalent callbacks reject before cache/processor acquisition;
use canonical runtime acquisition instead. This corrects the earlier weaker
callback-equivalence policy and does not authenticate arbitrary foreign code.
A violating foreign CONTROL acquisition/query exception is contained with balanced
earlier resource retirement; native callbacks/destruction must still not unwind.
See exact client acquisition. Exact type/library
pairing remains a caller obligation. Query valid, hasAudioState, hasTelemetry and capability counts
before using optional interfaces. Missing/invalid interfaces return rejection,
leaving their output fields unchanged.
Control preparation/deactivation/destruction and exclusive processing/reset/ timing/state/telemetry calls forward the underlying native contracts and codes. Cached parameter/telemetry info supports shared reads. Foreign ranges remain live, aligned and disjoint under those contracts; retire after all borrowers stop. Normal forwarding uses no C++ heap actions, locks or I/O; native/consumer hooks retain their real-time duties and result/silence/poison semantics. Complete recall scheduling is explicit, with no inferred revisions, publications or retries.
Gain's actual VST3 processor uses separate precision-matched clients and tagged global events. Its control setup prepares storage and marks state pending; the first fully validated callback, including zero-frame flush, applies the current complete published state. Post-process snapshot feeds its existing generation/CAS reflection so newer controller restores win and unchanged state preserves ramps. Separate telemetry retains meter IDs/display policy and host-mediated editors. Program expansion, controller codecs/31-bit generation policy, SDK factory/buses/ editor and legacy public C exports remain consumer responsibilities. VST3 block-start transport uses the separate helper below; performance/scoped input and generated-event mapping remain independent work. See decision 0157.