dot

NixOS dotfiles
git clone https://git.echoz.io/dot.git
Log | Files | Refs

pipewire.nix (4393B)


      1 {
      2   lib,
      3   ...
      4 }:
      5 {
      6   services.pipewire.extraConfig.pipewire.default = {
      7     "context.properties" = {
      8       "default.clock.rate" = 44100;
      9       "default.clock.allowed-rates" = [ 44100 ];
     10     };
     11   };
     12 
     13   services.pipewire.wireplumber.extraConfig = {
     14     general = {
     15       "wireplumber.settings" = {
     16         "device.restore-profile" = false;
     17         "device.restore-routes" = false;
     18         "device.routes.default-sink-volume" = 1.0;
     19         "device.routes.default-source-volume" = 1.0;
     20       };
     21 
     22       "wireplumber.profiles".main = {
     23         "hooks.device.profile.state" = "disabled";
     24         "hooks.device.routes.state" = "disabled";
     25         "hooks.default-nodes.state" = "disabled";
     26         "hooks.stream.state" = "disabled";
     27       };
     28     };
     29 
     30     devices."monitor.alsa.rules" = [
     31       {
     32         matches = lib.singleton {
     33           "device.description" = "DENON DJ MC7000";
     34         };
     35         actions.update-props = {
     36           "device.profile" = "pro-audio";
     37         };
     38       }
     39       {
     40         matches = lib.singleton {
     41           "alsa.card_name" = "Xonar STX";
     42           "media.class" = "Audio/Sink";
     43         };
     44         actions.update-props = {
     45           "node.description" = "Desktop";
     46           "node.nick" = "Desktop";
     47           "priority.session" = 8000;
     48           "priority.driver" = 8000;
     49         };
     50       }
     51 
     52       {
     53         matches = lib.singleton {
     54           "alsa.card_name" = "Xonar STX";
     55           "media.class" = "Audio/Source";
     56         };
     57         actions.update-props."node.disabled" = true;
     58       }
     59       {
     60         matches = lib.singleton {
     61           "alsa.card_name" = "RODE NT-USB";
     62           "media.class" = "Audio/Source";
     63         };
     64         actions.update-props = {
     65           "node.description" = "Voice";
     66           "node.nick" = "Voice";
     67           "priority.session" = 9000;
     68           "priority.driver" = 9000;
     69         };
     70       }
     71       {
     72         matches = lib.singleton {
     73           "alsa.card_name" = "RODE NT-USB";
     74           "media.class" = "Audio/Sink";
     75         };
     76         actions.update-props."node.disabled" = true;
     77       }
     78       {
     79         matches = lib.singleton {
     80           "alsa.card_name" = "HDA ATI HDMI";
     81         };
     82         actions.update-props."node.disabled" = true;
     83       }
     84       {
     85         matches = lib.singleton {
     86           "alsa.card_name" = "HD 720P webcam";
     87         };
     88         actions.update-props."node.disabled" = true;
     89       }
     90       {
     91         matches = lib.singleton {
     92           "alsa.card_name" = "HD-Audio Generic";
     93         };
     94         actions.update-props."node.disabled" = true;
     95       }
     96     ];
     97     loopback = {
     98       "wireplumber.components" = lib.singleton {
     99         name = "loopback.lua";
    100         type = "script/lua";
    101         provides = "custom.loopback";
    102       };
    103       "wireplumber.profiles".main."custom.loopback" = "required";
    104     };
    105   };
    106 
    107   services.pipewire.wireplumber.extraScripts."loopback.lua" = ''
    108     masterOutput = LocalModule("libpipewire-module-loopback", [[
    109       audio.position = [ FL FR ]
    110       capture.props = {
    111         media.class = Audio/Sink
    112         node.name = "capture.master"
    113         node.description = "Master"
    114         node.latency = 1024/44100
    115         audio.rate = 44100
    116         audio.channels = 2
    117         audio.position = [ FL FR ]
    118         priority.session = 6000
    119         priority.driver = 6000
    120       }
    121       playback.props = {
    122         node.name = "playback.master"
    123         node.description = "Master"
    124         node.latency = 1024/44100
    125         audio.rate = 44100
    126         audio.channels = 2
    127         audio.position = [ AUX0 AUX1 ]
    128         target.object = "alsa_output.usb-DENON_DJ_DENON_DJ_MC7000_201603-00.pro-output-0"
    129       }
    130     ]])
    131 
    132     headphoneOutput = LocalModule("libpipewire-module-loopback", [[
    133       audio.position = [ FL FR ]
    134       capture.props = {
    135         media.class = Audio/Sink
    136         node.name = "capture.headphones"
    137         node.description = "Headphones"
    138         node.latency = 1024/44100
    139         audio.rate = 44100
    140         audio.channels = 2
    141         audio.position = [ FL FR ]
    142         priority.session = 7000
    143         priority.driver = 7000
    144       }
    145       playback.props = {
    146         node.name = "playback.headphones"
    147         node.description = "Headphones"
    148         node.latency = 1024/44100
    149         audio.rate = 44100
    150         audio.channels = 2
    151         audio.position = [ AUX2 AUX3 ]
    152         target.object = "alsa_output.usb-DENON_DJ_DENON_DJ_MC7000_201603-00.pro-output-0"
    153       }
    154     ]])
    155   '';
    156 }