Skip to content

Instantly share code, notes, and snippets.

@tapir
Last active April 16, 2025 20:35
Show Gist options
  • Save tapir/2c90f06e8a1cf4490d9d912d5a88a20c to your computer and use it in GitHub Desktop.
Save tapir/2c90f06e8a1cf4490d9d912d5a88a20c to your computer and use it in GitHub Desktop.
Setup of my audio devices, system-wide eq and qpwgraph
# ~/.config/wireplumber/wireplumber.conf.d/51-alsa-custom.conf
wireplumber.settings = {
# make sure volumes are always 100% by default
device.routes.default-sink-volume = 1.0
device.routes.default-source-volume = 1.0
node.stream.default-playback-volume = 1.0
node.stream.default-playback-volume = 1.0
# make sure no automatic change happens
# we rely on qpwgraph and our config files for proper setup
device.restore-profile = false
device.restore-routes = false
node.stream.restore-props = false
node.stream.restore-target = false
node.restore-default-targets = false
}
monitor.alsa.rules = [
{
matches = [
{
# match all devices
device.name = "~alsa_card.*"
}
]
actions = {
update-props = {
api.alsa.use-acp = true
api.alsa.soft-mixer = true
api.acp.auto-profile = false
api.acp.auto-port = false
api.alsa.start-delay = 128
}
}
}
{
matches = [
{
device.name = "~alsa_card.usb-SteelSeries_Arctis_Nova_Pro_Wireless-00*"
}
]
actions = {
update-props = {
# this disables S/PDIF digital outputs in system menu
device.profile-set = "analog-only.conf"
}
}
}
{
matches = [
{
device.name = "~alsa_card.usb-Solid_State_Logic_SSL_2_Mk_II-00*"
}
]
actions = {
update-props = {
# this enables pro-audio profile
# without this I get crackling and random buffer size changes
device.profile = "pro-audio"
}
}
}
{
matches = [
{
node.name = "~usb-Solid_State_Logic_SSL_2_Mk_II-00*"
}
]
actions = {
update-props = {
# jack clients supposed to use these settings
# however none of these work in a stable way if the card is not set to pro-audio profile
audio.format = S32LE
audio.rate = 48000
api.alsa.period-size = 256
api.alsa.period-num = 2
api.alsa.headroom = 0
}
}
}
{
matches = [
{
node.name = "~alsa_output.usb-Solid_State_Logic_SSL_2_Mk_II-00*"
}
]
actions = {
update-props = {
# lower driver priority node will re-sample to higher driver priority node if they are routed together
priority.driver = 1000
# higher session priority node will be the default node for new sessions
priority.session = 999
}
}
}
{
matches = [
{
node.name = "~alsa_input.usb-Solid_State_Logic_SSL_2_Mk_II-00*"
}
]
actions = {
update-props = {
# recommended source max priority is 2000
priority.driver = 2000
priority.session = 1999
}
}
}
{
matches = [
{
node.name = "~alsa_output.usb-SteelSeries_Arctis_Nova_Pro_Wireless-00*"
}
]
actions = {
update-props = {
# recommended sink max priority is 1500
priority.driver = 999
priority.session = 1000
}
}
}
{
matches = [
{
node.name = "~alsa_input.usb-SteelSeries_Arctis_Nova_Pro_Wireless-00*"
}
]
actions = {
update-props = {
priority.driver = 1999
priority.session = 2000
}
}
}
{
matches = [
# put all the devices that you don't want to use here like the integrated audio device on the motherboard or HDMI in GPU
# putting matches in the same scope means AND, creating a new scope means OR
{
device.name = "~alsa_card.pci-0000*"
}
]
actions = {
update-props = {
device.disabled = true
}
}
}
]
<!DOCTYPE patchbay>
<patchbay name="ardour-patch" version="0.8.3">
<items>
<item node-type="pipewire" port-type="pipewire-audio">
<output node="Oratory1990 HD599 EQ" port="Oratory1990 HD599 EQ:output_FR"/>
<input node="SSL 2 Mk II Pro" port="SSL 2 Mk II:playback_AUX1"/>
</item>
<item node-type="pipewire" port-type="pipewire-audio">
<output node="SSL 2 Mk II Pro" port="SSL 2 Mk II:capture_AUX1"/>
<input node="Carla" port="Carla:audio-in2"/>
</item>
<item node-type="pipewire" port-type="pipewire-audio">
<output node="Carla" port="Carla:audio-out2"/>
<input node="Oratory1990 HD599 EQ" port="Oratory1990 HD599 EQ:input_FR"/>
</item>
<item node-type="pipewire" port-type="pipewire-audio">
<output node="Arctis Nova Pro Wireless Analog Stereo [Monitor]" port="Arctis Nova Pro Wireless:monitor_FL"/>
<input node="Oratory1990 HD599 EQ" port="Oratory1990 HD599 EQ:input_FL"/>
</item>
<item node-type="pipewire" port-type="pipewire-audio">
<output node="Oratory1990 HD599 EQ" port="Oratory1990 HD599 EQ:output_FL"/>
<input node="SSL 2 Mk II Pro" port="SSL 2 Mk II:playback_AUX0"/>
</item>
<item node-type="pipewire" port-type="pipewire-audio">
<output node="Carla" port="Carla:audio-out1"/>
<input node="Oratory1990 HD599 EQ" port="Oratory1990 HD599 EQ:input_FL"/>
</item>
<item node-type="pipewire" port-type="pipewire-audio">
<output node="SSL 2 Mk II Pro" port="SSL 2 Mk II:capture_AUX0"/>
<input node="Carla" port="Carla:audio-in1"/>
</item>
<item node-type="pipewire" port-type="pipewire-audio">
<output node="Arctis Nova Pro Wireless Analog Stereo [Monitor]" port="Arctis Nova Pro Wireless:monitor_FR"/>
<input node="Oratory1990 HD599 EQ" port="Oratory1990 HD599 EQ:input_FR"/>
</item>
</items>
</patchbay>
# ~/.config/pipewire/pipewire.conf.d/sink-eq10.conf
#
# 10 band sink equalizer for Sennheiser HD599
# https://www.dropbox.com/scl/fi/xo3o8ge30qe23vat3ybd5/Sennheiser-HD599.pdf?rlkey=3u94biy0ewk8txko3lqs4tx0x&dl=0
context.modules = [{
name = libpipewire-module-filter-chain
args = {
node.description = "Oratory1990 HD599 EQ"
media.name = "Oratory1990 HD599 EQ"
audio.channels = 2
audio.position = [ FL FR ]
capture.props = {
node.name = "effect_input.eq10"
# put this to Audio/Sink if you want to see the sink in the system menu
media.class = Audio/Filter
}
playback.props = {
node.name = "effect_output.eq10"
node.passive = true
}
filter.graph = {
nodes = [
{
type = builtin
name = eq_band_1
label = bq_highshelf
control = { "Freq" = 0.0 "Q" = 1.0 "Gain" = -5.5 }
}
{
type = builtin
name = eq_band_2
label = bq_lowshelf
control = { "Freq" = 105.0 "Q" = 0.71 "Gain" = 5.5 }
}
{
type = builtin
name = eq_band_3
label = bq_peaking
control = { "Freq" = 165.0 "Q" = 0.45 "Gain" = -5.0 }
}
{
type = builtin
name = eq_band_4
label = bq_peaking
control = { "Freq" = 1150.0 "Q" = 1.4 "Gain" = -1.1 }
}
{
type = builtin
name = eq_band_5
label = bq_peaking
control = { "Freq" = 1700.0 "Q" = 1.5 "Gain" = 3.6 }
}
{
type = builtin
name = eq_band_6
label = bq_highshelf
control = { "Freq" = 3000.0 "Q" = 0.35 "Gain" = 1.0 }
}
{
type = builtin
name = eq_band_7
label = bq_peaking
control = { "Freq" = 3100.0 "Q" = 3.5 "Gain" = -2.6 }
}
{
type = builtin
name = eq_band_8
label = bq_peaking
control = { "Freq" = 4350.0 "Q" = 3.5 "Gain" = -2.6 }
}
{
type = builtin
name = eq_band_9
label = bq_peaking
control = { "Freq" = 5800.0 "Q" = 3.5 "Gain" = -3.0 }
}
{
type = builtin
name = eq_band_10
label = bq_highshelf
control = { "Freq" = 10000.0 "Q" = 0.71 "Gain" = 3.0 }
}
]
links = [
{ output = "eq_band_1:Out" input = "eq_band_2:In" }
{ output = "eq_band_2:Out" input = "eq_band_3:In" }
{ output = "eq_band_3:Out" input = "eq_band_4:In" }
{ output = "eq_band_4:Out" input = "eq_band_5:In" }
{ output = "eq_band_5:Out" input = "eq_band_6:In" }
{ output = "eq_band_6:Out" input = "eq_band_7:In" }
{ output = "eq_band_7:Out" input = "eq_band_8:In" }
{ output = "eq_band_8:Out" input = "eq_band_9:In" }
{ output = "eq_band_9:Out" input = "eq_band_10:In" }
]
}
}
}]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment