diff --git a/config/audio-server/default.nix b/config/audio-server/default.nix index 9bcb5131..3285b637 100644 --- a/config/audio-server/default.nix +++ b/config/audio-server/default.nix @@ -18,15 +18,17 @@ hardware.pulseaudio = { enable = true; systemWide = true; - tcp.enable = true; - tcp.anonymousClients.allowedIpRanges = [ - "127.0.0.0/8" - "::1/128" - "fd23:42:c3d2:500::/56" - "172.22.99.0/24" - "172.20.72.0/21" - "2a00:8180:2c00:200::/56" - ]; + tcp = { + enable = true; + anonymousClients.allowedIpRanges = [ + "127.0.0.0/8" + "::1/128" + "fd23:42:c3d2:500::/56" + "172.22.99.0/24" + "172.20.72.0/21" + "2a00:8180:2c00:200::/56" + ]; + }; zeroconf.publish.enable = true; package = (pkgs.pulseaudio.override { bluetoothSupport = true; @@ -38,13 +40,14 @@ }); }; - # TODO: configure system wide service - #services.pipewire = { - # enable = true; - # alsa.enable = true; - # config.pipewire-pulse = lib.importJSON ./pipewire-pulse.conf.json; - # pulse.enable = true; - #}; + # pipewire has no systemwide pipewire-pulse + # services.pipewire = { + # enable = true; + # config.pipewire-pulse = lib.importJSON ./pipewire-pulse.conf.json; + # pulse.enable = true; + # socketActivation = false; + # systemWide = true; + # }; security.rtkit.enable = true; diff --git a/config/audio-server/generate.sh b/config/audio-server/generate.sh index 4407ee35..c1edabc0 100755 --- a/config/audio-server/generate.sh +++ b/config/audio-server/generate.sh @@ -4,6 +4,6 @@ # shellcheck shell=bash dir=$(dirname "$(readlink -f "$0")") -default_pipewire_pulse=$(nix-instantiate --eval -E '(import { }).pkgs.path')/nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json +default_pipewire_pulse=$(nix-instantiate --eval -E '(import { }).pkgs.path')/nixos/modules/services/desktops/pipewire/daemon/pipewire-pulse.conf.json jq -s '.[0] * .[1] * .[2]' "$dir/pipewire-pulse.conf.in.json" "$default_pipewire_pulse" > "$dir/pipewire-pulse.conf.json" <(jq -cnS '{ "context.modules": [ inputs."context.modules" ] | add}' "$default_pipewire_pulse" "$dir/pipewire-pulse.conf.in.json") diff --git a/config/audio-server/pipewire-pulse.conf.in.json b/config/audio-server/pipewire-pulse.conf.in.json index 9ff61a85..8c119824 100644 --- a/config/audio-server/pipewire-pulse.conf.in.json +++ b/config/audio-server/pipewire-pulse.conf.in.json @@ -6,10 +6,25 @@ { "name": "libpipewire-module-protocol-pulse", "args": { + "auth-ip-acl": [ + "127.0.0.0/8", + "::1/128", + "fd23:42:c3d2:500::/56", + "172.22.99.0/24", + "172.20.72.0/21", + "2a00:8180:2c00:200::/56" + ], "server.address": [ "unix:native", "tcp:4713" - ] + ], + "pulse.min.req": "256/48000", + "pulse.default.req": "960/48000", + "pulse.min.frag": "256/48000", + "pulse.default.frag": "96000/48000", + "pulse.default.tlength": "96000/48000", + "pulse.min.quantum": "256/48000", + "pulse.default.format": "F32" } } ] diff --git a/config/audio-server/pipewire-pulse.conf.json b/config/audio-server/pipewire-pulse.conf.json index 3e04a2c5..06b56572 100644 --- a/config/audio-server/pipewire-pulse.conf.json +++ b/config/audio-server/pipewire-pulse.conf.json @@ -1,12 +1,14 @@ { "context.modules": [ { - "args": {}, + "args": { + "nice.level": -11 + }, "flags": [ "ifexists", "nofail" ], - "name": "libpipewire-module-rtkit" + "name": "libpipewire-module-rt" }, { "name": "libpipewire-module-protocol-native" @@ -21,19 +23,35 @@ "name": "libpipewire-module-metadata" }, { - "args": { - "server.address": [ - "unix:native", - "tcp:4713" - ], - "vm.overrides": { - "pulse.min.quantum": "1024/48000" - } - }, + "args": {}, "name": "libpipewire-module-protocol-pulse" }, { "name": "libpipewire-module-zeroconf-publish" + }, + { + "args": { + "auth-ip-acl": [ + "127.0.0.0/8", + "::1/128", + "fd23:42:c3d2:500::/56", + "172.22.99.0/24", + "172.20.72.0/21", + "2a00:8180:2c00:200::/56" + ], + "pulse.default.format": "F32", + "pulse.default.frag": "96000/48000", + "pulse.default.req": "960/48000", + "pulse.default.tlength": "96000/48000", + "pulse.min.frag": "256/48000", + "pulse.min.quantum": "256/48000", + "pulse.min.req": "256/48000", + "server.address": [ + "unix:native", + "tcp:4713" + ] + }, + "name": "libpipewire-module-protocol-pulse" } ], "context.properties": {}, @@ -41,6 +59,72 @@ "audio.convert.*": "audioconvert/libspa-audioconvert", "support.*": "support/libspa-support" }, - "context.exec": [], - "stream.properties": {} + "context.exec": [ + { + "path": "pactl", + "args": "load-module module-always-sink" + } + ], + "stream.properties": {}, + "pulse.properties": { + "server.address": [ + "unix:native" + ], + "vm.overrides": { + "pulse.min.quantum": "1024/48000" + } + }, + "pulse.rules": [ + { + "matches": [ + {} + ], + "actions": { + "update-props": {} + } + }, + { + "matches": [ + { + "application.process.binary": "teams" + }, + { + "application.process.binary": "teams-insiders" + }, + { + "application.process.binary": "skypeforlinux" + } + ], + "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": "1024/48000", + "pulse.min.quantum": "1024/48000" + } + } + } + ] }