feat: a50 dock service

This commit is contained in:
2026-01-04 23:42:04 +01:00
parent 63a657fc84
commit 6cb301eb81
3 changed files with 66 additions and 21 deletions

42
flake.lock generated
View File

@@ -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": {

View File

@@ -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

View File

@@ -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;
}
);
};
};
};
};
}