diff options
Diffstat (limited to 'modules/audio.nix')
| -rw-r--r-- | modules/audio.nix | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/modules/audio.nix b/modules/audio.nix new file mode 100644 index 0000000..e926076 --- /dev/null +++ b/modules/audio.nix @@ -0,0 +1,96 @@ +{ + flake.nixosModules.audio = { config, lib, pkgs, ... }: + let + cfg = config.os.core.audio; + in + { + options.os.core.audio = { + enable = lib.mkEnableOption "audio support"; + disable-devices.enable = lib.mkEnableOption "disables some random devices cluttering up"; + noise-cancellation.enable = lib.mkEnableOption "RNNoise background noise cancellation"; + }; + + config = lib.mkMerge [ + (lib.mkIf cfg.enable { + services.pulseaudio.enable = false; + security.rtkit.enable = true; + + services.pipewire = { + enable = true; + audio.enable = true; + pulse.enable = true; + alsa = { + enable = true; + support32Bit = true; + }; + jack.enable = true; + + wireplumber = { + enable = true; + extraConfig."99-lock-microphone-gain"."pulse.rules" = [{ + matches = [ { "application.name" = "~*cord*"; } ]; + actions.quirks = [ "no-source-volume" ]; + }]; + }; + }; + services.playerctld.enable = true; + + environment.systemPackages = with pkgs; [ + crosspipe + pulsemixer + pavucontrol + alsa-utils + ]; + }) + + (lib.mkIf cfg.disable-devices.enable { + services.pipewire.wireplumber.extraConfig = { + "99-disable-devices"."monitor.alsa.rules" = [{ + matches = [ + { "device.name" = "~alsa_card.pci-0000_03_00.1*"; } + { "device.description" = "~USB Audio*"; } + ]; + actions.update-props."device.disabled" = true; + }]; + }; + }) + + (lib.mkIf cfg.noise-cancellation.enable { + services.pipewire.extraConfig.pipewire."99-rnnoise" = { + "context.modules" = [ + { + name = "libpipewire-module-filter-chain"; + args = { + "node.description" = "Noise Canceling Source"; + "media.name" = "Noise Canceling Source"; + "filter.graph".nodes = [ + { + type = "ladspa"; + name = "rnnoise"; + plugin = "${pkgs.rnnoise-plugin}/lib/ladspa/librnnoise_ladspa.so"; + label = "noise_suppressor_mono"; + control = { + "VAD Threshold (%)" = 50.0; + "VAD Grace Period (ms)" = 200.0; + "Retroactive VAD Grace Period (ms)" = 0.0; + }; + } + ]; + "capture.props" = { + "node.name" = "effect_input.rnnoise"; + "node.passive" = true; + "audio.position" = [ "MONO" ]; + }; + "playback.props" = { + "node.name" = "effect_output.rnnoise"; + "media.class" = "Audio/Source"; + "audio.position" = [ "MONO" ]; + }; + }; + } + ]; + }; + }) + ]; + }; +} |
