diff --git a/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/dsp.c b/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/dsp.c index fa31453..c5011cd 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/dsp.c +++ b/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/dsp.c @@ -329,6 +329,39 @@ void UserBufferManagementInit(unsigned sampFreq) memset(ubm_ingress, 0, sizeof(ubm_ingress)); // 清掉哑帧输出 } float fLevel[NUM_USB_CHAN_OUT] = {0,}; + +#if USE_EX3D == 1 && (HID_CONTROLS > 0) +/* CMD_GET(CMD_LEVEL) = 0x8D | 0x0100 */ +#define EX3D_HID_CMD_GET_LEVEL 0x18Du + +/* 改动原因:HID process_send_params 在 tile0,fLevel 由 tile0 UserBufferManagement 更新; + * CMD_LEVEL 不再转发 tile1,直接读本 tile 的 fLevel 填入 ex3d_b0b1_result。 */ +void ex3d_hid_fill_cmd_level_on_tile0(unsigned *send_buf_words, uint32_t ch_num) +{ + unsigned idx = 1; + unsigned ex3d_en = 0; + uint32_t ch; + + if (ch_num > (uint32_t)NUM_USB_CHAN_OUT) { + ch_num = (uint32_t)NUM_USB_CHAN_OUT; + } + + GET_SHARED_GLOBAL(ex3d_en, g_3d_enable); + send_buf_words[idx++] = EX3D_HID_CMD_GET_LEVEL; + + for (ch = 0; ch < ch_num; ch++) { + union { float f; unsigned u; } conv; + + if (ex3d_en) { + conv.f = fLevel[ch]; + } else { + conv.f = 0.0f; + } + send_buf_words[idx++] = conv.u; + } +} +#endif /* USE_EX3D && HID_CONTROLS */ + enum {UBM_A3D_OFF=0, UBM_A3D_VON=1, UBM_A3D_ON=2}; extern unsigned int is_eq_disabled(void); extern unsigned int g_eq_enable; @@ -783,8 +816,9 @@ void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData) if(ChNum > NUM_USB_CHAN_OUT) ChNum = NUM_USB_CHAN_OUT; + /* 改动原因:0xB1 CMD_LEVEL 已在 tile0 eq.c 处理;此处仅保留经 c_hidRcvData 到 tile1 的兼容路径 */ // debug_printf("Get CMD_LEVEL : %d, %d\r\n", ChNum, NUM_USB_CHAN_OUT); - for (int i = 0; i < ChNum; i++) { + for (int i = 0; i < (int)ChNum; i++) { pSendBuf[idx++] = pLevel[i]; // debug_printf("%08x, ", pLevel[i] ); } diff --git a/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/eq.c b/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/eq.c index e44ac7e..7c5adda 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/eq.c +++ b/sw_usb_audio/app_usb_aud_fosi_c1_v71/src/extensions/eq.c @@ -477,6 +477,8 @@ extern unsigned g_hid_angle_save_request; extern unsigned g_hid_angle_save_channel; extern unsigned g_hid_angle_values[8]; void SetEx3dHidChan(chanend_t c) { g_ex3d_hid_chanend = c; } +/* 改动原因:CMD_LEVEL 在 tile0 读 fLevel,见 process_send_params 中 0xB1/0x18D 分支 */ +void ex3d_hid_fill_cmd_level_on_tile0(unsigned *send_buf_words, uint32_t ch_num); #endif // 0x84 FACTORY_RESET: 删除Flash参数后触发重启(由button_task轮询执行) @@ -836,7 +838,7 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) { } // 处理发送/读取EX3D命令 (0xB0/0xB1) - SET_EX3D_CMD / GET_EX3D_CMD - // 数据通过 g_ex3d_hid_chanend 直接传到tile1的hid_button_task执行,结果同步返回 + // 多数命令经 g_ex3d_hid_chanend 到 tile1;CMD_LEVEL(0x18D) 在 tile0 读 fLevel,不转发 tile1 if (data[1] == 0xB0 || data[1] == 0xB1) { #if (USE_EX3D == 1) && (HID_CONTROLS == 1) if (!g_ex3d_hid_chanend) return false; @@ -853,6 +855,20 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) { if (params_len > 0) memcpy(ex3d_request.ex3d_params, &data[6], params_len); ex3d_request.pending_cmd = data[1]; + /* 改动原因:HID/UBM 同在 tile0,电平由 UserBufferManagement 写入 fLevel[]; + * GET CMD_LEVEL 无需经 tile1,避免读 tile1 空副本。 */ + if (data[1] == 0xB1 && ex3d_cmd == 0x18Du) { + uint32_t ch_num = 0; + + if (params_len >= 4) { + ch_num = (uint32_t)data[6] | ((uint32_t)data[7] << 8) | + ((uint32_t)data[8] << 16) | ((uint32_t)data[9] << 24); + } + memset(ex3d_b0b1_result, 0, sizeof(ex3d_b0b1_result)); + ex3d_hid_fill_cmd_level_on_tile0(ex3d_b0b1_result, ch_num); + return true; + } + // 若是SET CMD_EXPAND_GAIN (0x93),同步更新footstep LED状态 if (data[1] == 0xB0 && ex3d_cmd == 0x93 && params_len >= 4) { uint32_t gain_val = (uint32_t)data[6] | ((uint32_t)data[7] << 8) |