AUDIO
Source snapshot · 12 October 2026

Explicit CLAP discovery and trusted loading

Native parameter output and the preparation builder

HostedGraphNodeBuilder::new(options) selects main-only audio by default. with_port_mode, with_transport_enabled, with_parameter_input and with_parameter_output select independent explicit profiles before prepare (f32) or prepare64. The original factories keep their contracts. Validation, metadata queries and storage allocation happen on main; failed preparation retains the inactive instance. Configure exactly matching input/output event capacities, with 1..4096 slots for each selected parameter direction.

Output mappings allow both writable and read-only native IDs. Each direction has unique native/graph identities, checked against current metadata. Native global parameter output maps to plain portable f32 values; f64 values round and must remain finite/in-range/integral when stepped. Full native f64 parameter precision is not preserved. Typed mapped output checks native ranges, offsets, order and capacity. Any rejection poisons the block: audio/output events clear and BackendFailure reports nonrollback native history. Unmapped, unsupported or per-note output is intentionally filtered and counted. Cookies are never retained. The native ABI still requires valid plugin event memory; this is not crash isolation.

filtered_native_events and rejected_native_events are independent relaxed counters. Successful block counters/status require accepted mapped output; native processing/steady time may advance on an output fault. Zero-frame output profiles explicitly dispatch active parameter flush even without input, then publish mapped output at offset zero. Flush counters count dispatch, not plugin acknowledgement. Audio-only/input-only profiles retain void output behavior. No retry, rescan, recording/GUI scheduler, per-note/MIDI/modulation/gesture output is added here.

For graph routing, prepare explicit event edges from host to the input node and node to host (or subsequent nodes). Outer/native node output capacities must match the graph's prepared routing contract. The public probe maps input graph ID 9001 to native gain 1 and read-only native output 2 to graph ID 9100:

CARGO_BUILD_JOBS=2 cargo build --release -p ravet-host --example parameter-fixture --locked
CARGO_BUILD_JOBS=2 cargo run --release -p ravet-host --example hosted-graph --locked -- \
  --f64 --parameter-io target/release/examples/libparameter_fixture.dylib org.ravet.host-parameter-fixture

It verifies the last requested gain at frame 15 for each normal block and gain 4 at offset zero after flush, through two graph instances/wet-dry swaps. This is synthetic macOS arm64 actual-binary evidence, without broad plugin/device/DAW/ platform/deadline claims. See decision 0113.