diff --git a/flake.lock b/flake.lock index 54a8659..9b4f5db 100644 --- a/flake.lock +++ b/flake.lock @@ -44,11 +44,11 @@ ] }, "locked": { - "lastModified": 1765860045, - "narHash": "sha256-7Lxp/PfOy4h3QIDtmWG/EgycaswqRSkDX4DGtet14NE=", + "lastModified": 1766881808, + "narHash": "sha256-JR7A2xS3EBPWFeONzhqez5vp7nKEsp7eLj2Ks210Srk=", "owner": "nix-community", "repo": "home-manager", - "rev": "09de9577d47d8bffb11c449b6a3d24e32ac16c99", + "rev": "d2e0458d6531885600b346e161c38790dc356fa8", "type": "github" }, "original": { @@ -91,11 +91,11 @@ "xwayland-satellite-unstable": "xwayland-satellite-unstable" }, "locked": { - "lastModified": 1765961589, - "narHash": "sha256-F1JFGtVQl4s9eiVrdM8MuAgMcU13CgARZiVADIzEqto=", + "lastModified": 1766765523, + "narHash": "sha256-DCk3GKdKZNjpvNuDy9ZVfVwCy3tlm96/UZnYkJO7N44=", "owner": "sodiboo", "repo": "niri-flake", - "rev": "bc56353a046ec01379f0bf971c99946a613b43b3", + "rev": "a3e638c75d07de759421e6f34bd69c3f9a0a3567", "type": "github" }, "original": { @@ -124,11 +124,11 @@ "niri-unstable": { "flake": false, "locked": { - "lastModified": 1765861551, - "narHash": "sha256-1Bo86J/7nm8sndZz9gGW0agydYzLYimdz9aQEhnf1zY=", + "lastModified": 1766751930, + "narHash": "sha256-83/YSW6c58i/iwGzAFApuMy6MCgoIaROeCcoIGh+ViU=", "owner": "YaLTeR", "repo": "niri", - "rev": "2641356d41199a40ccc9a2e9f61bd34d7e7c8220", + "rev": "b5640d5293ad8dca06cb447692ea7cbb21680eb1", "type": "github" }, "original": { @@ -155,11 +155,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1765779637, - "narHash": "sha256-KJ2wa/BLSrTqDjbfyNx70ov/HdgNBCBBSQP3BIzKnv4=", + "lastModified": 1766651565, + "narHash": "sha256-QEhk0eXgyIqTpJ/ehZKg9IKS7EtlWxF3N7DXy42zPfU=", "owner": "nixos", "repo": "nixpkgs", - "rev": "1306659b587dc277866c7b69eb97e5f07864d8c4", + "rev": "3e2499d5539c16d0d173ba53552a4ff8547f4539", "type": "github" }, "original": { @@ -171,11 +171,11 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1765838191, - "narHash": "sha256-m5KWt1nOm76ILk/JSCxBM4MfK3rYY7Wq9/TZIIeGnT8=", + "lastModified": 1766736597, + "narHash": "sha256-BASnpCLodmgiVn0M1MU2Pqyoz0aHwar/0qLkp7CjvSQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c6f52ebd45e5925c188d1a20119978aa4ffd5ef6", + "rev": "f560ccec6b1116b22e6ed15f4c510997d99d5852", "type": "github" }, "original": { @@ -194,11 +194,11 @@ "systems": "systems_2" }, "locked": { - "lastModified": 1765961056, - "narHash": "sha256-RCPRBIqKkwngttpcOhRVMbsCjnKYpc6Q5W7gwp36RN0=", + "lastModified": 1766918207, + "narHash": "sha256-G/Msy+w6e6W5Z517draGcMC0Fqpl4cfutZS5ijndpyM=", "owner": "nix-community", "repo": "nixvim", - "rev": "51bbde565a7538bb4e75defee13b3e951fb0ba81", + "rev": "51ae9913767528723397e1b227bd32a080058bb5", "type": "github" }, "original": { @@ -359,11 +359,11 @@ "xwayland-satellite-unstable": { "flake": false, "locked": { - "lastModified": 1765935116, - "narHash": "sha256-lNyckAdrhNKXsi9pNOBYajntNFlWs+BITVoIZuNuwX0=", + "lastModified": 1766429945, + "narHash": "sha256-9Kv4gWagx/u4RfZJzBMAoagW9ava5waxd+XoTkzqF7E=", "owner": "Supreeeme", "repo": "xwayland-satellite", - "rev": "979eab242e60cf481a31d9de508a1bdaf2dcf7d4", + "rev": "0dde7ca1d3a8e8c5082533d76084e2aa02bef70e", "type": "github" }, "original": { diff --git a/modules/nixos/hardware/astro-a50-dock.sh b/modules/nixos/hardware/astro-a50-dock.sh new file mode 100644 index 0000000..f8f0ef7 --- /dev/null +++ b/modules/nixos/hardware/astro-a50-dock.sh @@ -0,0 +1,13 @@ +stdbuf -oL hexdump -v -e '32/2 "%x " "\n"' "$HID_DEVICE" | while read -r line; do + echo "$line" + if [[ $line =~ ^c02[[:space:]]4[[:space:]]13[[:space:]]([0-9a-f]+) ]]; then + power_state=${BASH_REMATCH[1]} + if [[ $power_state == "0" ]]; then + echo "power=on" + wpctl set-default "$(pw-cli info "$HEADSET_NAME" | head -n 1 | awk '{print $2}')" + else + echo "power=off" + wpctl set-default "$(pw-cli info "$SPEAKERS_NAME" | head -n 1 | awk '{print $2}')" + fi + fi +done diff --git a/modules/nixos/hardware/astro-a50.nix b/modules/nixos/hardware/astro-a50.nix index d31d353..f56cec2 100644 --- a/modules/nixos/hardware/astro-a50.nix +++ b/modules/nixos/hardware/astro-a50.nix @@ -13,9 +13,18 @@ in { options.hardware.astro-a50 = { enable = mkEnableOption "Enable optimisations for the Logitech Astro A50 headset"; + sinkWhenDocked = mkOption { + type = types.nullOr types.str; + description = "The PipeWire sink name to switch to when the Astro A50 is docked. If null, no switching will be done."; + default = "alsa_output.pci-0000_0a_00.4.analog-stereo"; + }; }; config = mkIf cfg.enable { + services.udev.extraRules = '' + KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="0b1c", MODE="0660", GROUP="input" + ''; + users.extraGroups.input.members = [ username ]; home-manager.users.${username} = let name = "Astro A50"; @@ -66,6 +75,29 @@ in ]; }; }; + systemd.user.services.astro-dock = mkIf (cfg.sinkWhenDocked != null) { + Unit = { + Description = "Astro A50 Dock Detection"; + After = [ "pipewire.service" ]; + }; + + Install.WantedBy = [ "default.target" ]; + + Service = { + Restart = "always"; + ExecStart = lib.getExe ( + pkgs.writeShellApplication { + name = "astro-dock-detect"; + runtimeEnv = { + HID_DEVICE = "/dev/input/by-id/usb-Logitech_A50-if08-hidraw"; + HEADSET_NAME = nodeNameIn; + SPEAKERS_NAME = cfg.sinkWhenDocked; + }; + text = builtins.readFile ./astro-a50-dock.sh; + } + ); + }; + }; }; }; }