# WirePlumber, trimmed to what a microVM with no sound card actually needs. # # The goal is that `neswire` is the *only* Audio/Sink in the graph, so # default-node selection has exactly one candidate and cannot pick wrong. # # The "Dummy Output" (`auto_null`) sink is not disabled here, and no longer # needs to be: it came from pipewire-pulse's `module-always-sink`, and # pipewire-pulse is no longer installed. WirePlumber ships # scripts/fallback-sink.lua, which creates a node by the same name, but no # component in wireplumber.conf references it, so it never loads. If auto_null # ever comes back, it came back with pipewire-pulse -- the switch is # `pulse.cmd.always-sink = false` in a pipewire-pulse.conf.d drop-in, not # anything on this side. # # pipewire.conf's Dummy-Driver / Freewheel-Driver are a third thing again: # support.node.driver objects with no ports -- drivers, not sinks, so nothing # can play into them. Dummy-Driver is load-bearing here. With no ALSA hardware # it is what clocks the graph, and therefore what paces neswire's sink. Do not # disable it. wireplumber.profiles = { main = { # No sound card, no bluetooth adapter, no camera. These only exist to # probe hardware this guest does not have; disabling them removes the # only other source of sinks besides neswire. hardware.audio = disabled hardware.bluetooth = disabled hardware.video-capture = disabled # The guest root is read-only and every VM is built from the same image, so # there is nothing to restore and nowhere to save. Left enabled, a stale # state file is a second, invisible place that can pin a default sink -- # the exact failure this file exists to rule out. # # Equivalent to inheriting mixin.stateless, spelled out so it is greppable. hooks.default-nodes.state = disabled hooks.device.profile.state = disabled hooks.device.routes.state = disabled hooks.stream.state = disabled } }