Skip to content

Commit d919b53

Browse files
committed
Feat: Add sidetone support for SteelSeries Arctis Nova 3P Wireless
1 parent 49d9257 commit d919b53

File tree

4 files changed

+78
-0
lines changed

4 files changed

+78
-0
lines changed

src/device_registry.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "devices/steelseries_arctis_7_plus.h"
2323
#include "devices/steelseries_arctis_9.h"
2424
#include "devices/steelseries_arctis_nova_3.h"
25+
#include "devices/steelseries_arctis_nova_3p_wireless.h"
2526
#include "devices/steelseries_arctis_nova_5.h"
2627
#include "devices/steelseries_arctis_nova_7.h"
2728
#include "devices/steelseries_arctis_nova_pro_wireless.h"
@@ -68,6 +69,7 @@ void init_devices()
6869
add_device(elo71USB_init);
6970
// SteelSeries
7071
add_device(arctis_nova_3_init);
72+
add_device(arctis_nova_3p_wireless_init);
7173
add_device(arctis_nova_5_init);
7274
add_device(arctis_nova_7_init);
7375
add_device(arctis_7_plus_init);

src/devices/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ set(SOURCE_FILES ${SOURCE_FILES}
2929
${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis_9.h
3030
${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis_nova_3.h
3131
${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis_nova_3.c
32+
${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis_nova_3p_wireless.h
33+
${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis_nova_3p_wireless.c
3234
${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis_nova_5.h
3335
${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis_nova_5.c
3436
${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis_nova_7.h
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#include "../device.h"
2+
3+
#include <hidapi.h>
4+
#include <stdio.h>
5+
#include <string.h>
6+
7+
#define MSG_SIZE 64
8+
9+
#define ID_ARCTIS_NOVA_3P_WIRELESS 0x2269
10+
11+
static struct device device_arctis;
12+
13+
static const uint16_t PRODUCT_IDS[] = { ID_ARCTIS_NOVA_3P_WIRELESS };
14+
static const uint8_t SAVE_DATA[MSG_SIZE] = { 0x09 }; // Command to save settings to headset
15+
16+
static int arctis_nova_3p_wireless_send_sidetone(hid_device* device_handle, uint8_t num);
17+
18+
void arctis_nova_3p_wireless_init(struct device** device)
19+
{
20+
device_arctis.idVendor = VENDOR_STEELSERIES;
21+
device_arctis.idProductsSupported = PRODUCT_IDS;
22+
device_arctis.numIdProducts = sizeof(PRODUCT_IDS) / sizeof(PRODUCT_IDS[0]);
23+
24+
strncpy(device_arctis.device_name, "SteelSeries Arctis Nova 3P Wireless", sizeof(device_arctis.device_name));
25+
26+
device_arctis.capabilities = B(CAP_SIDETONE);
27+
// 0xc (3), 0xffc0 (4), 0xff00 (4)
28+
device_arctis.capability_details[CAP_SIDETONE] = (struct capability_detail) { .usagepage = 0xffc0, .usageid = 0x1, .interface = 4 };
29+
30+
device_arctis.send_sidetone = &arctis_nova_3p_wireless_send_sidetone;
31+
// device_arctis.send_equalizer_preset = &arctis_nova_3_send_equalizer_preset;
32+
// device_arctis.send_equalizer = &arctis_nova_3_send_equalizer;
33+
// device_arctis.send_microphone_mute_led_brightness = &arctis_nova_3_send_microphone_mute_led_brightness;
34+
// device_arctis.send_microphone_volume = &arctis_nova_3_send_microphone_volume;
35+
36+
*device = &device_arctis;
37+
}
38+
39+
static int arctis_nova_3p_wireless_send_sidetone(hid_device* device_handle, uint8_t num)
40+
{
41+
// This headset supports 11 levels of sidetone volume (0x0 to 0xa),
42+
// mapping a full range of 0-128 input values.
43+
if (num < 12) {
44+
num = 0x0;
45+
} else if (num < 24) {
46+
num = 0x1;
47+
} else if (num < 36) {
48+
num = 0x2;
49+
} else if (num < 48) {
50+
num = 0x3;
51+
} else if (num < 60) {
52+
num = 0x4;
53+
} else if (num < 72) {
54+
num = 0x5;
55+
} else if (num < 84) {
56+
num = 0x6;
57+
} else if (num < 96) {
58+
num = 0x7;
59+
} else if (num < 107) {
60+
num = 0x8;
61+
} else if (num < 118) {
62+
num = 0x9;
63+
} else { // num is 118 or greater (up to 128)
64+
num = 0xa;
65+
}
66+
67+
uint8_t data[MSG_SIZE] = { 0x39, num };
68+
hid_send_feature_report(device_handle, data, MSG_SIZE);
69+
70+
return hid_send_feature_report(device_handle, SAVE_DATA, MSG_SIZE);
71+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#pragma once
2+
3+
void arctis_nova_3p_wireless_init(struct device** device);

0 commit comments

Comments
 (0)