Native Runtime

This directory is for the hot path.

Crates

  • reservoir: the first native five-second spatiotemporal reservoir core. It owns one shared-edge rolling buffer with typed sample views. Fensalir/Faust integration should build on this invariant instead of copying the deadline bridge cache. It exports rlib, cdylib, and staticlib artifacts plus the C header at reservoir/include/localcast_reservoir.h.

Reservoir ABI

The reservoir ABI is intentionally small:

  • LocalcastReservoir is opaque.
  • localcast_hash_source_id is the stable FNV-1a source-id hash used before creating producers. Empty or null source ids hash to zero and are rejected by producer creation.
  • localcast_producer_create_for_source is the preferred producer constructor for adapters that have source-id bytes; it hashes through the same native authority before creating the producer.
  • LocalcastSampleHandle is sample metadata plus a payload_handle and provenance flags. Live samples must have flags == 0; diagnostic or unknown flagged samples are rejected by the live reservoir.
  • Sample kind ids match the Perfect Machine reservoir views: camera frame, camera feature, scene ray, surface claim, material claim, audio block, phase claim, event claim, and render packet.
  • The reservoir can create/destroy, push, set/query edge, query window start, count the whole rolling buffer, count a typed view, read samples by total buffer index or typed-view index, and fetch the latest sample for a sensor hash inside a typed view.

Runtime ABI

LocalcastRuntime is the live spine for Fensalir/Faust integration:

  • it owns one native reservoir;
  • it exposes typed producer functions for camera frames, camera features, scene rays, surface claims, material claims, audio blocks, phase claims, event claims, and render packets;
  • it exposes LocalcastRuntimeStatus so Fensalir/Faust can inspect the shared edge, window start, total sample count, and typed-view counts without polling JSON or MessagePack files;
  • it exposes total and typed-view sample reads so Fensalir/Faust can consume the same rolling window producers append to.

LocalcastProducer is the native ingress helper for capture workers:

  • it owns sample kind, source hash, and monotonically increasing sequence;
  • it creates live sample handles with flags == 0;
  • it appends into LocalcastRuntime without letting hardware adapters invent reservoir metadata.

LocalcastAudioBlockDescriptor is the first typed payload descriptor:

  • it describes the caller-owned audio block handle, frame count, channel count, sample rate, sample format, start sample, and channel-layout hash;
  • localcast_producer_push_audio_block only accepts AudioBlock producers and stores the descriptor pointer as the sample payload handle;
  • the reservoir still does not copy or own audio memory.

LocalcastRenderPacketDescriptor is the visual equivalent:

  • it describes the caller-owned point buffer handle, point count/stride, target dimensions, source-time span, presentation time, audio-alignment time, and an optional metadata handle;
  • localcast_producer_push_render_packet only accepts RenderPacket producers and stores the descriptor pointer as the sample payload handle;
  • Fensalir owns decoding and GPU upload. The reservoir only indexes when this render packet exists in the shared rolling window.

LocalcastRenderPoint is the fixed point-buffer element shape for the initial native/Fensalir render path. It carries a stable-key hash, source timestamp, position, radius, color/alpha, and confidence. Richer material/brush payloads can get their own descriptors later; this point shape exists to kill the old JSON/CultCache render-frame dependency first.

Payload handles are owned by the caller. Fensalir should treat them as handles to GPU/native visual memory; Faust/native DSP should treat them as handles to audio buffers. This crate does not interpret those bytes. It is the clocked retention authority, not the renderer or DSP engine in a tiny hat.