From f3130d787ead147c45fc0a64205216496440b4b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Wachtendorf?= Date: Wed, 8 Oct 2025 23:13:17 +0200 Subject: [PATCH] feat: Decouple equalizer_presets_count from equalizer_presets --- src/device.h | 1 + src/devices/audeze_maxwell.c | 4 +++- src/devices/headsetcontrol_test.c | 16 +++++++++------ src/devices/steelseries_arctis_7_plus.c | 9 +++++---- src/devices/steelseries_arctis_nova_3.c | 9 +++++---- src/devices/steelseries_arctis_nova_5.c | 13 ++++++------ src/devices/steelseries_arctis_nova_7.c | 11 +++++----- .../steelseries_arctis_nova_pro_wireless.c | 9 +++++---- src/main.c | 6 +++--- src/output.c | 20 +++++++++++++------ src/output.h | 2 ++ 11 files changed, 61 insertions(+), 39 deletions(-) diff --git a/src/device.h b/src/device.h index 7c2c518..20b8e24 100644 --- a/src/device.h +++ b/src/device.h @@ -209,6 +209,7 @@ struct device { // Equalizer Infos EqualizerInfo* equalizer; + uint8_t equalizer_presets_count; EqualizerPresets* equalizer_presets; ParametricEqualizerInfo* parametric_equalizer; diff --git a/src/devices/audeze_maxwell.c b/src/devices/audeze_maxwell.c index 0c44b60..3cee400 100644 --- a/src/devices/audeze_maxwell.c +++ b/src/devices/audeze_maxwell.c @@ -31,6 +31,8 @@ void audeze_maxwell_init(struct device** device) device_maxwell.idProductsSupported = PRODUCT_IDS; device_maxwell.numIdProducts = sizeof(PRODUCT_IDS) / sizeof(PRODUCT_IDS[0]); + device_maxwell.equalizer_presets_count = 10; + strncpy(device_maxwell.device_name, "Audeze Maxwell", sizeof(device_maxwell.device_name)); device_maxwell.capabilities = B(CAP_SIDETONE) | B(CAP_INACTIVE_TIME) | B(CAP_VOLUME_LIMITER) | B(CAP_EQUALIZER_PRESET) | B(CAP_BATTERY_STATUS) | B(CAP_CHATMIX_STATUS) | B(CAP_VOICE_PROMPTS); @@ -276,7 +278,7 @@ static int audeze_maxwell_send_equalizer_preset(hid_device* hid_device, uint8_t static int audeze_maxwell_send_equalizer_custom_preset(hid_device* hid_device, uint8_t num) { // Getting only custom presets - return audeze_maxwell_send_equalizer_preset(hid_device, 7 + num); + return audeze_maxwell_send_equalizer_preset(hid_device, num + 1); } // The chatmix level is in the range of 0 to 20, where 10 is the center position. diff --git a/src/devices/headsetcontrol_test.c b/src/devices/headsetcontrol_test.c index d18893e..67894ea 100644 --- a/src/devices/headsetcontrol_test.c +++ b/src/devices/headsetcontrol_test.c @@ -67,12 +67,13 @@ void headsetcontrol_test_init(struct device** device) abort(); } - device_headsetcontrol_test.idVendor = VENDOR_TESTDEVICE; - device_headsetcontrol_test.idProductsSupported = PRODUCT_IDS; - device_headsetcontrol_test.numIdProducts = 1; - device_headsetcontrol_test.equalizer = &EQUALIZER; - device_headsetcontrol_test.equalizer_presets = &EQUALIZER_PRESETS; - device_headsetcontrol_test.parametric_equalizer = &PARAMETRIC_EQUALIZER; + device_headsetcontrol_test.idVendor = VENDOR_TESTDEVICE; + device_headsetcontrol_test.idProductsSupported = PRODUCT_IDS; + device_headsetcontrol_test.numIdProducts = 1; + device_headsetcontrol_test.equalizer = &EQUALIZER; + device_headsetcontrol_test.equalizer_presets = &EQUALIZER_PRESETS; + device_headsetcontrol_test.equalizer_presets_count = EQUALIZER_PRESETS_COUNT; + device_headsetcontrol_test.parametric_equalizer = &PARAMETRIC_EQUALIZER; strncpy(device_headsetcontrol_test.device_name, "HeadsetControl Test device", sizeof(device_headsetcontrol_test.device_name)); // normally filled by hid in main.c @@ -157,6 +158,9 @@ static int headsetcontrol_test_lights(hid_device* device_handle, uint8_t on) static int headsetcontrol_test_send_equalizer_preset(hid_device* device_handle, uint8_t num) { + if (num < 0 || num > EQUALIZER_PRESETS_COUNT-1) { + return -1; + } return TESTBYTES_SEND; } diff --git a/src/devices/steelseries_arctis_7_plus.c b/src/devices/steelseries_arctis_7_plus.c index 432a1cd..2dffd6b 100644 --- a/src/devices/steelseries_arctis_7_plus.c +++ b/src/devices/steelseries_arctis_7_plus.c @@ -40,10 +40,11 @@ int arctis_7_plus_read_device_status(hid_device* device_handle, unsigned char* d void arctis_7_plus_init(struct device** device) { - device_arctis.idVendor = VENDOR_STEELSERIES; - device_arctis.idProductsSupported = PRODUCT_IDS; - device_arctis.numIdProducts = sizeof(PRODUCT_IDS) / sizeof(PRODUCT_IDS[0]); - device_arctis.equalizer = &EQUALIZER; + device_arctis.idVendor = VENDOR_STEELSERIES; + device_arctis.idProductsSupported = PRODUCT_IDS; + device_arctis.numIdProducts = sizeof(PRODUCT_IDS) / sizeof(PRODUCT_IDS[0]); + device_arctis.equalizer = &EQUALIZER; + device_arctis.equalizer_presets_count = 4; strncpy(device_arctis.device_name, "SteelSeries Arctis 7+", sizeof(device_arctis.device_name)); diff --git a/src/devices/steelseries_arctis_nova_3.c b/src/devices/steelseries_arctis_nova_3.c index f33df7e..a6d5a4d 100644 --- a/src/devices/steelseries_arctis_nova_3.c +++ b/src/devices/steelseries_arctis_nova_3.c @@ -27,10 +27,11 @@ static int arctis_nova_3_send_microphone_volume(hid_device* device_handle, uint8 void arctis_nova_3_init(struct device** device) { - device_arctis.idVendor = VENDOR_STEELSERIES; - device_arctis.idProductsSupported = PRODUCT_IDS; - device_arctis.numIdProducts = sizeof(PRODUCT_IDS) / sizeof(PRODUCT_IDS[0]); - device_arctis.equalizer = &EQUALIZER; + device_arctis.idVendor = VENDOR_STEELSERIES; + device_arctis.idProductsSupported = PRODUCT_IDS; + device_arctis.numIdProducts = sizeof(PRODUCT_IDS) / sizeof(PRODUCT_IDS[0]); + device_arctis.equalizer = &EQUALIZER; + device_arctis.equalizer_presets_count = 4; strncpy(device_arctis.device_name, "SteelSeries Arctis Nova 3", sizeof(device_arctis.device_name)); diff --git a/src/devices/steelseries_arctis_nova_5.c b/src/devices/steelseries_arctis_nova_5.c index 7e6683d..8d205b5 100644 --- a/src/devices/steelseries_arctis_nova_5.c +++ b/src/devices/steelseries_arctis_nova_5.c @@ -98,12 +98,13 @@ static int nova_5_save_state(hid_device* device_handle); void arctis_nova_5_init(struct device** device) { - device_arctis.idVendor = VENDOR_STEELSERIES; - device_arctis.idProductsSupported = PRODUCT_IDS; - device_arctis.numIdProducts = sizeof(PRODUCT_IDS) / sizeof(PRODUCT_IDS[0]); - device_arctis.equalizer = &EQUALIZER; - device_arctis.equalizer_presets = &EQUALIZER_PRESETS; - device_arctis.parametric_equalizer = &PARAMETRIC_EQUALIZER; + device_arctis.idVendor = VENDOR_STEELSERIES; + device_arctis.idProductsSupported = PRODUCT_IDS; + device_arctis.numIdProducts = sizeof(PRODUCT_IDS) / sizeof(PRODUCT_IDS[0]); + device_arctis.equalizer = &EQUALIZER; + device_arctis.equalizer_presets = &EQUALIZER_PRESETS; + device_arctis.equalizer_presets_count = EQUALIZER_PRESETS_COUNT; + device_arctis.parametric_equalizer = &PARAMETRIC_EQUALIZER; strncpy(device_arctis.device_name, "SteelSeries Arctis Nova (5/5X)", sizeof(device_arctis.device_name)); diff --git a/src/devices/steelseries_arctis_nova_7.c b/src/devices/steelseries_arctis_nova_7.c index 380a2f9..931599b 100644 --- a/src/devices/steelseries_arctis_nova_7.c +++ b/src/devices/steelseries_arctis_nova_7.c @@ -63,11 +63,12 @@ int arctis_nova_7_read_device_status(hid_device* device_handle, unsigned char* d void arctis_nova_7_init(struct device** device) { - device_arctis.idVendor = VENDOR_STEELSERIES; - device_arctis.idProductsSupported = PRODUCT_IDS; - device_arctis.numIdProducts = sizeof(PRODUCT_IDS) / sizeof(PRODUCT_IDS[0]); - device_arctis.equalizer = &EQUALIZER; - device_arctis.equalizer_presets = &EQUALIZER_PRESETS; + device_arctis.idVendor = VENDOR_STEELSERIES; + device_arctis.idProductsSupported = PRODUCT_IDS; + device_arctis.numIdProducts = sizeof(PRODUCT_IDS) / sizeof(PRODUCT_IDS[0]); + device_arctis.equalizer = &EQUALIZER; + device_arctis.equalizer_presets = &EQUALIZER_PRESETS; + device_arctis.equalizer_presets_count = EQUALIZER_PRESETS_COUNT; strncpy(device_arctis.device_name, "SteelSeries Arctis Nova 7", sizeof(device_arctis.device_name)); diff --git a/src/devices/steelseries_arctis_nova_pro_wireless.c b/src/devices/steelseries_arctis_nova_pro_wireless.c index 09e93b2..7ee4f86 100644 --- a/src/devices/steelseries_arctis_nova_pro_wireless.c +++ b/src/devices/steelseries_arctis_nova_pro_wireless.c @@ -63,10 +63,11 @@ static int save_state(hid_device* device_handle); void arctis_nova_pro_wireless_init(struct device** device) { - device_arctis.idVendor = VENDOR_STEELSERIES; - device_arctis.idProductsSupported = PRODUCT_IDS; - device_arctis.numIdProducts = sizeof(PRODUCT_IDS) / sizeof(PRODUCT_IDS[0]); - device_arctis.equalizer = &EQUALIZER; + device_arctis.idVendor = VENDOR_STEELSERIES; + device_arctis.idProductsSupported = PRODUCT_IDS; + device_arctis.numIdProducts = sizeof(PRODUCT_IDS) / sizeof(PRODUCT_IDS[0]); + device_arctis.equalizer = &EQUALIZER; + device_arctis.equalizer_presets_count = EQUALIZER_PRESET_CUSTOM; strncpy(device_arctis.device_name, "SteelSeries Arctis Nova Pro Wireless", sizeof(device_arctis.device_name)); diff --git a/src/main.c b/src/main.c index 9240596..eabe882 100644 --- a/src/main.c +++ b/src/main.c @@ -493,7 +493,7 @@ void print_help(char* programname, struct device* device_found, bool show_all) printf(" -e, --equalizer STRING\tSet equalizer curve (values separated by spaces, commas, or new-lines)\n"); } if (show_equalizer_preset) { - printf(" -p, --equalizer-preset NUMBER\tSet equalizer preset (0-3, 0 for default)\n"); + printf(" -p, --equalizer-preset NUMBER\tSet equalizer preset (0-%d, 0 for default)\n", device_found->equalizer_presets_count-1); } printf("\n"); } @@ -780,8 +780,8 @@ int main(int argc, char* argv[]) case 'p': equalizer_preset = strtol(optarg, &endptr, 10); - if (*endptr != '\0' || endptr == optarg || equalizer_preset < 0 || equalizer_preset > 3) { - fprintf(stderr, "Usage: %s -p 0-3, 0 is default\n", argv[0]); + if (*endptr != '\0' || endptr == optarg || equalizer_preset < 0) { + fprintf(stderr, "Usage: %s -p 0-X, 0 is default\n", argv[0]); return 1; } break; diff --git a/src/output.c b/src/output.c index fbf7be7..9bb4689 100644 --- a/src/output.c +++ b/src/output.c @@ -167,10 +167,12 @@ void initializeHeadsetInfo(HeadsetInfo* info, struct device* device) info->vendor_name = device->device_hid_vendorname; info->product_name = device->device_hid_productname; - info->equalizer = device->equalizer; - info->equalizer_presets = device->equalizer_presets, - info->has_equalizer_info = info->equalizer != NULL; - info->has_equalizer_presets_info = info->equalizer_presets != NULL; + info->equalizer = device->equalizer; + info->equalizer_presets = device->equalizer_presets, + info->equalizer_presets_count = device->equalizer_presets_count, + info->has_equalizer_info = info->equalizer != NULL; + info->has_equalizer_presets_info = info->equalizer_presets != NULL; + info->has_equalizer_presets_count = info->equalizer_presets_count != NULL; info->parametric_equalizer = device->parametric_equalizer, info->has_parametric_equalizer_info = info->parametric_equalizer != NULL; @@ -401,7 +403,6 @@ void output_json(HeadsetControlStatus* status, HeadsetInfo* infos) printf(" }"); if (info->has_equalizer_presets_info) { - printf(",\n \"equalizer_presets_count\": %d", info->equalizer_presets->count); printf(",\n \"equalizer_presets\": {\n"); for (int i = 0; i < info->equalizer_presets->count; i++) { EqualizerPreset* presets = info->equalizer_presets->presets; @@ -419,6 +420,10 @@ void output_json(HeadsetControlStatus* status, HeadsetInfo* infos) } } + if (info->has_equalizer_presets_count) { + printf(",\n \"equalizer_presets_count\": %d", info->equalizer_presets_count); + } + if (info->has_parametric_equalizer_info) { printf(",\n \"parametric_equalizer\": {\n"); printf(" \"bands\": %d,\n", info->parametric_equalizer->bands_count); @@ -633,7 +638,6 @@ void output_yaml(HeadsetControlStatus* status, HeadsetInfo* infos) yaml_printint("max", info->equalizer->bands_max, 6); if (info->has_equalizer_presets_info) { - yaml_printint("equalizer_presets_count", info->equalizer_presets->count, 4); yaml_print("equalizer_presets", "", 4); for (int i = 0; i < info->equalizer_presets->count; i++) { EqualizerPreset* presets = info->equalizer_presets->presets; @@ -652,6 +656,10 @@ void output_yaml(HeadsetControlStatus* status, HeadsetInfo* infos) } } + if (info->has_equalizer_presets_count) { + yaml_printint("equalizer_presets_count", info->equalizer_presets_count, 4); + } + if (info->has_parametric_equalizer_info) { yaml_print("parametric_equalizer", "", 4); yaml_printint("bands", info->parametric_equalizer->bands_count, 6); diff --git a/src/output.h b/src/output.h index 24859b8..21c9315 100644 --- a/src/output.h +++ b/src/output.h @@ -77,6 +77,8 @@ typedef struct { EqualizerInfo* equalizer; bool has_equalizer_presets_info; EqualizerPresets* equalizer_presets; + bool has_equalizer_presets_count; + uint8_t equalizer_presets_count; bool has_parametric_equalizer_info; ParametricEqualizerInfo* parametric_equalizer;