Skip to content

Instantly share code, notes, and snippets.

@HeySora
Last active October 25, 2024 08:59
Show Gist options
  • Save HeySora/5a934ab9ab6bf9997fc7d1b1eb6345d8 to your computer and use it in GitHub Desktop.
Save HeySora/5a934ab9ab6bf9997fc7d1b1eb6345d8 to your computer and use it in GitHub Desktop.
SteelSeries Arctis Nova Chatmix feature re-implementation, for macOS and Linux, without using SteelSeries software
#!/bin/bash
hidapitester -q --vidpid 1038:2202 --usagePage 0xFF00 -l 3 -t 30000 --open --read-input-forever | while read -r -a data
do
[ ${data[0]} = 45 ] && osascript -e "set volume output volume $(( (0x${data[1]} + 0x64 - 0x${data[2]}) / 2 ))" &
done

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.

image

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment