The tuning host loaded module-rt with default arguments, so it asked for realtime through xdg-desktop-portal. A portal started before rtkit was installed reports a realtime budget of zero. module-rt applies that as a hard RLIMIT_RTTIME of 0, RTKit still makes the data thread SCHED_RR, and the kernel kills the host with SIGKILL as soon as audio plays; systemd restarts it every two seconds and the speakers stay silent until the next login. Set rtportal.enabled = false, as the stock pipewire.conf does. The host is a user service in the same session as the PipeWire daemon and has no reason to go through the portal. The host config is only copied by `omarchy-audio-tuning on`, so a migration replaces an installed copy that is still Omarchy's own with the old setting, and restarts the host if it runs. It does not call `on`, which would overwrite a tuning graph another tool wrote under the same name. Co-authored-by: Michael de By <contact@michaeldeby.nl>
44 lines
1.6 KiB
Plaintext
44 lines
1.6 KiB
Plaintext
# Host config for the Omarchy speaker tuning.
|
|
#
|
|
# This exists so the tuning gets its own PipeWire client rather than sharing
|
|
# PipeWire's stock filter-chain.conf. That config merges every fragment in
|
|
# ~/.config/pipewire/filter-chain.conf.d/, so hosting the tuning there would load
|
|
# any unrelated filter a user keeps in that directory -- duplicating filters
|
|
# already hosted elsewhere, and stopping them all when the tuning is switched off.
|
|
#
|
|
# Installed as ~/.config/pipewire/omarchy-speaker-tuning.conf with the tuning
|
|
# graph merged from omarchy-speaker-tuning.conf.d/, and run with
|
|
# pipewire -c omarchy-speaker-tuning.conf
|
|
#
|
|
# The contents are the minimum a filter-hosting client needs, taken from
|
|
# /usr/share/pipewire/filter-chain.conf.
|
|
|
|
context.properties = {
|
|
log.level = 0
|
|
}
|
|
|
|
context.spa-libs = {
|
|
audio.convert.* = audioconvert/libspa-audioconvert
|
|
support.* = support/libspa-support
|
|
}
|
|
|
|
context.modules = [
|
|
# Boost the audio thread priority. Ask RTKit directly, as pipewire.conf
|
|
# does: a portal started before rtkit existed reports a realtime budget of
|
|
# zero, which becomes a hard RLIMIT_RTTIME of 0 while RTKit still makes the
|
|
# data thread realtime, and the kernel then kills the host once audio plays.
|
|
{ name = libpipewire-module-rt
|
|
args = { rtportal.enabled = false }
|
|
flags = [ ifexists nofail ]
|
|
}
|
|
|
|
# The native communication protocol.
|
|
{ name = libpipewire-module-protocol-native }
|
|
|
|
# Lets this process provide nodes to PipeWire.
|
|
{ name = libpipewire-module-client-node }
|
|
|
|
# Wraps nodes in an adapter with a converter and resampler.
|
|
{ name = libpipewire-module-adapter }
|
|
]
|