Hi everyone,
I'm currently customizing my PipeWire audio setup on Solus and would greatly appreciate any feedback, suggestions, or corrections you might have. I've placed the following files under ~/.config/pipewire/
and I'm hoping for a quick review from those more experienced.
🔧 System Information:
- Operating System: Solus 4.7
- KDE Plasma Version: 6.3.5
- KDE Frameworks Version: 6.15.0
- Qt Version: 6.9.1
- Kernel Version: 6.14.11-320.current (64-bit)
- Graphics Platform: X11
- CPU: Intel® Core™ i5-5300U @ 2.30GHz (4 threads)
- RAM: 15.5 GiB
- GPU: Intel® HD Graphics 5500
- Device: Dell Latitude E5450
📄 99-force-alsa.lua
rule = {
matches = {
{
{ "node.name", "matches", "alsa_output.*" },
},
},
apply_properties = {
["node.force-quantum"] = 256,
["node.latency"] = 256,
["audio.format"] = "F32LE",
["audio.rate"] = 48000,
["resample.quality"] = 7,
},
}
table.insert(alsa_monitor.rules, rule)
📄 client.conf
# Client config file for PipeWire version "1.4.2" #
context.properties = {
log.level = 0
#default.clock.quantum-limit = 8192
}
context.spa-libs = {
audio.convert.* = audioconvert/libspa-audioconvert
support.* = support/libspa-support
video.convert.* = videoconvert/libspa-videoconvert
}
context.modules = [
{ name = libpipewire-module-rt
args = {
#rt.prio = 83
#rt.time.soft = -1
#rt.time.hard = -1
}
flags = [ ifexists nofail ]
condition = [ { module.rt = !false } ]
},
{ name = libpipewire-module-protocol-native },
{ name = libpipewire-module-client-node
condition = [ { module.client-node = !false } ]
},
{ name = libpipewire-module-client-device
condition = [ { module.client-device = !false } ]
},
{ name = libpipewire-module-adapter
condition = [ { module.adapter = !false } ]
},
{ name = libpipewire-module-metadata
condition = [ { module.metadata = !false } ]
},
{ name = libpipewire-module-session-manager
condition = [ { module.session-manager = !false } ]
}
]
filter.properties = {
#node.latency = 1024/48000
}
stream.properties = {
resample.quality = 7
}
stream.rules = [
{
matches = [
{
#application.name = "pw-cat"
#node.name = "~Google Chrome$"
}
]
actions = {
update-props = {
#node.latency = 512/48000
}
}
}
]
alsa.properties = {
#alsa.deny = false
}
alsa.rules = [
{ matches = [ { application.process.binary = "resolve" } ]
actions = {
update-props = {
alsa.buffer-bytes = 131072
}
}
}
]
📄 pipewire-pulse.conf
# PulseAudio config file for PipeWire version "1.4.2" #
context.properties = {
#log.level = 2
#default.clock.quantum-limit = 8192
}
context.spa-libs = {
audio.convert.* = audioconvert/libspa-audioconvert
support.* = support/libspa-support
}
context.modules = [
{ name = libpipewire-module-rt
args = {
nice.level = -11
}
flags = [ ifexists nofail ]
},
{ name = libpipewire-module-protocol-native },
{ name = libpipewire-module-client-node },
{ name = libpipewire-module-adapter },
{ name = libpipewire-module-metadata },
{ name = libpipewire-module-protocol-pulse }
]
context.exec = [
#{ path = "pactl" args = "load-module module-always-sink" }
]
pulse.cmd = [
{ cmd = "load-module" args = "module-always-sink" flags = [ ]
condition = [ { pulse.cmd.always-sink = !false } ] },
{ cmd = "load-module" args = "module-device-manager" flags = [ ]
condition = [ { pulse.cmd.device-manager = !false } ] },
{ cmd = "load-module" args = "module-device-restore" flags = [ ]
condition = [ { pulse.cmd.device-restore = !false } ] },
{ cmd = "load-module" args = "module-stream-restore" flags = [ ]
condition = [ { pulse.cmd.stream-restore = !false } ] }
]
stream.properties = {
resample.quality = 7
}
pulse.properties = {
server.address = [
"unix:native"
]
pulse.default.req = 256/48000 # 20 ms
pulse.default.tlength = 4096/48000 # 2 seconds
pulse.default.quantum = 256/48000
pulse.default.format = F32
pulse.default.position = [ FL FR ]
}
pulse.properties.rules = [
{ matches = [ { cpu.vm.name = !null } ]
actions = {
update-props = {
pulse.min.quantum = 1024/48000
}
}
}
]
pulse.rules = [
{
matches = [ { application.process.binary = "teams" } ],
actions = { quirks = [ force-s16-info ] }
},
{
matches = [ { application.process.binary = "firefox" } ],
actions = { quirks = [ remove-capture-dont-move ] }
},
{
matches = [ { application.name = "~speech-dispatcher.*" } ],
actions = {
update-props = {
pulse.min.req = 512/48000
pulse.min.quantum = 512/48000
pulse.idle.timeout = 5
}
}
}
]
📄 99-samplerate.conf
context.properties = {
default.clock.rate = 48000
default.clock.allowed-rates = [ 32000 44100 48000 88200 96000 176400 192000 ]
}
🙏 What I’m Asking:
If anyone has time, I’d really appreciate it if you could:
- Review the config files for any issues or conflicts,
- Recommend improvements for performance or compatibility,
- Or share general best practices for tuning PipeWire (especially for PulseAudio clients and low-latency audio work).
Thanks in advance for your help! 🙌