summaryrefslogtreecommitdiff
path: root/modules/audio.nix
diff options
context:
space:
mode:
Diffstat (limited to 'modules/audio.nix')
-rw-r--r--modules/audio.nix96
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" ];
+ };
+ };
+ }
+ ];
+ };
+ })
+ ];
+ };
+}