ReadonlygraphObtain the native PipeWire registry/graph client. Default loadPwGraph.
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.
ReadonlymixerObtain the native mixer host addon. Default loadNativeMixerHost.
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.
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=0has 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.