Skip to content

Commit

Permalink
Introduce internal equalizer baseline
Browse files Browse the repository at this point in the history
Signed-off-by: AnErrupTion <anerruption@disroot.org>
  • Loading branch information
AnErrupTion committed Dec 27, 2023
1 parent 5b9ed65 commit ea86c59
Show file tree
Hide file tree
Showing 8 changed files with 74 additions and 19 deletions.
8 changes: 4 additions & 4 deletions src/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,8 +173,8 @@ int dev_main(int argc, char* argv[])
int print_deviceinfo = 0;

#define BUFFERLENGTH 1024
char* sendbuffer = calloc(BUFFERLENGTH, sizeof(char));
char* sendreportbuffer = calloc(BUFFERLENGTH, sizeof(char));
unsigned char* sendbuffer = calloc(BUFFERLENGTH, sizeof(char));
unsigned char* sendreportbuffer = calloc(BUFFERLENGTH, sizeof(char));

unsigned char* receivebuffer = malloc(sizeof(char) * BUFFERLENGTH);
unsigned char* receivereportbuffer = malloc(sizeof(char) * BUFFERLENGTH);
Expand Down Expand Up @@ -240,7 +240,7 @@ int dev_main(int argc, char* argv[])
break;
}
case 's': { // --send string
int size = get_data_from_parameter(optarg, sendbuffer, BUFFERLENGTH);
int size = get_byte_data_from_parameter(optarg, sendbuffer, BUFFERLENGTH);

if (size < 0) {
fprintf(stderr, "Data to send larger than %d\n", BUFFERLENGTH);
Expand All @@ -257,7 +257,7 @@ int dev_main(int argc, char* argv[])
break;
}
case 'f': { // --send-feature string
int size = get_data_from_parameter(optarg, sendreportbuffer, BUFFERLENGTH);
int size = get_byte_data_from_parameter(optarg, sendreportbuffer, BUFFERLENGTH);

if (size < 0) {
fprintf(stderr, "Data to send for feature report larger than %d\n", BUFFERLENGTH);
Expand Down
2 changes: 1 addition & 1 deletion src/device.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ struct equalizer_settings {
/// The size of the bands array
int size;
/// The equalizer frequency bands values
char bands_values[];
float bands_values[];
};

/** @brief Defines the basic data of a device
Expand Down
11 changes: 10 additions & 1 deletion src/devices/steelseries_arctis_7_plus.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ static struct device device_arctis;
#define STATUS_BUF_SIZE 6

#define EQUALIZER_BANDS_SIZE 10
#define EQUALIZER_BASELINE 0x18
#define EQUALIZER_BAND_MIN -12
#define EQUALIZER_BAND_MAX +12

static const uint16_t PRODUCT_IDS[] = { ID_ARCTIS_7_PLUS, ID_ARCTIS_7_PLUS_PS5, ID_ARCTIS_7_PLUS_XBOX, ID_ARCTIS_7_PLUS_DESTINY };

Expand Down Expand Up @@ -186,7 +189,13 @@ static int arctis_7_plus_send_equalizer(hid_device* device_handle, struct equali

uint8_t data[MSG_SIZE] = { 0x0, 0x33 };
for (int i = 0; i < settings->size; i++) {
data[i + 2] = (uint8_t)settings->bands_values[i];
float band_value = settings->bands_values[i];
if (band_value < EQUALIZER_BAND_MIN || band_value > EQUALIZER_BAND_MAX) {
printf("Device only supports bands ranging from %d to %d.\n", EQUALIZER_BAND_MIN, EQUALIZER_BAND_MAX);
return HSC_OUT_OF_BOUNDS;
}

data[i + 2] = (uint8_t)(EQUALIZER_BASELINE + 2 * band_value);
}
data[settings->size + 3] = 0x0;

Expand Down
11 changes: 10 additions & 1 deletion src/devices/steelseries_arctis_nova_3.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ static struct device device_arctis;
#define ID_ARCTIS_NOVA_3 0x12ec

#define EQUALIZER_BANDS_SIZE 6
#define EQUALIZER_BASELINE 0x14
#define EQUALIZER_BAND_MIN -6
#define EQUALIZER_BAND_MAX +6

static const uint16_t PRODUCT_IDS[] = { ID_ARCTIS_NOVA_3 };
static const uint8_t SAVE_DATA[MSG_SIZE] = { 0x06, 0x09 }; // Command to save settings to headset
Expand Down Expand Up @@ -111,7 +114,13 @@ static int arctis_nova_3_send_equalizer(hid_device* device_handle, struct equali

uint8_t data[MSG_SIZE] = { 0x06, 0x33 };
for (int i = 0; i < settings->size; i++) {
data[i + 2] = (uint8_t)settings->bands_values[i];
float band_value = settings->bands_values[i];
if (band_value < EQUALIZER_BAND_MIN || band_value > EQUALIZER_BAND_MAX) {
printf("Device only supports bands ranging from %d to %d.\n", EQUALIZER_BAND_MIN, EQUALIZER_BAND_MAX);
return HSC_OUT_OF_BOUNDS;
}

data[i + 2] = (uint8_t)(EQUALIZER_BASELINE + 2 * band_value);
}

return hid_send_feature_report(device_handle, data, MSG_SIZE);
Expand Down
11 changes: 10 additions & 1 deletion src/devices/steelseries_arctis_nova_7.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ static struct device device_arctis;
#define STATUS_BUF_SIZE 8

#define EQUALIZER_BANDS_SIZE 10
#define EQUALIZER_BASELINE 0x14
#define EQUALIZER_BAND_MIN -10
#define EQUALIZER_BAND_MAX +10

static const uint16_t PRODUCT_IDS[] = { ID_ARCTIS_NOVA_7, ID_ARCTIS_NOVA_7x, ID_ARCTIS_NOVA_7p, ID_ARCTIS_NOVA_7_DIABLO_IV };

Expand Down Expand Up @@ -188,7 +191,13 @@ static int arctis_nova_7_send_equalizer(hid_device* device_handle, struct equali

uint8_t data[MSG_SIZE] = { 0x0, 0x33 };
for (int i = 0; i < settings->size; i++) {
data[i + 2] = (uint8_t)settings->bands_values[i];
float band_value = settings->bands_values[i];
if (band_value < EQUALIZER_BAND_MIN || band_value > EQUALIZER_BAND_MAX) {
printf("Device only supports bands ranging from %d to %d.\n", EQUALIZER_BAND_MIN, EQUALIZER_BAND_MAX);
return HSC_OUT_OF_BOUNDS;
}

data[i + 2] = (uint8_t)(EQUALIZER_BASELINE + band_value);
}
data[settings->size + 3] = 0x0;

Expand Down
8 changes: 4 additions & 4 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ int main(int argc, char* argv[])
struct equalizer_settings* equalizer = NULL;

#define BUFFERLENGTH 1024
char* read_buffer = calloc(BUFFERLENGTH, sizeof(char));
float* read_buffer = calloc(BUFFERLENGTH, sizeof(float));

struct option opts[] = {
{ "battery", no_argument, NULL, 'b' },
Expand Down Expand Up @@ -350,7 +350,7 @@ int main(int argc, char* argv[])
short_output = 1;
break;
case 'e': {
int size = get_data_from_parameter(optarg, read_buffer, BUFFERLENGTH);
int size = get_float_data_from_parameter(optarg, read_buffer, BUFFERLENGTH);

if (size < 0) {
fprintf(stderr, "Equalizer bands values size larger than supported %d\n", BUFFERLENGTH);
Expand All @@ -362,7 +362,7 @@ int main(int argc, char* argv[])
return 1;
}

equalizer = malloc(sizeof(struct equalizer_settings) + size * sizeof(char));
equalizer = malloc(sizeof(struct equalizer_settings) + size * sizeof(float));
equalizer->size = size;
for (int i = 0; i < size; i++) {
equalizer->bands_values[i] = read_buffer[i];
Expand Down Expand Up @@ -454,7 +454,7 @@ int main(int argc, char* argv[])
printf(" -m, --chatmix\t\t\tRetrieves the current chat-mix-dial level setting between 0 and 128. Below 64 is the game side and above is the chat side.\n");
printf(" -v, --voice-prompt 0|1\tTurn voice prompts on or off (0 = off, 1 = on)\n");
printf(" -r, --rotate-to-mute 0|1\tTurn rotate to mute feature on or off (0 = off, 1 = on)\n");
printf(" -e, --equalizer string\tSets equalizer to specified curve, string must contain band values specific to the device (hex or decimal) delimited by spaces, or commas, or new-lines e.g \"0x18, 0x18, 0x18, 0x18, 0x18\".\n");
printf(" -e, --equalizer string\tSets equalizer to specified curve, string must contain band values (hex or decimal), with minimum and maximum values specific to the device and delimited by spaces, or commas, or new-lines e.g \"0, 0, 0, 0, 0\".\n");
printf(" -p, --equalizer-preset number\tSets equalizer preset, number must be between 0 and 3, 0 sets the default\n");
printf(" --microphone-mute-led-brightness number\tSets microphone mute LED brightness, number must be between 0 and 3\n");
printf(" --microphone-volume number\tSets microphone volume, number must be between 0 and 128\n");
Expand Down
28 changes: 22 additions & 6 deletions src/utility.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,14 +79,10 @@ size_t hexdump(char* out, size_t out_size, unsigned char* data, size_t data_size
return i;
}

int get_data_from_parameter(char* input, char* dest, size_t len)
int get_byte_data_from_parameter(char* input, unsigned char* dest, size_t len)
{
const char* delim = " ,{}\n\r";

size_t sz = strlen(input);
char* str = (char*)malloc(sz + 1);
strcpy(str, input);

// For each token in the string, parse and store in buf[].
char* token = strtok(input, delim);
int i = 0;
Expand All @@ -101,6 +97,26 @@ int get_data_from_parameter(char* input, char* dest, size_t len)
token = strtok(NULL, delim);
}

free(str);
return i;
}

int get_float_data_from_parameter(char* input, float* dest, size_t len)
{
const char* delim = " ,{}\n\r";

// For each token in the string, parse and store in buf[].
char* token = strtok(input, delim);
int i = 0;
while (token) {
char* endptr;
float val = strtof(token, &endptr);

if (i >= len)
return -1;

dest[i++] = val;
token = strtok(NULL, delim);
}

return i;
}
14 changes: 13 additions & 1 deletion src/utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,16 @@ size_t hexdump(char* out, size_t out_size, unsigned char* data, size_t data_size
* @param len max dest length
* @return int amount of data converted
*/
int get_data_from_parameter(char* input, char* dest, size_t len);
int get_byte_data_from_parameter(char* input, unsigned char* dest, size_t len);

/**
* @brief Accepts textual input and converts them to a sendable buffer
*
* Parses data like "0xff, 123, 0xb" and converts them to an array of len 3
*
* @param input string
* @param dest destination array
* @param len max dest length
* @return int amount of data converted
*/
int get_float_data_from_parameter(char* input, float* dest, size_t len);

0 comments on commit ea86c59

Please sign in to comment.