nixfiles/services/pipewire-low-latency.nix

59 lines
1.9 KiB
Nix

{ config, lib, pkgs, ... }:
let
inherit (lib) mkIf mkEnableOption;
cfg = config.qenya.services.pipewire.lowLatency;
in
{
options.qenya.services.pipewire.lowLatency = {
enable = mkEnableOption "config to decrease sound latency (increasing CPU load) for e.g. streaming";
# TODO: might be an idea to have the numbers be configurable
};
config = mkIf cfg.enable {
# TODO: needs more testing
services.pipewire.extraConfig = {
pipewire."92-low-latency" = {
context.properties = {
default.clock.rate = 48000;
default.clock.quantum = 32;
default.clock.min-quantum = 32;
default.clock.max-quantum = 32;
};
};
pipewire-pulse."92-low-latency" = {
context.modules = [
{
name = "libpipewire-module-protocol-pulse";
args = {
pulse.min.req = "32/48000";
pulse.default.req = "32/48000";
pulse.max.req = "32/48000";
pulse.min.quantum = "32/48000";
pulse.max.quantum = "32/48000";
};
}
];
stream.properties = {
node.latency = "32/48000";
resample.quality = 1;
};
};
};
# Available from NixOS 24.11. Lifted from https://nixos.wiki/wiki/PipeWire - probably need to adjust numbers
# services.pipewire.wireplumber.extraLuaConfig.main."99-alsa-lowlatency" = ''
# alsa_monitor.rules = {
# {
# matches = {{{ "node.name", "matches", "alsa_output.*" }}};
# apply_properties = {
# ["audio.format"] = "S32LE",
# ["audio.rate"] = "96000", -- for USB soundcards it should be twice your desired rate
# ["api.alsa.period-size"] = 2, -- defaults to 1024, tweak by trial-and-error
# -- ["api.alsa.disable-batch"] = true, -- generally, USB soundcards use the batch mode
# },
# },
# }
# '';
};
}