AUDIO
Source snapshot · 12 October 2026

Prepared native planar processing

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.