Pipewire: Difference between revisions

From miki
Jump to navigation Jump to search
Line 103: Line 103:
Currently PipeWire support sharing through network using Pulse, but auth-anonymous is always turned on (<code>auth-ip-acl</code> not implemented).
Currently PipeWire support sharing through network using Pulse, but auth-anonymous is always turned on (<code>auth-ip-acl</code> not implemented).


* On the '''main user''', edit {{file|pipewire-pulse.conf}} (from {{file|/usr/share/pipewire|}}, or any system or user-local equivalent file) in the <code>context.modules</code> section:
* (pipewire 0.3.50+) On the '''main user''', create file {{file|~/.config/pipewire/pipewire-pulse.conf.d/listen-to-4713.conf}}
<source lang="text">
<source lang="text">
pulse.properties = {
context.modules = [
# the addresses this server listens on
# ...
server.address = [
{ name = libpipewire-module-protocol-pulse
"tcp:4713" # IPv4 and IPv6 on all addresses
args = {
# the addresses this server listens on
#"tcp:127.0.0.1:8888" # IPv4 on a single address
server.address = [
#
"unix:native"
#{ address = "tcp:4713" # address
"tcp:4713" # IPv4 and IPv6 on all addresses
# max-clients = 64 # maximum number of clients
# listen-backlog = 32 # backlog in the server listen queue
]
# client.access = "restricted" # permissions for clients
}
}
#}
]
]
}
</source>
:Note: we CANNOT edit {{file|pipewire-pulse.conf}} or any system-level file (like in {{file|/etc/pipewire/pipewire-pulse.d}}) because the TCP socket would already be used, and service would fail to load.
:We can check it works with
<source lang="bash">

</source>
</source>
: On the '''secondary user''', export the following env variables:
: On the '''secondary user''', export the following env variables:

Revision as of 15:33, 25 April 2022

Pipewire is the new sound system on Linux, meant to replace Pulseaudio.

Links

References

Configuration files:

  • /usr/share/pipewire
  • /usr/share/wireplumber

Commands

# View status
systemctl --user status pipewire

# Use PipeWire instead of JACK
pw-jack SOMEAPP

# PipeWire process viewer (quantum usage...)
pw-top

# Setup sinks, sources, audio devices
pw-link
qjackctl         # Graphical tool, leveraging on JACK
qpwgraph         # Alternative, pipewire native

# Get settings
pw-metadata -n settings

# Set settings
pw-metadata -n settings 0 clock.rate 48000
pw-metadata -n settings 0 clock.allowed-rates '[ 48000, 96000, 44100 ]'

# Command line
pw-cli
> info all

Configuration

  • Package configuration files are located in /usr/share/pipewire and /usr/share/wireplumber.
  • To change them, copy and edit them in /etc/pipewire (system-wide) or ~/.config/pipewire (local changes).
pipewire-pulse.conf
  • A single section can also be updated through a file in /etc/pipewire/pipewire-pulse.conf.d/ or ~/.config/pipewire/pipewire-pulse.conf.d/
cat /usr/share/pipewire/pipewire-pulse.conf
# # PulseAudio config file for PipeWire version "0.3.50" #
# #
# # Copy and edit this file in /etc/pipewire for system-wide changes
# # or in ~/.config/pipewire for local changes.
# #
# # It is also possible to place a file with an updated section in
# #  for system-wide changes or in
# # ~/.config/pipewire/pipewire-pulse.conf.d/ for local changes.

Troubleshooting

Setting and keeping bluetooth profile for headset

We want to use the profile sbc sbc_xq for our BT headset Sony WH-1000XM3.

Set the profile manually - profile should be persistent on reboot / reconnect.
  • In principe WirePlumber should remember the last selected profile.
  • See [1]
# See available profile and device id with 'pactl list'
pactl set-card-profile bluez_card.38_18_4C_4B_6A_3A a2dp-sink-sbc_xq
Configure profile
  • When using pipewire-media-session, the default profile could be selected in bluez-monitor.conf, but this file no longer exists with WirePlumber.
  • (UPDATE - Archlinux - Pipewire) Edit /etc/wireplumber/bluetooth.lua.d/51-bluez-config.lua (or ~/.config/wireplumber/bluetooth.lua.d/51-bluez-config.lua):
bluez_monitor.properties = {
  ["bluez5.enable-sbc-xq"] = true,
  ["bluez5.enable-msbc"] = true,
  ["bluez5.codecs"] = "[sbc sbc_xq]",
}

Crackling / Stuttering audio

This applies in a VM. Not sure these apply when PipeWire is run on the host.

Note that recent PipeWire already supports different auto-config if running in a vm [2].

Enable multi-user / network audio

References

Currently PipeWire support sharing through network using Pulse, but auth-anonymous is always turned on (auth-ip-acl not implemented).

  • (pipewire 0.3.50+) On the main user, create file ~/.config/pipewire/pipewire-pulse.conf.d/listen-to-4713.conf
pulse.properties = {
    # the addresses this server listens on
    server.address = [
        "tcp:4713"                         # IPv4 and IPv6 on all addresses
        #"tcp:127.0.0.1:8888"               # IPv4 on a single address
        #
        #{ address = "tcp:4713"             # address
        #  max-clients = 64                 # maximum number of clients
        #  listen-backlog = 32              # backlog in the server listen queue
        #  client.access = "restricted"     # permissions for clients
        #}
    ]
}
Note: we CANNOT edit pipewire-pulse.conf or any system-level file (like in /etc/pipewire/pipewire-pulse.d) because the TCP socket would already be used, and service would fail to load.
We can check it works with
On the secondary user, export the following env variables:
export PULSE_SERVER=tcp:127.0.0.1:4713
Note: make sure the port is allowed in the firewall as well.
On the remote client, use the module PipeWire Module: Pulse Tunnel:
context.modules = [
{   name = libpipewire-module-pulse-tunnel
    args = {
        tunnel.mode = playback
        # Set the remote address to tunnel to
        pulse.server.address = "tcp:192.168.1.126"
        #audio.rate=<sample rate>
        #audio.channels=<number of channels>
        #audio.position=<channel map>
        #node.target=<remote target node>
        stream.props = {
            # extra sink properties
        }
    }
}
]
We can also use the PipeWire Module: Zeroconf Discover, that will automatically create sinks/sources to/from remote PulseAudio servers.
context.modules = [
{   name = libpipewire-module-zeroconf-discover
    args = { }
}
]
  • Another method it seems is to start the daemon manually [3]:
# On the server
pipewire-pulse -a tcp:4713
# On the client
PULSE_SERVER=tcp:SERVER_IP_ADDRESS:4713 pactl info