nix-user-module/modules/audio.nix

96 lines
3.1 KiB
Nix

{ config, lib, pkgs, ... }:
let
cfg = config.c3d2.audioStreaming;
release = lib.strings.fileContents "${pkgs.path}/.version";
in
{
options = {
c3d2.audioStreaming = lib.mkEnableOption "enable all services requires to audio stream to dacbert, glotzert or pulsebert";
};
config = lib.mkIf cfg {
environment.etc = lib.optionalAttrs (lib.versionAtLeast release "23.05") {
"pipewire/pipewire.conf.d/zeroconf.conf".text = builtins.toJSON {
"context.modules" = [ {
"name" = "libpipewire-module-zeroconf-discover";
} ];
};
};
environment.systemPackages = lib.mkIf config.services.xserver.enable (with pkgs; [
paprefs
pavucontrol
# https://wiki.archlinux.org/title/PulseAudio/Examples#PulseAudio_over_network
(pkgs.writeScriptBin "enable-pipebert-rtp" /* bash */ ''
set -eou pipefail
export PATH=$PATH:${lib.makeBinPath [ config.hardware.pulseaudio.package dig ]}
ip=$(dig +short pipebert.hq.c3d2.de)
pactl load-module module-null-sink sink_name=rtp sink_properties="node.description='Pipebert\ RTP\ Stream'"
pactl load-module module-rtp-send source=rtp.monitor destination_ip="$ip" port=9875
'')
(pkgs.writeScriptBin "disable-pipebert-rtp" /* bash */ ''
set -eou pipefail
export PATH=$PATH:${lib.makeBinPath [ config.hardware.pulseaudio.package ]}
pactl unload-module module-rtp-send
pactl unload-module module-null-sink
'')
]);
hardware.pulseaudio = {
# enabling zeroconf discovery or publishing turns on zeroconfSupport for the configured pulseaudio package
# pulseaudioFull has that enabled plus it has a cache hit on cache.nixos.org
package = pkgs.pulseaudioFull;
zeroconf.discovery.enable = true;
};
# required for paprefs to be able to save
programs.dconf.enable = lib.mkIf config.services.xserver.enable true;
security.rtkit.enable = true;
services = {
avahi = {
enable = true;
nssmdns = true;
};
pipewire = lib.mkMerge [
(lib.optionalAttrs (lib.versionOlder release "23.05") {
config.pipewire-pulse =
let
default-pipewire-pulse = lib.importJSON (pkgs.path + "/nixos/modules/services/desktops/pipewire/daemon/pipewire-pulse.conf.json");
in
default-pipewire-pulse // {
"context.modules" = default-pipewire-pulse."context.modules" ++ [
{
"name" = "libpipewire-module-zeroconf-discover";
}
];
};
})
{
pulse.enable = true;
}
];
# makes avahi unreliable
resolved.extraConfig = ''
MulticastDNS=no
'';
};
# TODO: rebuild using programs.dconf.profiles, see https://github.com/NixOS/nixpkgs/pull/234615
system.userActivationScripts.enableZeroconfDiscover.text = lib.mkIf config.services.xserver.enable ''
echo "[org/freedesktop/pulseaudio/module-groups/zeroconf-discover]
args0=''\''
enabled=true
name0='module-zeroconf-discover'
" | ${pkgs.dconf}/bin/dconf load /
'';
};
}