diff --git a/home-manager/modules/sway/default.nix b/home-manager/modules/sway/default.nix index 5f0f5f4..9ef0fd5 100644 --- a/home-manager/modules/sway/default.nix +++ b/home-manager/modules/sway/default.nix @@ -204,7 +204,7 @@ in #"Shift_R+Shift" = "exec ${pkgs.dbus}/bin/dbus-send --session --type=method_call --dest=net.sourceforge.mumble.mumble / net.sourceforge.mumble.Mumble.stopTalking"; - "XF86AudioMute" = "exec pactl set-source-mute alsa_input.usb-BEHRINGER_UMC202HD_192k-00.analog-stereo-input toggle"; + "XF86AudioMute" = "exec pactl set-source-mute UMC202HD_input1 toggle"; "${cfg.modifier}+l" = "exec ${pkgs.swaylock}/bin/swaylock -f -i ${wallpaper}"; }; diff --git a/modules/pipewire.nix b/modules/pipewire.nix index 8749d8f..1062291 100644 --- a/modules/pipewire.nix +++ b/modules/pipewire.nix @@ -1,5 +1,10 @@ { config, lib, pkgs, ... }: +let + defaults = { + media-session = (builtins.fromJSON (builtins.readFile "${pkgs.pipewire-media-session}/nix-support/media-session.conf.json")); + }; +in lib.mkIf config.myConfig.gui.enable { sound.enable = true; hardware.pulseaudio.enable = false; @@ -25,4 +30,43 @@ lib.mkIf config.myConfig.gui.enable { pavucontrol pulseaudio # pacmd and pactl ]; + + # Split U-PHORIA inputs into mono channels + # https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Virtual-Devices#behringer-umc404hd-micguitar-virtual-sources + services.pipewire.media-session.config.media-session."context.modules" = defaults.media-session."context.modules" ++ [ + { + name = "libpipewire-module-loopback"; + args = { + "node.name" = "UMC202HD_input1"; + "node.description" = "UMC202HD Input 1"; + "capture.props" = { + "audio.position" = [ "AUX0" ]; + "stream.dont-remix" = true; + "node.target" = "alsa_input.usb-BEHRINGER_UMC202HD_192k-00.pro-input-0"; + "node.passive" = true; + }; + "playback.props" = { + "media.class" = "Audio/Source"; + "audio.position" = [ "MONO" ]; + }; + }; + } + { + name = "libpipewire-module-loopback"; + args = { + "node.name" = "UMC202HD_input2"; + "node.description" = "UMC202HD Input 2"; + "capture.props" = { + "audio.position" = [ "AUX1" ]; + "stream.dont-remix" = true; + "node.target" = "alsa_input.usb-BEHRINGER_UMC202HD_192k-00.pro-input-0"; + "node.passive" = true; + }; + "playback.props" = { + "media.class" = "Audio/Source"; + "audio.position" = [ "MONO" ]; + }; + }; + } + ]; } diff --git a/pkgs/mute-indicator/pulseaudio_mute_indicator/service.py b/pkgs/mute-indicator/pulseaudio_mute_indicator/service.py index 0ef8e51..cb5feaf 100644 --- a/pkgs/mute-indicator/pulseaudio_mute_indicator/service.py +++ b/pkgs/mute-indicator/pulseaudio_mute_indicator/service.py @@ -3,25 +3,25 @@ import serial def run(): + source_to_led_mapping = { + "UMC202HD_input1": 0, + "UMC202HD_input2": 1, + } + with pulsectl.Pulse("event-printer") as pulse: def print_events(ev): with pulsectl.Pulse("event-source-info") as pulse2: source = pulse2.source_info(ev.index) - if source.name in [ - "alsa_input.usb-BEHRINGER_UMC202HD_192k-00.analog-stereo", - "alsa_input.usb-BEHRINGER_UMC202HD_192k-00.analog-stereo-input", - ]: + if source.name in source_to_led_mapping.keys(): muted = bool(source.mute) + led = source_to_led_mapping[source.name] with serial.Serial(port="/dev/mute-indicator", baudrate=115200) as ser: if muted: - ser.write("L0:32,0,0\n".encode()) - ser.write("L1:32,0,0\n".encode()) - ser.write("S\n".encode()) + ser.write(f"L{led}:32,0,0\n".encode()) else: - ser.write("L0:0,32,0\n".encode()) - ser.write("L1:0,32,0\n".encode()) - ser.write("S\n".encode()) + ser.write(f"L{led}:0,32,0\n".encode()) + ser.write("S\n".encode()) pulse.event_mask_set("source") pulse.event_callback_set(print_events)