How to Fix libpipewire-module-protocol-simple Not Creating a Sink
For a Super User or Linux administrator, migrating to PipeWire is usually a seamless experience for modern audio handling. However, a common technical hurdle occurs when attempting to use libpipewire-module-protocol-simple for network audio or internal streams, only to find that the expected Sink is never created. This prevents web applications and local players from routing audio to the intended destination.
Here is the technical diagnostic path to identify why the simple protocol module is failing to initialize its sink.
1. Validating the Configuration Syntax
The most frequent cause of a missing sink is a malformed pipewire.conf or a syntax error in the context.modules section. The protocol-simple module requires specific keys to instantiate a node as a sink.
- The Required "sink" Flag: Ensure your module configuration explicitly sets
audio.sink = true. - Naming Conventions: If the
node.nameornode.descriptioncontains special characters without quotes, the parser may fail silently.
context.modules = [
{ name = libpipewire-module-protocol-simple
args = {
audio.rate = 44100
audio.format = S16LE
audio.channels = 2
capture = false
playback = true
node.name = "Simple-Protocol-Sink"
server.address = [ "tcp:4711" ]
}
}
]
2. Checking for Missing Dependencies
Unlike standard ALSA or PulseAudio wrappers, PipeWire modules are often split into separate packages in distributions like Fedora, Arch, or Debian. If libpipewire-module-protocol-simple.so is missing from /usr/lib/pipewire-0.3/, the sink will never appear.
- The Fix: Reinstall the pipewire-audio-client-libraries or the specific pipewire-module-protocol-simple package.
- Verification: Run
pw-cli list-objects | grep Moduleto see if the module is actually loaded in the current context.
3. Resolving Port and Address Conflicts
If the module is configured to listen on a specific TCP or Unix socket, it may fail to create the sink if the port is already bound by another web application or the legacy pulseaudio-module-simple.
- Run
ss -lntp | grep 4711(or your chosen port) to check for address conflicts. - Check the PipeWire journal logs:
journalctl --user -u pipewire. Look for "failed to bind" or "address already in use" errors.
4. Node Visibility and Session Manager Logic
In PipeWire, the module creates the node, but the Session Manager (WirePlumber or pipewire-media-session) is responsible for making it a "Sink" that is visible to other applications. If WirePlumber has a conflicting rule, it may keep the node in an "idle" or "unassigned" state.
- Use
pw-link -ioto see if the "Simple-Protocol-Sink" appears in the graph at all, even if it doesn't show up in your GUI sound settings. - If the node exists in the graph but isn't a sink, check your WirePlumber scripts for rules that might be filtering out nodes without specific hardware properties.
5. Troubleshooting with pw-dump
For a deep dive into why the sink isn't being registered correctly, use the pw-dump utility to inspect the properties of the module and the resulting nodes.
pw-dump > pipewire_debug.json
Search for the string "protocol-simple" in the resulting file. Check the error field. If you see "No such file or directory," the path to the backend audio device the module is trying to wrap may be incorrect.
Conclusion
When libpipewire-module-protocol-simple fails to create a sink, the issue is almost always a conflict between the playback = true argument and the local network configuration. By ensuring the module is correctly loaded and the ports are clear, you can restore high-quality audio routing to your web applications. For long-term SEO health of your system configuration, always document your /etc/pipewire/ overrides to prevent package updates from overwriting your custom sinks.
