openmixer — generated API reference
    Preparing search index...

    Interface NativeEngineLoaders

    The two halves of the native engine, as loaders. Injected ONLY so tests can withhold them (see the refusal test): there is no env var or config key that reaches this, deliberately. A config switch like OPENMIXER_NATIVE_GRAPH=0 has nothing to fall back to — there is no pw-dump/pw-link subprocess path — so its only effect would be to make the desk refuse to start: a way to break a console, not a kill-switch.

    interface NativeEngineLoaders {
        graph: () => PwGraph | undefined;
        mixerHost: () => NativeMixerHost | undefined;
    }
    Index
    graph: () => PwGraph | undefined

    Obtain the native PipeWire registry/graph client. Default loadPwGraph.

    Type Declaration

      • (): PwGraph | undefined
      • THE native PipeWire graph of this process — one registry, one mirror, every caller. Resolves undefined when the compiled addon is unavailable (not built, non-Linux, CI) or predates the registry surface. Never throws for absence; a loaded addon failing to connect throws from start() like any real error.

        Why a single instance and not a fresh wrapper per call. The registry the addon exposes is a file static (addon.c's g_ctx), bound on the ONE refcounted client mix_host.c holds for the whole process — so there is exactly one registry to mirror, and a second PwGraph over it is not a second client but a second, EMPTY view whose start() the addon rejects outright with pw_registry already started. native-pipewire-engine.md had already settled the shape: the composition root injects the ONE native client behind the seams. This function is what makes that true for everyone who asks, rather than only for whoever asked first.

        That was deploy #73's silent MAIN (0.1.0.715, 2026-09-15): the /api/patchbay/link door loaded its own graph, start() threw into the operation's landing, and the console answered running:true then NOT_LANDED while moving no audio. Two consumers, one registry, one mirror — and the door now resolves ports from the mirror the engine has ALREADY synced, instead of enumerating a second time.

        Lifecycle stays with the composition root: stop() tears down the shared registry for everyone (it always did, at the C level), so a holder that did not start it must not stop it.

        The seven names below are the registry surface's runtime contract — the methods PwGraph drives, declared here and narrowed by hasFunctions.

        Returns PwGraph | undefined

    mixerHost: () => NativeMixerHost | undefined

    Obtain the native mixer host addon. Default loadNativeMixerHost.

    Type Declaration

      • (): NativeMixerHost | undefined
      • Load the native addon and expose its mixer surface as a NativeMixerHost. Resolves undefined when the compiled addon is unavailable (not built, non-Linux, CI) or predates the mixer surface — the engine keeps the loopback fallback. Never throws for absence.

        The names below are the mixer surface's runtime contract — the methods NativeMixerHost and NativeMixerNode drive, narrowed by hasFunctions. mixerCapacity is one of them: an addon that cannot state its roof cannot be built against safely (the allocation would have to guess), so it is refused as a mixer surface rather than accepted with an unqueryable ceiling.

        Returns NativeMixerHost | undefined