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