openmixer — generated API reference
    Preparing search index...

    Interface BuiltinDspMirror

    The handle installBuiltinDspNativeMixerMirror returns (task #125).

    interface BuiltinDspMirror {
        insertPoints: NativeInsertPointControl;
        assertAll(): void;
        pollSampleRate(): void;
        pushChainOrder(
            channel: ChannelId,
            chain: readonly Processor[],
        ): ProjectionResult | undefined;
        pushStageOrder(channel: ChannelId): ProjectionResult | undefined;
    }
    Index
    insertPoints: NativeInsertPointControl

    The native node's INSERT POINT door, in the shape the engine takes it (import('@freemixer/audio-engine').NativeInsertPointControl) — arm a strip's send/return port pair at a declared place, and say whether a chain is LIVE between them.

    It lives HERE, beside pushChainOrder, because both answer the same question about the same strip: the order says WHERE in the walk the detour sits, this says what the detour is made of. The lane resolver is the one both use, so the two can never address different slots.

    • Push EVERY channel this node carries a lane for — every input strip AND main/1 — onto that lane, from the state the store RESOLVES (its stored value, or the console default it would seed with). Absence in a store means "the default", and the default is PUSHED, never assumed. The same law the head-amp arrival re-assert already follows (southbound actuator contract §6c), applied to the built-in DSP.

      WHY (rig, 2026-08-05). Audio cut on quiet passages for an hour. PipeWire reported 0 xruns and 0 graph events, and every dynamics row — MAIN's included — read { on: false }; the operator's ear named it ("it sounds like a gate is activated") and toggling MAIN's gate ON then OFF stopped it, because that toggle's ONLY effect is a push. A lane was running a value no row claimed, and nothing in the console would ever have corrected it: every push was TOUCH-driven — this installer swept gate.snapshot() / eq.entries(), which hold only channels an operator has moved, and a session restore drove only the channels whose stored snapshot carried an eq/gate/comp block. MAIN is the channel most likely to be untouched, and a lane outlives every session load, so a divergence once introduced was permanent AND invisible. Asserting the whole console at boot and after every restore closes it: the lanes are MADE to say what the rows say instead of being trusted to.

      Cheap and idempotent — one push per processor per lane, the same calls a PATCH makes.

      Returns void

    • Compare the live-rate provider's CURRENT reading with the rate the strips' EQ cascades were last swept at and, on a change (the RME flipping 48 kHz → 192 kHz mid-session), re-push EVERY input strip's EQ with freshly designed coefficients. Cheap when the rate is stable (one provider read + one compare), so it rides an EXISTING periodic path — the adapter's meter poll via RateWatchingNativeMeterSource — never a new timer. Gate/comp are deliberately NOT re-pushed: their attack/release cross to the native side as milliseconds and mixer.c's resolve_dyn converts ms → per-sample coefficients at the LIVE rate inside every RT cycle, so they can never hold a stale-rate coefficient.

      Returns void

    • Push one strip's CHAIN ORDER onto its lane — the reorderable built-ins in the order the chain declares them (deriveStageOrder). Called by the chain row after a committed order write, and by assertAll for the boot/restore sweep.

      Until this existed the path was built and joined at every point but one: core derived the step list, the addon published it torn-free, the RT walked it — and nothing in the server or the engine ever called it, so every lane ran omx_order_default() for ever and a reorder changed only what the surface drew (audit D11).

      Parameters

      Returns ProjectionResult | undefined

    • Re-publish one strip's walk after an ORDER write — the same push, with the chain the strip currently declares read off the engine rather than handed in. The stage-order row's station calls this and nothing else, so the order fact reaches the lane through the SAME door the chain's arrangement does (southbound actuator contract: one path to audio).

      Parameters

      Returns ProjectionResult | undefined