Skip to content

Commit 4dd034e

Browse files
authored
Separate Nova 7P into its own device class without sidetone/chatmix (#469)
Fixes #450 - The Arctis Nova 7P has different hardware behavior compared to the Nova 7/7X variants: - The dial controls sidetone instead of chatmix - Sidetone setting has no effect - Chatmix always returns a fixed value (64) This commit creates a separate SteelSeriesArctisNova7P class that inherits from SteelSeriesArctisNova7 but disables CAP_SIDETONE and CAP_CHATMIX_STATUS. Changes: - Add new steelseries_arctis_nova_7p.hpp with Nova 7P-specific class - Remove 0x220a (Nova 7P) from Nova 7 device class - Register Nova 7P as separate device in device_registry.cpp - Update README.md device table
1 parent 25a769b commit 4dd034e

File tree

4 files changed

+48
-4
lines changed

4 files changed

+48
-4
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ A cross-platform tool to control USB gaming headsets on **Linux**, **macOS**, an
3232
| SteelSeries Arctis Pro Wireless | All | x | x | | | x | | | | | | | | | | | |
3333
| SteelSeries Arctis Nova 3 | All | x | | | | | | | | x | x | | x | x | | | |
3434
| SteelSeries Arctis Nova (5/5X) | All | x | x | | | x | x | | | x | x | x | x | x | x | | |
35-
| SteelSeries Arctis Nova 7 | All | x | x | | | x | | | | | | | | | | | |
35+
| SteelSeries Arctis Nova 7 | All | x | x | | | x | x | | | x | x | | x | x | x | x | x |
36+
| SteelSeries Arctis Nova 7P | All | | x | | | x | | | | x | x | | x | x | x | x | x |
3637
| SteelSeries Arctis 7+ | All | x | x | | | x | x | | | x | x | | | | | | |
3738
| SteelSeries Arctis Nova Pro Wireless | All | x | x | | x | x | | | | x | x | | | | | | |
3839
| SteelSeries Arctis Nova 3P Wireless | L/M | x | x | | | x | | | | x | x | x | | x | | | |

lib/device_registry.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "devices/steelseries_arctis_nova_3p_wireless.hpp"
2222
#include "devices/steelseries_arctis_nova_5.hpp"
2323
#include "devices/steelseries_arctis_nova_7.hpp"
24+
#include "devices/steelseries_arctis_nova_7p.hpp"
2425
#include "devices/steelseries_arctis_nova_pro_wireless.hpp"
2526
#include "devices/steelseries_arctis_pro_wireless.hpp"
2627

@@ -98,6 +99,7 @@ void DeviceRegistry::initialize()
9899
registerDevice(std::make_unique<SteelSeriesArctisNova3>());
99100
registerDevice(std::make_unique<SteelSeriesArctisNova5>());
100101
registerDevice(std::make_unique<SteelSeriesArctisNova7>());
102+
registerDevice(std::make_unique<SteelSeriesArctisNova7P>());
101103
registerDevice(std::make_unique<SteelSeriesArctis7Plus>());
102104
registerDevice(std::make_unique<SteelSeriesArctisNovaProWireless>());
103105
registerDevice(std::make_unique<SteelSeriesArctisNova3PWireless>());

lib/devices/steelseries_arctis_nova_7.hpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ using namespace std::string_view_literals;
1111
namespace headsetcontrol {
1212

1313
/**
14-
* @brief SteelSeries Arctis Nova 7/7X/7P Gaming Headset
14+
* @brief SteelSeries Arctis Nova 7/7X Gaming Headset
1515
*
1616
* Features:
1717
* - Sidetone (4 levels)
@@ -23,16 +23,18 @@ namespace headsetcontrol {
2323
* - Microphone volume (8 levels)
2424
* - Volume limiter
2525
* - Bluetooth settings
26+
*
27+
* Note: Nova 7P (0x220a) is handled by SteelSeriesArctisNova7P due to
28+
* different hardware behavior (no working sidetone/chatmix).
2629
*/
2730
class SteelSeriesArctisNova7 : public protocols::SteelSeriesNovaDevice<SteelSeriesArctisNova7> {
2831
public:
29-
static constexpr std::array<uint16_t, 8> SUPPORTED_PRODUCT_IDS {
32+
static constexpr std::array<uint16_t, 7> SUPPORTED_PRODUCT_IDS {
3033
0x2202, // Arctis Nova 7
3134
0x227e, // Arctis Nova 7 Wireless
3235
0x2206, // Arctis Nova 7x
3336
0x2258, // Arctis Nova 7x v2
3437
0x229e, // Arctis Nova 7x v2
35-
0x220a, // Arctis Nova 7p
3638
0x223a, // Arctis Nova 7 Diablo IV
3739
0x227a // Arctis Nova 7 WoW Edition
3840
};
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#pragma once
2+
3+
#include "steelseries_arctis_nova_7.hpp"
4+
5+
namespace headsetcontrol {
6+
7+
/**
8+
* @brief SteelSeries Arctis Nova 7P Gaming Headset
9+
*
10+
* The Nova 7P is a variant of the Nova 7 with different hardware behavior:
11+
* - The dial controls sidetone instead of chatmix, but sidetone setting doesn't work
12+
* - Chatmix always returns a fixed value (64)
13+
*
14+
* This class inherits from Nova 7 and disables the non-functional capabilities.
15+
* See: https://github.com/Sapd/HeadsetControl/issues/450
16+
*/
17+
class SteelSeriesArctisNova7P : public SteelSeriesArctisNova7 {
18+
public:
19+
std::vector<uint16_t> getProductIds() const override
20+
{
21+
return { 0x220a }; // Arctis Nova 7P only
22+
}
23+
24+
std::string_view getDeviceName() const override
25+
{
26+
return "SteelSeries Arctis Nova 7P"sv;
27+
}
28+
29+
constexpr int getCapabilities() const override
30+
{
31+
// Nova 7P does not support sidetone or chatmix
32+
// (sidetone setting has no effect, chatmix always returns 64)
33+
return B(CAP_BATTERY_STATUS)
34+
| B(CAP_INACTIVE_TIME) | B(CAP_EQUALIZER) | B(CAP_EQUALIZER_PRESET)
35+
| B(CAP_MICROPHONE_MUTE_LED_BRIGHTNESS) | B(CAP_MICROPHONE_VOLUME)
36+
| B(CAP_VOLUME_LIMITER) | B(CAP_BT_WHEN_POWERED_ON) | B(CAP_BT_CALL_VOLUME);
37+
}
38+
};
39+
} // namespace headsetcontrol

0 commit comments

Comments
 (0)