HeadsetControl 4.0.0 is a major release. It is the first stable release built on the complete rewrite of HeadsetControl from C to modern C++20, and it bundles all device and feature work accumulated since 3.1.0 — 20+ new headsets, new capabilities, and a large batch of battery/chatmix fixes.
Note for existing users: the command-line interface is unchanged — your existing commands and scripts keep working. The major version bump reflects the internal rewrite and the new public library API, not CLI breakage.
Highlights — the C++20 rewrite
HeadsetControl has been rewritten from the ground up in modern C++20:
- Type-safe error handling with
Result<T>— every device operation returns a rich result (level,status, errorcode+message) instead of ambiguous return codes. - New high-level library API — HeadsetControl is now usable as a library, not just a CLI:
- C++:
#include <headsetcontrol.hpp>(headsetcontrol::discover(),headset.getBattery(), …) - C / FFI:
#include <headsetcontrol_c.h>for bindings (Python, Rust, …) - Static (
headsetcontrol_lib) and optional shared (-DBUILD_SHARED_LIBRARY=ON, versioned with SOVERSION) targets.
- C++:
- Protocol templates (
HIDPPDevice,SteelSeriesDevice,CorsairDevice) that cut per-device code by 60–80%. - Data-driven feature system — a single capability-descriptor table and a handler registry replace the old giant switch statements, with automatic parameter validation and help-text generation.
- Comprehensive test suite — unit, mock-device, and integration tests, plus a virtual test device implementing every capability.
- Reorganized project layout —
src/*.c→lib/(core library) +cli/(command-line) +tests/; C++ headers use.hpp.
Breaking changes
- Requires a C++20 compiler (GCC 13+, Clang 16+, Apple Clang 15+, MSVC 2019 16.10+).
- Source layout reorganized into
lib/,cli/,tests/; headers renamed.h→.hpp. - New library targets and install layout (public headers under
lib/).
Full technical detail is in the release notes below and in docs/ADDING_A_DEVICE.md / docs/LIBRARY_USAGE.md.
New device support
- Audeze — Maxwell 2 (PlayStation/PC and Xbox variants)
- Corsair — Virtuoso XT, Virtuoso Max Wireless, HS80 Max, Wireless V2 family
- HyperX — Cloud III Wired (2026), Cloud II Wireless (incl. Kingston variant)
- Lenovo — Wireless VoIP Headset
- Logitech — ASTRO A50 Gen 5, G522 LIGHTSPEED, G PRO X2 LIGHTSPEED (Centurion protocol + new variant), G431 product ID
- Plantronics / Poly — Voyager 8200 UC (via BT600 dongle)
- Sony — INZONE H5 (WH-G500), INZONE Buds (WF-G700N)
- SteelSeries — Arctis Nova 3P Wireless, Arctis Nova 3X Wireless, Arctis Nova 7 (Gen 2), Arctis Nova 7X / 7P (Gen 2 + additional PIDs, Diablo edition, WoW 20th Anniversary edition), Arctis Buds
New features
- Noise filter capability (Audeze Maxwell).
- Parametric equalizer capability (SteelSeries Arctis Nova 3P), plus equalizer presets and microphone-volume support for that family.
- USB vendor/product name retrieval for connected devices.
- Per-capability platform specification (devices can declare Linux/macOS/Windows support).
equalizer_presets_countdecoupled from the preset list.- Packaging & installers: Windows NSIS installer, Linux AppImage /
.deb/.rpm, and portable binaries for all platforms, produced by the continuous-build pipeline with SHA-256 checksums.
Fixes
- Treat out-of-range battery voltage as unavailable rather than reporting a bogus level.
- Fix Arctis Nova 7 battery-level misreporting and correct the HID interface used for Nova 3P/3X battery queries.
- Use absolute battery reporting for SteelSeries Gen 2 devices.
- Fix inverted ChatMix mapping on SteelSeries Arctis 7 / Pro.
- Fix battery reporting on several Logitech devices and on HyperX Cloud II Wireless.
- Limit the Logitech PRO X2 legacy battery fallback to genuinely unsupported features.
- Fix
-oquerying each info capability twice; correct G Pro X2 sidetone-level mapping.
For developers
- Adding a device is now a small header-only class — see
docs/ADDING_A_DEVICE.md. - Using HeadsetControl as a library (C++, C, Python, Rust examples) — see
docs/LIBRARY_USAGE.md.
Release artifacts are signed — each download has a matching .asc detached GPG signature (key git@sapd.eu, fingerprint 77BE B7E2 32CF 1E51 5477 7D4D D586 6C58 9401 97BF). Verify with gpg --verify <file>.asc <file>.
What's Changed
- Fix rapid battery request issue on Audeze Maxwell by @ModoloDev in #412
- fix(steelseries_arctis_nova_7): add missing product ID by @ChadAPSheridan in #419
- Feat: Add support for SteelSeries Arctis Nova 3P Wireless by @marcg03 in #417
- Added OS X 3rd party tool by @ChrisLauinger77 in #420
- feat: Decouple equalizer_presets_count from equalizer_presets by @bwachtendorf in #423
- Upgrade clang-format to version 18 and improve version consistency by @Sapd in #428
- docs: Add headset-battery-indicator GUI link to README by @ruflas in #430
- Fix Battery on various Logitech devs by @Sapd in #434
- Add aarol/headset-battery-indicator to README by @aarol in #435
- Fix Hyperx Cloud II Wireless battery status by @Joaaoc in #436
- Add suport for SteelSeries Arctis Nova 3X Wireless by @jb-boin in #438
- add support for SteelSeries Arctis Nova 7x Wireless Gen 2 by @alyraffauf in #440
- C++ Rewrite by @Sapd in #443
- Update CI to use lukka/run-cmake@v10 with CMakePresets and add MSVC s… by @Sapd in #453
- edited third party softwares by @floraaubry in #445
- Packages by @Sapd in #454
- Organize Releases and add Windows Installer by @Sapd in #455
- Add top level project guard by @billtran1632001 in #456
- Add additional Steelseries Arctis Nova 7X v2 id by @Crashdummyy in #461
- Clang format PR CI fix by @Sapd in #465
- Replace -? for capabilities by @Sapd in #466
- CI: Fix PATH error of installer by @Sapd in #467
- Fix equalizer presets output in JSON, YAML, and ENV formats by @Sapd in #468
- Separate Nova 7P into its own device class without sidetone/chatmix by @Sapd in #469
- Fix cpp-linter 403 errors and apply code formatting by @Sapd in #470
- Nova 7 Diablo by @handy142 in #473
- Steelseries Gen2 uses absolute battery by @Sapd in #457
- Fix inverted ChatMix level for SteelSeries Arctis 7/Pro (#475) by @Sapd in #480
- Add support for Arctis Nova 7X (PIDs 0x22a4, 0x22a5) by @nisodex in #484
- changed interface id from 0 to 4 for Arctis Nova 3P Wireless by @mrkrook2012 in #483
- Add new device: Corsair wireless v2 by @Frank-py in #492
- Adds support for a new G PRO X2 variant by @ChrisLauinger77 in #478
- Add support for retrieving USB vendor and product names by @ChrisLauinger77 in #494
- Add new device: Lenovo Wireless VoIP Headset by @danielstuart14 in #497
- fix 499 - correct HID interface for Arctis Nova 3P/3X Wireless battery query by @asdfasdf-ohfot in #500
- Add new PID for Arctis Nova 7x v2, Nova 7P v2 by @aarol in #496
- Add support for Audeze Maxwell 2 PlayStation version by @jjantti22 in #502
- Update sidetone level mapping for Logitech G Pro X2 Lightspeed by @ChrisLauinger77 in #503
- Add support for Logitech G522 Lightspeed by @iowi479 in #501
- Add support for Sony INZONE Buds (WF-G700N) by @Sniqi in #505
- Updates QontrolPanel entries in README by @ChrisLauinger77 in #509
- Adding G431 product id by @LJ5O in #508
- Fix Arctis Nova 7 battery level misreporting. by @ashirkov-c-arlo in #507
- Logitech G PRO X 2 LIGHTSPEED Centurion protocol by @ChrisLauinger77 in #512
- Added full support for Audeze Maxwell 2 PS/PC version by @MonsterBagels in #506
- Fix HID++ battery voltage out-of-range handling by @eriosgamer in #516
- feat(device): add HyperX Cloud II Wireless (Kingston) by @Phelete in #519
- add HyperX Cloud III Wired 2026 by @MattGalan in #525
- Add Corsair Virtuoso Max Wireless support by @gravytrain in #530
- Add HeadsetControl-GUI to the Linux GUI applications list by @paradox-ng in #533
- Add Logitech ASTRO A50 Gen 5 (046d:0b1c) by @lluiseduardo-silva in #531
- Add Steelseries Arctis Buds (battery-only) by @NekoiNemo in #534
- Add HS80 Max support by @emericg in #537
- Limit PRO X 2 legacy battery fallback to unsupported features by @ChrisLauinger77 in #538
- Add support for Audeze Maxwell 2 Xbox version (PID 0x4b28) by @AdrianKuriata in #540
- Add Plantronics/Poly Voyager 8200 UC (BT600) support by @ggiesen in #536
- Added support for Corsair Virtuoso XT by @Anshuman01000001 in #527
- feat(device): add Sony INZONE H5 (WH-G500) by @splitbrain in #524
- Audeze Maxwell Noise Filter Capability and Audeze Maxwell 2 Protocol by @ModoloDev in #517
New Contributors
- @ChadAPSheridan made their first contribution in #419
- @marcg03 made their first contribution in #417
- @bwachtendorf made their first contribution in #423
- @ruflas made their first contribution in #430
- @aarol made their first contribution in #435
- @jb-boin made their first contribution in #438
- @alyraffauf made their first contribution in #440
- @billtran1632001 made their first contribution in #456
- @Crashdummyy made their first contribution in #461
- @handy142 made their first contribution in #473
- @nisodex made their first contribution in #484
- @mrkrook2012 made their first contribution in #483
- @Frank-py made their first contribution in #492
- @danielstuart14 made their first contribution in #497
- @asdfasdf-ohfot made their first contribution in #500
- @jjantti22 made their first contribution in #502
- @iowi479 made their first contribution in #501
- @Sniqi made their first contribution in #505
- @LJ5O made their first contribution in #508
- @ashirkov-c-arlo made their first contribution in #507
- @MonsterBagels made their first contribution in #506
- @eriosgamer made their first contribution in #516
- @Phelete made their first contribution in #519
- @MattGalan made their first contribution in #525
- @gravytrain made their first contribution in #530
- @paradox-ng made their first contribution in #533
- @lluiseduardo-silva made their first contribution in #531
- @NekoiNemo made their first contribution in #534
- @emericg made their first contribution in #537
- @AdrianKuriata made their first contribution in #540
- @ggiesen made their first contribution in #536
- @Anshuman01000001 made their first contribution in #527
- @splitbrain made their first contribution in #524
Full Changelog: 3.1.0...4.0.0