Skip to content

DGBooth/arctis-manager-linux

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Arctis Nova Pro Wireless — Linux Manager

A Linux system tray application for the SteelSeries Arctis Nova Pro Wireless headset, providing the features normally only available through SteelSeries GG on Windows.

Credits

This project builds on the original protocol research by Daniel Fanara (@dfanara), whose work documented the USB descriptor and discovered the ChatMix HID protocol. His original repository — dfanara/Arctis-on-Linux — is the base this was forked from. The LICENSE and original protocol documentation are his.

The following was discovered and implemented on top of that foundation:

  • Wireless link detection (06 b7)
  • Battery status for both headset and charging bay (06 b0)
  • Noise control — ANC and Transparency mode (06 bd)
  • Transparency level (06 b9)
  • Sidetone (06 39)
  • Full Rust implementation with PipeWire ChatMix routing and system tray

Features

  • System tray icon — colour-coded connection status (green / amber / grey), with ANC mode toggle in the context menu
  • Battery monitoring — separate levels for the active headset and the charging bay, with charging indicator
  • ChatMix routing — the physical ChatMix dial on the base station controls the relative volume of two PipeWire sinks in real time, automatically switching the system default output to the headset on connect and restoring it on disconnect
  • Noise control — toggle ANC, Transparency, or Off from the tray or the GUI
  • Transparency level — fine-grained slider (1–10) when Transparency mode is active
  • Sidetone — Off / Low / Medium / High
  • Auto sink setup — detects the Arctis headset sink automatically and creates a virtual Arctis Chat PipeWire sink on launch; no manual audio configuration required

Requirements

  • Linux with PipeWire (tested on Arch Linux / KDE Plasma Wayland)
  • Rust toolchain (rustup recommended)
  • libdbus (for the system tray — usually already present)

Setup

1. udev rule (non-root USB access)

sudo cp udev/70-arctis-nova.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm trigger

The rule uses TAG+="uaccess" which grants access based on your active login session (systemd-logind). No group membership is required.

2. Build

cargo build --release -p arctis-gui

3. Run

./target/release/arctis-gui

The app starts in the system tray. Left-click the icon or select Show from the context menu to open the GUI window. The window can be closed freely — the app continues running in the tray.

4. Audio routing (ChatMix)

On first launch the app will:

  1. Detect the Arctis headset sink automatically via pactl
  2. Create a virtual Arctis Chat PipeWire sink that routes through the headset
  3. Save both sink names to ~/.config/arctis/config.toml

Route your chat application (e.g. Discord) to the Arctis Chat sink using your audio mixer (e.g. pavucontrol or KDE Audio Settings). Game audio goes directly to the headset sink. The ChatMix dial then controls both volumes independently.

Sink names can be overridden in the GUI under ⚙ Sink settings if auto-detection picks the wrong device.


Protocol reference

All communication is via USB HID Interface 4 on the base station (VID=0x1038, PID=0x12e0).

Direction Endpoint Description
Host → Device 0x04 (OUT) Commands
Device → Host 0x84 (IN) Events / responses

Packets are 64 bytes, zero-padded. Commands use prefix 0x06; spontaneous device events use 0x07.

Commands (host → device)

Packet Description
06 49 01 Enable ChatMix
06 49 00 Disable ChatMix
06 b7 Query wireless link status
06 b0 Query battery status
06 bd 00 Set noise control: Off
06 bd 01 Set noise control: Transparency
06 bd 02 Set noise control: ANC
06 b9 0106 b9 0a Set transparency level (1–10)
06 39 00 Set sidetone: Off
06 39 01 Set sidetone: Low
06 39 02 Set sidetone: Medium
06 39 03 Set sidetone: High

Events (device → host)

Packet Description
07 b7 00 Wireless link: unlinked
07 b7 XX (XX ≠ 0) Wireless link: linked
06 b0 CC 00 01 00 04 HL BL ... Battery — HL headset level (0–8), BL bay level (0–8), CC=01 charging
07 45 GG CC ChatMix changed — GG game (0–100), CC chat (0–100); both 0x64 at centre
07 bd 00 Noise control changed: Off
07 bd 01 Noise control changed: Transparency
07 bd 02 Noise control changed: ANC
07 b9 0107 b9 0a Transparency level changed (1–10)
07 39 Sidetone changed: Off
07 39 0107 39 03 Sidetone changed: Low / Medium / High

Notes

  • The base station is always the USB device; the wireless headset link is separate and must be probed via 06 b7.
  • Battery levels are on a 0–8 scale (* 100 / 8 for a percentage).
  • 06 bd 00 sets noise control to Off — there is no distinct query command. Track state from inbound 07 bd events instead.
  • The base station will reboot if sent unknown command bytes. Only probe commands listed above.

Device descriptor

For reference, the full USB descriptor for the base station (from Daniel Fanara's original research):

DEVICE ID 1038:12e0 on Bus 000 Address 001
 idVendor               : 0x1038  SteelSeries
 idProduct              : 0x12e0  Arctis Nova Pro Wireless
 bNumConfigurations     :    0x1
  INTERFACE 0–2: Audio (isochronous audio I/O)
  INTERFACE 3: HID (2-byte interrupt, volume wheel)
  INTERFACE 4: HID (64-byte interrupt IN/OUT — control interface)
    ENDPOINT 0x84: Interrupt IN  (64 bytes, interval 0x10)
    ENDPOINT 0x04: Interrupt OUT (64 bytes, interval 0x10)

About

A system tray and gui app to bring limited Steelseries.gg functionality to linux

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors