This is a quick and dirty implementation that I want to improve later (auto device discovery, USB disconnection handling, etc.) but for now it works and I hope it can be useful for anyone out there. This even works if the wireless headset is turned off, the ChatMix knob is moved, and the headset is turned on again!
You need hidapitester for this to work.
For Linux, simply replace the osascript
command with whatever fits your audio system. Please know that the math operation returns a value between 0 and 100.
The way it works is by using a virtual audio device (for example, on macOS, done with Loopback), which is set as the default system output device (so every app goes through it) and where your actual audio device is set as a monitoring device.
You'll also need to set up whichever VoIP software you're using (Discord, Skype, etc.) to directly output to your audio device, bypassing that virtual device.
The reason hidapitester is used is because HeadsetControl is quite unreliable for SteelSeries Nova headphones (due to having three USBHID devices with the same vid/pid, each responsible for a separate feature... which is why --usagePage
is used here)
From what I can tell, one of the three HID devices is used for the chatmix and other headset communication features (like battery management), another is used solely for media controls (and might be a virtual keyboard), and the last one is the actual audio interface.
If you have issues where the audio volume goes back to previous values, remove the trailing &
from line 5. This will make the volume switch rate less frequent but it should fix those issues.