{ 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" ]; }; }; } ]; }; }) ]; }; }