Native interop
Read an analyser from the owned output without a second speaker route.
AudioBits API · 0.1.3 · Available on npm.
Native access requires startup. The engine already connects master output to the destination; keep a tap's output unconnected to avoid duplicate audible routing.
import { createAudio } from "audiobits";
const audio = createAudio();
let detach: (() => void) | undefined;
let analyser: AnalyserNode | undefined;
export async function attachFromGesture() {
await audio.start();
const native = audio.native;
analyser = native.context.createAnalyser();
detach = native.connect(analyser);
const samples = new Float32Array(analyser.fftSize);
analyser.getFloatTimeDomainData(samples);
return samples;
}
export async function dispose() {
detach?.();
analyser?.disconnect();
await audio.dispose();
}Call this single attachment helper once per engine. The tap helper rejects foreign contexts, duplicate taps, the output itself, and destination connections. Detach is idempotent. A continuous host visualizer must also cancel its animation frame and pause updates when hidden or reduced motion is requested.
Caller-created nodes, sources, and events remain caller-owned. Stop unmanaged
sources explicitly; stopAll() covers only managed voices. Dispose or disconnect
your nodes before engine teardown. Native graphs are not serializable recipes.
The vanilla workspace demonstrates a continuous analyser readout; the gallery
uses textual playing-state feedback without an additional visualization library.