optimize high frequency 0x02 SetStateData

This commit is contained in:
awalol
2026-05-09 14:21:21 +08:00
parent c323c14f19
commit c45ceea535
3 changed files with 54 additions and 14 deletions
+25 -6
View File
@@ -40,6 +40,22 @@ struct audio_raw_element {
float data[512 * 2];
};
uint8_t interrupt_out_data[63] = {
0xfd, 0xf7, 0x0, 0x0,
0x7f, 0x7f, // Headphones, Speaker
0xff, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa,
0x7, 0x0, 0x0, 0x2, 0x1,
0x00,
0xff, 0xd7, 0x00, // RGB LED: R, G, B (Nijika Color!)✨
};
void set_interrupt_out_data(const uint8_t* data, const uint8_t len) {
memcpy(interrupt_out_data, data, len);
}
void set_headset(bool state) {
plug_headset = state;
}
@@ -115,16 +131,19 @@ void audio_loop() {
pkt[8] = buf_len; // 这 4 个字节的作用未知,调整没有效果
pkt[9] = buf_len; // audio buffer length 只有调整这个字节生效。
pkt[10] = packetCounter++;
pkt[11] = 0x12 | 0 << 6 | 1 << 7;
pkt[12] = SAMPLE_SIZE;
memcpy(pkt + 13, haptic_buf, SAMPLE_SIZE);
pkt[77] = (plug_headset ? 0x16 : 0x13) | 0 << 6 | 1 << 7; // Speaker: 0x13
pkt[11] = 0x10 | 0 << 6 | 1 << 7;
pkt[12] = 63;
memcpy(pkt + 13, interrupt_out_data, sizeof(interrupt_out_data));
pkt[76] = 0x12 | 0 << 6 | 1 << 7;
pkt[77] = SAMPLE_SIZE;
memcpy(pkt + 78, haptic_buf, SAMPLE_SIZE);
pkt[142] = (plug_headset ? 0x16 : 0x13) | 0 << 6 | 1 << 7; // Speaker: 0x13
// L Headset Mono: 0x14
// L Headset R Speaker: 0x15
// Headset: 0x16
pkt[78] = 200;
pkt[143] = 200;
critical_section_enter_blocking(&opus_cs);
memcpy(pkt + 79, opus_buf, 200);
memcpy(pkt + 144, opus_buf, 200);
critical_section_exit(&opus_cs);
bt_write(pkt, sizeof(pkt));
+3
View File
@@ -5,9 +5,12 @@
#ifndef DS5_BRIDGE_AUDIO_H
#define DS5_BRIDGE_AUDIO_H
#include <cstdint>
void audio_init();
void audio_loop();
void core1_entry();
void set_headset(bool state);
void set_interrupt_out_data(const uint8_t* data, const uint8_t len);
#endif //DS5_BRIDGE_AUDIO_H
+26 -8
View File
@@ -23,6 +23,7 @@
int reportSeqCounter = 0;
uint8_t packetCounter = 0;
bool spk_active = false;
uint8_t interrupt_in_data[63] = {
0x7f, 0x7d, 0x7f, 0x7e, 0x00, 0x00, 0xa7,
@@ -66,7 +67,7 @@ void interrupt_loop() {
if (should_send) {
if (!tud_hid_report(0x01, safe_report, 63)) {
printf("[USBHID] tud_hid_report error\n");
// If the report failed to queue, restore the dirty flag
// so we try again on the next loop iteration.
critical_section_enter_blocking(&report_cs);
@@ -113,7 +114,7 @@ uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t
(void) reqlen;
if (is_pico_cmd(report_id)) {
return pico_cmd_get(report_id,buffer,reqlen);
return pico_cmd_get(report_id, buffer, reqlen);
}
std::vector<uint8_t> feature_data = get_feature_data(report_id, reqlen);
@@ -124,6 +125,19 @@ uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t
return feature_data.empty() ? 0 : feature_data.size() - 1;
}
bool tud_audio_set_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request) {
(void) rhport;
uint8_t const itf = tu_u16_low(p_request->wIndex); // wInterface
uint8_t const alt = tu_u16_low(p_request->wValue); // bAlternateSetting
if (itf == 1) {
printf("[AUDIO] Set interface Speaker to alternate setting %d\n", alt);
spk_active = alt;
}
return true;
}
// Invoked when received SET_REPORT control request or
// received data on OUT endpoint ( Report ID = 0, Type = 0 )
void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t const *buffer,
@@ -135,8 +149,8 @@ void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t rep
(void) bufsize;
if (is_pico_cmd(report_id)) {
printf("[HID] Receive 0xf6 setting config, funcid:0x%02X\n",buffer[0]);
pico_cmd_set(report_id,buffer,bufsize);
printf("[HID] Receive 0xf6 setting config, funcid:0x%02X\n", buffer[0]);
pico_cmd_set(report_id, buffer, bufsize);
return;
}
@@ -144,6 +158,10 @@ void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t rep
if (report_id == 0) {
switch (buffer[0]) {
case 0x02: {
if (spk_active) {
set_interrupt_out_data(buffer + 1, bufsize - 1);
break;
}
uint8_t outputData[78];
outputData[0] = 0x31;
outputData[1] = reportSeqCounter << 4;
@@ -162,7 +180,7 @@ void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t rep
report_id == 0x60 ||
report_id == 0x62 ||
report_id == 0x61) {
set_feature_data(report_id,const_cast<uint8_t *>(buffer),bufsize);
set_feature_data(report_id, const_cast<uint8_t *>(buffer), bufsize);
return;
}
}
@@ -196,10 +214,10 @@ int main() {
if (watchdog_caused_reboot()) {
printf("Rebooted by Watchdog!\n");
// 当崩溃重启以后,闪三下灯
for (int i = 0;i < 6;i++) {
for (int i = 0; i < 6; i++) {
if (i % 2 == 0) {
cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, true);
}else {
} else {
cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, false);
}
sleep_ms(500);
@@ -208,7 +226,7 @@ int main() {
printf("Clean boot\n");
}
#endif
// Initialize the critical section for the report buffer
critical_section_init(&report_cs);