LIBPIPEWIRE-MODULE-PULSE-TUNNEL(7)

πŸ’– libpipewire-module-pulse-tunnel β€” the tea β˜•

okay bestie, so this is a page from the Miscellaneous Information Manual, and it's all about libpipewire-module-pulse-tunnel. yes the name is a mouthful, we're gonna say "pulse-tunnel" and move on. it lives in section 7 (miscellaneous), so it's a module, not a command you run at a shell. keep that in mind bestie πŸ’…


✨ NAME ✨

libpipewire-module-pulse-tunnel β€” Pulse Tunnel πŸ•³οΈβœ¨ (yes that's really it, that's the whole name section, iconic brevity)


🌸 DESCRIPTION 🌸

k so here's the vibe: the pulse-tunnel module gives you a source or a sink that tunnels all the audio over to a remote PulseAudio connection. like, all of it. every last lil sample. it's giving ✨teleportation but for sound✨ πŸ¦‹

it's usually used with PulseAudio or module-protocol-pulse on the remote end, because someone's gotta be there to accept the connection, bestie 😭

and here's the collab: this module is usually used together with module-zeroconf-discover, which will automatically load the tunnel with the right parameters based on zeroconf information. so like, it does the setup for you. queen behavior πŸ‘‘


πŸŽ€ MODULE NAME πŸŽ€

libpipewire-module-pulse-tunnel

that's her full government name fr fr πŸ’– (copy it exactly, no nicknames in the config)


πŸ’… MODULE OPTIONS πŸ’…

the main-character settings, bestie. every single one:

  • tunnel.mode β€” the desired tunnel to create. must be source or sink. (Default: sink) β€” so like, are you making a fake mic or a fake speaker, pick one πŸŽ€πŸ”Š
  • pulse.server.address β€” the address of the PulseAudio server you're tunneling to. the destination. the ~location~ πŸ“
  • pulse.latency β€” the end-to-end latency, in milliseconds, to maintain. (Default: 200)
  • reconnect.interval.ms β€” when the remote connection breaks, retry connecting at this interval, in milliseconds. a value of 0 disables recovery and will result in a module unload. (Default: 0) (Since 1.1.0) β€” note the typo situation, the original says "millisconds", we're keeping the number straight though: 0 = no recovery = the module gets unloaded πŸ’€
  • stream.props β€” extra properties for the local stream. sprinkle your extras in here ✨
lowkey important: tunnel.mode only accepts source or sink. it says must, and it means it. don't be cute with it πŸ™ˆ

🌈 GENERAL OPTIONS 🌈

these are the options with well-known behavior β€” the classic ones everyone knows, still listed so you don't forget:

  • remote.name
  • audio.format
  • audio.rate
  • audio.channels
  • audio.layout
  • audio.position
  • node.latency
  • node.name
  • node.description
  • node.group
  • node.virtual
  • node.network
  • media.class
  • target.object β€” to specify the remote node.name or serial.id to link to 🎯

πŸ¦‹ EXAMPLE CONFIGURATION OF A VIRTUAL SINK πŸ¦‹

here's what it looks like irl bestie β€” a whole virtual sink, set up in a config file. the path is a comment at the top, so keep it πŸ’–

# ~/.config/pipewire/pipewire.conf.d/my-pulse-tunnel.conf

context.modules = [
{   name = libpipewire-module-pulse-tunnel
    args = {
        tunnel.mode = sink
        # Set the remote address to tunnel to
        pulse.server.address = "tcp:192.168.1.126"
        #pulse.latency = 200
        #reconnect.interval.ms = 0
        #audio.rate=<sample rate>
        #audio.channels=<number of channels>
        #audio.position=<channel map>
        #target.object=<remote target name>
        stream.props = {
            # extra sink properties
        }
    }
}
]

the # lines are commented out β€” they're there so you know what your options are, not because they're doing anything. uncomment responsibly 🫢


that's the whole thing, no cap. go tunnel some audio, bestie, you got this πŸ‘‘

⭐ sign-off szn: this little legend came from PipeWire, version 1.6.11, and the page is dated accordingly β€” and yeah, the manual section is 7 (miscellaneous) with the page name libpipew...se-tunnel. mwah, bye πŸ’œ

πŸ“¦ where this page comes from