76 lines
2.4 KiB
Nix
76 lines
2.4 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
...
|
|
}: let
|
|
cfg = config.hive.sound;
|
|
in {
|
|
options = {
|
|
hive.sound = {
|
|
enable = lib.mkOption {
|
|
type = lib.types.bool;
|
|
default = false;
|
|
description = "Enable sound with pipewire.";
|
|
};
|
|
noisetorch = lib.mkOption {
|
|
type = lib.types.bool;
|
|
default = false;
|
|
description = "Enable Noisetorch for noise cancellation.";
|
|
};
|
|
noisetorch-threshold = lib.mkOption {
|
|
type = lib.types.int;
|
|
default = -1;
|
|
description = "Set the noise cancellation threshold for Noisetorch.";
|
|
};
|
|
};
|
|
};
|
|
config = lib.mkIf cfg.enable {
|
|
# Enable sound with pipewire.
|
|
services.pulseaudio.enable = false;
|
|
security.rtkit.enable = true;
|
|
services.pipewire = {
|
|
enable = true;
|
|
alsa.enable = true;
|
|
alsa.support32Bit = true;
|
|
pulse.enable = true;
|
|
# If you want to use JACK applications, uncomment this
|
|
#jack.enable = true;
|
|
|
|
# use the example session manager (no others are packaged yet so this is enabled by default,
|
|
# no need to redefine it in your config for now)
|
|
#media-session.enable = true;
|
|
};
|
|
programs.noisetorch.enable = cfg.noisetorch;
|
|
systemd.user.services.noisetorch-autoload = lib.mkIf cfg.noisetorch {
|
|
description = "Automatically load Noisetorch on user login";
|
|
after = ["pipewire.service"];
|
|
requires = ["pipewire.service"];
|
|
serviceConfig = {
|
|
Type = "oneshot";
|
|
ExecStart = "${pkgs.writeShellScript "load-noisetorch" ''
|
|
set -euo pipefail
|
|
NOISETORCH="${pkgs.noisetorch}/bin/noisetorch"
|
|
WPCTL="${pkgs.wireplumber}/bin/wpctl"
|
|
GREP="${pkgs.gnugrep}/bin/grep"
|
|
AWK="${pkgs.gawk}/bin/awk"
|
|
HEAD="${pkgs.coreutils}/bin/head"
|
|
|
|
sleep 2
|
|
$NOISETORCH -i -t ${toString cfg.noisetorch-threshold};
|
|
sleep 2
|
|
FILTER_ID=$($WPCTL status | $GREP NoiseTorch | $AWK 'match($0, /[0-9]+(\.[0-9]+)?/) { print substr($0, RSTART, RLENGTH) }' | head -n1)
|
|
if [ -n "$FILTER_ID" ]; then
|
|
$WPCTL set-default $FILTER_ID
|
|
else
|
|
echo "Noisetorch filter not found, skipping setting default source."
|
|
fi
|
|
''}";
|
|
ExecStop = "${pkgs.noisetorch}/bin/noisetorch -u";
|
|
RemainAfterExit = true;
|
|
};
|
|
wantedBy = ["default.target"];
|
|
};
|
|
};
|
|
}
|