update stereo 8k

This commit is contained in:
Steven Dan
2026-01-13 14:57:15 +08:00
parent 6252431771
commit a4a184c262
3 changed files with 201 additions and 124 deletions

View File

@@ -0,0 +1 @@
xflash bin/factory/fact.xe --loader loader.o --upgrade 2 bin\ex3d_UAC1\app_usb_aud_phaten_gs_ex3d_UAC1.xe --upgrade 4 bin/ex3d_stereo_2k/app_usb_aud_phaten_gs_ex3d_stereo_2k.xe --upgrade 1 bin\ex3d_71_game\app_usb_aud_phaten_gs_ex3d_71_game.xe --upgrade 3 bin\ex3d_stereo_8k\app_usb_aud_phaten_gs_ex3d_stereo_8k.xe -o %1

View File

@@ -0,0 +1,2 @@
xflash --factory-version 15.3 --target-file src/core/PHATEN_GS.xn --upgrade 2 bin\ex3d_UAC1\app_usb_aud_phaten_gs_ex3d_UAC1.xe --upgrade 4 bin/ex3d_stereo_2k/app_usb_aud_phaten_gs_ex3d_stereo_2k.xe --upgrade 1 bin\ex3d_71_game\app_usb_aud_phaten_gs_ex3d_71_game.xe --upgrade 3 bin\ex3d_stereo_8k\app_usb_aud_phaten_gs_ex3d_stereo_8k.xe -o %1

View File

@@ -715,7 +715,7 @@ void hid_update(unsigned char hid_data) {
// 改动原因定义模式切换标志值用于在SPATIAL_GAME、SPATIAL_MOVIE、STEREO_2K、UAC1之间循环切换 // 改动原因定义模式切换标志值用于在SPATIAL_GAME、SPATIAL_MOVIE、STEREO_2K、UAC1之间循环切换
#define MODE_STEREO_2K UAC1_IN_FLAG //4 STEREO_2K模式标志 #define MODE_STEREO_2K UAC1_IN_FLAG //4 STEREO_2K模式标志
#define MODE_SPATIAL_GAME COAX_IN_FLAG //1 SPATIAL_GAME模式标志 #define MODE_SPATIAL_GAME COAX_IN_FLAG //1 SPATIAL_GAME模式标志
#define MODE_SPATIAL_MOVIE OPT_IN_FLAG // 3 SPATIAL_MOVIE模式标志 #define MODE_STEREO_8K OPT_IN_FLAG // 3 SPATIAL_MOVIE模式标志
#define MODE_UAC1 USB_IN_FLAG // 2 UAC1模式标志 #define MODE_UAC1 USB_IN_FLAG // 2 UAC1模式标志
//Tile 1 //Tile 1
@@ -743,6 +743,10 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
static unsigned is_no_effect_mode = 0; // 是否为无音效模式标志模式3 static unsigned is_no_effect_mode = 0; // 是否为无音效模式标志模式3
static unsigned is_uac1_mode = 0; // 是否为UAC1模式标志模式4 static unsigned is_uac1_mode = 0; // 是否为UAC1模式标志模式4
static unsigned actual_mode_for_led = 0; // UAC1模式下的实际模式值0=STEREO_2K, 1=SPATIAL_GAME, 2=SPATIAL_MOVIE用于LED闪烁 static unsigned actual_mode_for_led = 0; // UAC1模式下的实际模式值0=STEREO_2K, 1=SPATIAL_GAME, 2=SPATIAL_MOVIE用于LED闪烁
// 改动原因添加当前模式变量用于短按切换模式0=无音效1=STEREO_2K2=SPATIAL_GAME3=STEREO_8K
static unsigned current_mode_local = 0; // 当前模式值0-3
// 改动原因添加LED闪烁相关变量用于STEREO_8K模式的蓝灯闪烁
static unsigned blink_counter = 0; // LED闪烁计数器每100ms递增
int ret = 0; int ret = 0;
hwtimer_t timer = hwtimer_alloc(); hwtimer_t timer = hwtimer_alloc();
// init mic level // init mic level
@@ -759,20 +763,22 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
is_no_effect_mode = 0; is_no_effect_mode = 0;
is_uac1_mode = 0; is_uac1_mode = 0;
game_mode_t1 = 0; game_mode_t1 = 0;
debug_printf("hid_button_task init: waiting for mode value from button_task\n"); // 改动原因初始默认模式值将从button_task通过channel接收0xFC命令
current_mode_local = 1; // 默认STEREO_2K模式等待从button_task接收
debug_printf("hid_button_task init: waiting for audio_mode from button_task\n");
SET_SHARED_GLOBAL(g_mic_level_t1, mic_level); SET_SHARED_GLOBAL(g_mic_level_t1, mic_level);
port_enable(p_keys); port_enable(p_keys);
port_enable(p_leds); port_enable(p_leds);
port_enable(p_leds2); port_enable(p_leds2);
// 改动原因:初始状态显示白灯3D关闭状态所有LED都亮 // 改动原因:初始化时LED保持默认状态灯灭等待从button_task接收模式值后再设置
// 白灯 = 红色LED (bit 0) + 绿色LED (bit 1) + 蓝色LED (bit 0) 都开启 // LED初始状态所有LED都关闭
// LED是低电平有效所以0=on1=off leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
leds2_val = 0xFC; // 0b11111100: bit 0=0(蓝色LED on), bit 1=0(绿色LED on) leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds1_val = 0x0; // 0b00000000: bit 0=0(红色LED on) leds1_val |= 1; // Red LED off
port_out(p_leds, leds1_val); port_out(p_leds, leds1_val);
port_out(p_leds2, leds2_val); port_out(p_leds2, leds2_val);
debug_printf("LED init: WHITE LED (all on), leds2_val=0x%02X, leds1_val=0x%02X\n", leds2_val, leds1_val); debug_printf("LED init: default OFF state, waiting for mode from button_task\n");
uint32_t last_status = port_in(p_keys); uint32_t last_status = port_in(p_keys);
hwtimer_set_trigger_time(timer, hwtimer_get_time(timer) + KEY_POLLING_INTERVAL); hwtimer_set_trigger_time(timer, hwtimer_get_time(timer) + KEY_POLLING_INTERVAL);
while (1) { while (1) {
@@ -787,9 +793,58 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
{ {
tmp = chan_in_byte(cc_mic_level); tmp = chan_in_byte(cc_mic_level);
debug_printf("event_mic_vol received: 0x%02X\n", tmp); debug_printf("event_mic_vol received: 0x%02X\n", tmp);
// 改动原因检查是否是模式传输命令0xFE),如果是则接收模式值 // 改动原因:检查是否是音频模式传输命令0xFC),如果是则接收当前音频模式值0-3
if (tmp == 0xFE) { if (tmp == 0xFC) {
// 这是模式传输命令 // 这是音频模式传输命令(用于短按切换模式)
current_mode_local = chan_in_byte(cc_mic_level);
if (current_mode_local > 3) {
current_mode_local = 1; // 如果值无效重置为STEREO_2K
}
debug_printf("hid_button_task received audio_mode: %d (0=NO_EFFECT, 1=STEREO_2K, 2=SPATIAL_GAME, 3=STEREO_8K)\n", current_mode_local);
// 改动原因根据接收到的模式值初始化LED和算法状态
if (current_mode_local == 0) {
// 无音效模式:灯灭,算法关闭
audio_ex3d_onoff(0);
is_3d_on = A3D_OFF;
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds1_val |= 1; // Red LED off
debug_printf("Mode 0 (NO_EFFECT): algorithm OFF, LED OFF\n");
} else if (current_mode_local == 1) {
// STEREO_2K模式红灯算法开启
audio_ex3d_onoff(1);
is_3d_on = A3D_ON;
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
leds1_val &= (~1); // Red LED on
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
debug_printf("Mode 1 (STEREO_2K): algorithm ON, RED LED\n");
} else if (current_mode_local == 2) {
// SPATIAL_GAME模式蓝灯算法开启
audio_ex3d_onoff(1);
is_3d_on = A3D_ON;
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
leds1_val |= 1; // Red LED off
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
debug_printf("Mode 2 (SPATIAL_GAME): algorithm ON, BLUE LED\n");
} else if (current_mode_local == 3) {
// STEREO_8K模式蓝灯闪烁算法开启
audio_ex3d_onoff(1);
is_3d_on = A3D_ON;
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on (初始状态)
leds1_val |= 1; // Red LED off
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
debug_printf("Mode 3 (STEREO_8K): algorithm ON, BLUE LED blinking\n");
}
port_out(p_leds, leds1_val);
port_out(p_leds2, leds2_val);
// 模式接收完成后继续,不处理按键
} else if (tmp == 0xFE) {
// 改动原因这是game_mode传输命令用于固件模式切换0-3或4=UAC1
game_mode_t1 = chan_in_byte(cc_mic_level); game_mode_t1 = chan_in_byte(cc_mic_level);
is_no_effect_mode = (game_mode_t1 == 3) ? 1 : 0; // 模式3为无音效模式 is_no_effect_mode = (game_mode_t1 == 3) ? 1 : 0; // 模式3为无音效模式
is_uac1_mode = (game_mode_t1 == 4) ? 1 : 0; // 模式4为UAC1模式 is_uac1_mode = (game_mode_t1 == 4) ? 1 : 0; // 模式4为UAC1模式
@@ -800,12 +855,13 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
if (is_no_effect_mode) { if (is_no_effect_mode) {
audio_ex3d_onoff(0); audio_ex3d_onoff(0);
is_3d_on = A3D_OFF; is_3d_on = A3D_OFF;
// 无音效模式下一直显示白灯所有LED都 // 改动原因:无音效模式下LED关闭所有LED都
leds2_val = 0xFC; // 0b11111100: bit 0=0(蓝色LED on), bit 1=0(绿色LED on) leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
leds1_val = 0x0; // 0b00000000: bit 0=0(红色LED on) leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds1_val |= 1; // Red LED off
port_out(p_leds2, leds2_val); port_out(p_leds2, leds2_val);
port_out(p_leds, leds1_val); port_out(p_leds, leds1_val);
debug_printf("NO_EFFECT mode: 3D algorithm disabled, WHITE LED (all on)\n"); debug_printf("NO_EFFECT mode: 3D algorithm disabled, LED OFF\n");
} }
// 改动原因UAC1模式下的等效模式值将在下一个event_mic_vol中通过0xFD命令接收 // 改动原因UAC1模式下的等效模式值将在下一个event_mic_vol中通过0xFD命令接收
// 模式接收完成后继续,不处理按键 // 模式接收完成后继续,不处理按键
@@ -900,9 +956,9 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
// Ex3dExpandGain // Ex3dExpandGain
// Ex3dReduceGain // Ex3dReduceGain
// Ex3dReduceGain = Ex3dLimiterThreshold - (sys_vol + Ex3dOnGain + Ex3dExpandGain) // Ex3dReduceGain = Ex3dLimiterThreshold - (sys_vol + Ex3dOnGain + Ex3dExpandGain)
printf("sys_vol:%d\n", sys_vol); debug_printf("sys_vol:%d\n", sys_vol);
printf("on gain:%d\n", Ex3dOnGain); debug_printf("on gain:%d\n", Ex3dOnGain);
printf("limiter Th:%f\n", Ex3dLimiterThreshold); debug_printf("limiter Th:%f\n", Ex3dLimiterThreshold);
} }
event_polling: event_polling:
{ {
@@ -919,88 +975,64 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
} else { } else {
is_stable = 1; is_stable = 1;
if (press_hold_cnt > 0) { if (press_hold_cnt > 0) {
// 改动原因:在无音效模式下禁止切换3D功能LED保持白灯 // 改动原因:短按切换模式0=无音效1=STEREO_2K2=SPATIAL_GAME3=STEREO_8K
if (is_no_effect_mode) { // 循环切换0→1→2→3→0
debug_printf("NO_EFFECT mode: 3D toggle disabled, keeping WHITE LED\n"); unsigned old_mode = current_mode_local;
// 在无音效模式下按键操作被忽略LED保持白灯 current_mode_local = (current_mode_local + 1) % 4; // 循环切换 0→1→2→3→0
// 确保LED是白灯状态 debug_printf("Short press: switching mode from %d to %d\n", old_mode, current_mode_local);
leds2_val = 0xFC; // 0b11111100: bit 0=0(蓝色LED on), bit 1=0(绿色LED on)
leds1_val = 0x0; // 0b00000000: bit 0=0(红色LED on) // 改动原因通过c_hidSendData发送命令通知button_task保存新模式到flash
port_out(p_leds2, leds2_val); // 命令格式0xFB000000 + mode_valuemode_value在低8位
port_out(p_leds, leds1_val); unsigned save_cmd = 0xFB000000 | (current_mode_local & 0xFF);
} else if (is_3d_on == A3D_ON) { chan_out_word(c_hidSendData, save_cmd);
is_3d_on = A3D_OFF; // turn off debug_printf("Sent save audio_mode command to button_task: 0x%08X\n", save_cmd);
// 改动原因3D关闭时显示白灯所有LED都亮
// 白灯 = 红色LED (bit 0) + 绿色LED (bit 1) + 蓝色LED (bit 0) 都开启 // 改动原因根据模式控制算法和LED
leds2_val = 0xFC; // 0b11111100: bit 0=0(蓝色LED on), bit 1=0(绿色LED on) if (current_mode_local == 0) {
leds1_val = 0x0; // 0b00000000: bit 0=0(红色LED on) // 无音效模式:灯灭,算法关闭
audio_ex3d_onoff(0); audio_ex3d_onoff(0);
debug_printf("3d off: WHITE LED (all on), leds2_val=0x%02X, leds1_val=0x%02X\n", leds2_val, leds1_val); is_3d_on = A3D_OFF;
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on); SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
port_out(p_leds2, leds2_val); leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
port_out(p_leds, leds1_val); leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
debug_printf("LEDs updated after 3d off: port_out(p_leds2, 0x%02X), port_out(p_leds, 0x%02X)\n", leds2_val, leds1_val); leds1_val |= 1; // Red LED off
} else { debug_printf("Mode 0 (NO_EFFECT): algorithm OFF, LED OFF\n");
if (is_3d_on == A3D_OFF) { } else if (current_mode_local == 1) {
// STEREO_2K模式红灯算法开启
audio_ex3d_onoff(1);
is_3d_on = A3D_ON; is_3d_on = A3D_ON;
// 改动原因UAC1模式下根据actual_mode_for_led显示对应的LED颜色 SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
if (is_uac1_mode) {
// UAC1模式根据等效模式值显示LED
if (actual_mode_for_led == 0) {
// STEREO_2K等效模式绿色LED
leds2_val &= (~(1<<GREEN_LED_PIN)); // Green LED on
leds1_val |= 1; // Red LED off
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
debug_printf("UAC1 mode: 3D ON, STEREO_2K equivalent (GREEN LED)\n");
} else if (actual_mode_for_led == 1) {
// SPATIAL_GAME等效模式蓝色LED
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds1_val |= 1; // Red LED off
debug_printf("UAC1 mode: 3D ON, SPATIAL_GAME equivalent (BLUE LED)\n");
} else if (actual_mode_for_led == 2) {
// SPATIAL_MOVIE等效模式红色LED
leds1_val &= (~1); // Red LED on
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
debug_printf("UAC1 mode: 3D ON, SPATIAL_MOVIE equivalent (RED LED)\n");
} else {
// 默认白色LED
leds2_val = 0xFC;
leds1_val = 0x0;
debug_printf("UAC1 mode: 3D ON, unknown equivalent mode, WHITE LED\n");
}
} else {
// 非UAC1模式根据编译模式显示LED
#if defined (STEREO_2K)
leds2_val &= (~(1<<GREEN_LED_PIN)); // Green LED on
leds1_val |= 1; // Red LED off
// 改动原因使用更明确的BLUE_LED_PIN宏定义
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
#endif
#if defined (SPATIAL_GAME)
// 改动原因使用更明确的BLUE_LED_PIN宏定义
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds1_val |= 1; // Red LED off
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
debug_printf("SPATIAL_GAME mode: setting BLUE LED on, leds2_val before=0x%02X\n", leds2_val | (1<<BLUE_LED_PIN));
#endif
#if defined (SPATIAL_MOVIE)
// 改动原因使用更明确的BLUE_LED_PIN宏定义
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds1_val &= (~1); // Red LED on leds1_val &= (~1); // Red LED on
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
#endif leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
debug_printf("Mode 1 (STEREO_2K): algorithm ON, RED LED\n");
} else if (current_mode_local == 2) {
// SPATIAL_GAME模式蓝灯算法开启
audio_ex3d_onoff(1);
is_3d_on = A3D_ON;
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
leds1_val |= 1; // Red LED off
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
debug_printf("Mode 2 (SPATIAL_GAME): algorithm ON, BLUE LED\n");
} else if (current_mode_local == 3) {
// STEREO_8K模式蓝灯闪烁算法开启
audio_ex3d_onoff(1);
is_3d_on = A3D_ON;
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
// 初始状态蓝灯亮闪烁将在event_polling中处理
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
leds1_val |= 1; // Red LED off
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
debug_printf("Mode 3 (STEREO_8K): algorithm ON, BLUE LED blinking\n");
} }
audio_ex3d_onoff(1); // 更新LED输出
debug_printf("3d on: leds2_val=0x%02X, leds1_val=0x%02X\n", leds2_val, leds1_val);
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
port_out(p_leds2, leds2_val); port_out(p_leds2, leds2_val);
port_out(p_leds, leds1_val); port_out(p_leds, leds1_val);
debug_printf("LEDs updated after 3d on: port_out(p_leds2, 0x%02X), port_out(p_leds, 0x%02X)\n", leds2_val, leds1_val);
} unsigned endData[1] = {0xffffffff};
} chan_out_word(c_hidSendData, endData[0]);
} }
} }
} else { } else {
@@ -1028,7 +1060,7 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
// 改动原因保存新的等效模式值到flash的 "uac1_mode" 文件 // 改动原因保存新的等效模式值到flash的 "uac1_mode" 文件
unsigned char path_uac1[] = "uac1_mode"; unsigned char path_uac1[] = "uac1_mode";
save_value(path_uac1, (unsigned char)new_actual_mode); save_value(path_uac1, (unsigned char)new_actual_mode);
printf("Saved uac1_mode %d to flash\n", new_actual_mode); debug_printf("Saved uac1_mode %d to flash\n", new_actual_mode);
// 根据新的等效模式值闪烁对应的LED颜色 // 根据新的等效模式值闪烁对应的LED颜色
for (int i = 0; i < BLINK_COUNT; i++) { for (int i = 0; i < BLINK_COUNT; i++) {
@@ -1147,14 +1179,32 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
port_out(p_leds2, leds2_val); port_out(p_leds2, leds2_val);
port_out(p_leds, leds1_val); port_out(p_leds, leds1_val);
debug_printf("LED blink completed, mode switch will happen\n"); debug_printf("LED blink completed, mode switch will happen\n");
unsigned endData[1] = {0xffffffff};
chan_out_word(c_hidSendData, endData[0]);
} }
#endif #endif
} }
} }
} }
last_status = key_in; last_status = key_in;
// 改动原因STEREO_8K模式下蓝灯闪烁每500ms切换一次状态
if (current_mode_local == 3) {
blink_counter++;
if (blink_counter >= 5) { // 5 * 100ms = 500ms
blink_counter = 0;
// 切换蓝灯状态
if (leds2_val & (1<<BLUE_LED_PIN)) {
// 当前是灭状态,切换为亮
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
} else {
// 当前是亮状态,切换为灭
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
}
port_out(p_leds2, leds2_val);
}
} else {
// 非STEREO_8K模式重置闪烁计数器
blink_counter = 0;
}
} }
continue; continue;
} }
@@ -1191,7 +1241,7 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
GET_SHARED_GLOBAL(ex3d_key_verified, g_ex3d_key_verified); GET_SHARED_GLOBAL(ex3d_key_verified, g_ex3d_key_verified);
} }
#endif #endif
printf("button task start\n"); debug_printf("button task start\n");
// 改动原因区分Windows模式和UAC1模式分别从不同的flash文件加载 // 改动原因区分Windows模式和UAC1模式分别从不同的flash文件加载
// Windows模式从 "game_mode" 加载(模式值 0-3 // Windows模式从 "game_mode" 加载(模式值 0-3
@@ -1240,7 +1290,7 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
return; return;
} }
else { else {
printf("Detected Windows OS (OS_WIN)\n"); debug_printf("Detected Windows OS (OS_WIN)\n");
#if UAC1_MODE == 1 #if UAC1_MODE == 1
// 改动原因Windows模式下检查当前编译模式是否与保存的模式匹配 // 改动原因Windows模式下检查当前编译模式是否与保存的模式匹配
unsigned need_reboot = 0; unsigned need_reboot = 0;
@@ -1271,7 +1321,7 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
SetRoleSwitchFlag(MODE_SPATIAL_GAME); SetRoleSwitchFlag(MODE_SPATIAL_GAME);
break; break;
case 2: case 2:
SetRoleSwitchFlag(MODE_SPATIAL_MOVIE); SetRoleSwitchFlag(MODE_STEREO_8K);
break; break;
case 3: case 3:
SetRoleSwitchFlag(MODE_STEREO_2K); SetRoleSwitchFlag(MODE_STEREO_2K);
@@ -1280,7 +1330,7 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
SetRoleSwitchFlag(MODE_STEREO_2K); SetRoleSwitchFlag(MODE_STEREO_2K);
break; break;
} }
printf("Switch to saved mode: %d, device will restart.\n", saved_mode); debug_printf("Switch to saved mode: %d, device will restart.\n", saved_mode);
delay_milliseconds(5); delay_milliseconds(5);
device_reboot(); device_reboot();
while (1); while (1);
@@ -1294,9 +1344,29 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
// 改动原因更新全局变量g_game_mode为保存的模式值 // 改动原因更新全局变量g_game_mode为保存的模式值
SET_SHARED_GLOBAL(g_game_mode, saved_mode); SET_SHARED_GLOBAL(g_game_mode, saved_mode);
// 改动原因:通过cc_mic_level channel发送模式值到hid_button_task // 改动原因:从flash加载audio_mode用于短按切换模式0=无音效1=STEREO_2K2=SPATIAL_GAME3=STEREO_8K
unsigned char audio_mode_local;
unsigned char path_audio_mode[] = "audio_mode";
audio_mode_local = load_value(path_audio_mode);
if (audio_mode_local == 255) {
audio_mode_local = 1; // 默认STEREO_2K模式
save_value(path_audio_mode, audio_mode_local);
}
if (audio_mode_local > 3) {
audio_mode_local = 1; // 如果值无效重置为STEREO_2K
save_value(path_audio_mode, audio_mode_local);
}
debug_printf("button_task: loaded audio_mode=%d from flash\n", audio_mode_local);
// 改动原因通过cc_mic_level channel发送audio_mode到hid_button_task用于短按切换模式
// 发送格式0xFC命令 + audio_mode_value模式值 0-3
chan_out_byte(cc_mic_level, 0xFC); // 音频模式传输命令
chan_out_byte(cc_mic_level, audio_mode_local); // 音频模式值0=无音效1=STEREO_2K2=SPATIAL_GAME3=STEREO_8K
debug_printf("Sent audio_mode %d to hid_button_task via cc_mic_level channel\n", audio_mode_local);
// 改动原因通过cc_mic_level channel发送game_mode到hid_button_task用于固件模式切换
// 发送格式0xFE命令 + mode_value模式值 // 发送格式0xFE命令 + mode_value模式值
chan_out_byte(cc_mic_level, 0xFE); // 模式传输命令 chan_out_byte(cc_mic_level, 0xFE); // game_mode传输命令
chan_out_byte(cc_mic_level, saved_mode); // 模式值Windows: 0-3, UAC1: 4 chan_out_byte(cc_mic_level, saved_mode); // 模式值Windows: 0-3, UAC1: 4
debug_printf("Sent game_mode %d to hid_button_task via cc_mic_level channel\n", saved_mode); debug_printf("Sent game_mode %d to hid_button_task via cc_mic_level channel\n", saved_mode);
@@ -1333,8 +1403,18 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
unsigned hidData0 = chan_in_word(c_hidSendData); unsigned hidData0 = chan_in_word(c_hidSendData);
unsigned *reportData = hidSendData; unsigned *reportData = hidSendData;
reportData[0] = hidData0; reportData[0] = hidData0;
if (hidData0 == 0xffffffff) { // 改动原因检查是否是保存audio_mode命令0xFB000000格式
printf("receive end data\n"); if ((hidData0 & 0xFF000000) == 0xFB000000) {
// 这是保存audio_mode命令低8位是模式值
unsigned char new_audio_mode = (unsigned char)(hidData0 & 0xFF);
if (new_audio_mode <= 3) {
unsigned char path_audio_mode[] = "audio_mode";
save_value(path_audio_mode, new_audio_mode);
debug_printf("button_task: saved audio_mode=%d to flash\n", new_audio_mode);
}
continue; // 处理完保存命令后继续不发送HID报告
} else if (hidData0 == 0xffffffff) {
debug_printf("receive end data\n");
// 改动原因收到0xffffffff后循环切换模式并保存到flash然后设置切换标志 // 改动原因收到0xffffffff后循环切换模式并保存到flash然后设置切换标志
// 注意UAC1模式下不会收到此命令hid_button_task不发送 // 注意UAC1模式下不会收到此命令hid_button_task不发送
// 读取当前g_game_mode值 // 读取当前g_game_mode值
@@ -1350,40 +1430,34 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
// 当前是STEREO_2K切换到SPATIAL_GAME // 当前是STEREO_2K切换到SPATIAL_GAME
new_mode = 1; new_mode = 1;
mode_flag = MODE_SPATIAL_GAME; mode_flag = MODE_SPATIAL_GAME;
printf("Switching from STEREO_2K (0) to SPATIAL_GAME (1)\n"); debug_printf("Switching from STEREO_2K (0) to SPATIAL_GAME (1)\n");
} else if (current_mode == 1) { } else if (current_mode == 1) {
// 当前是SPATIAL_GAME切换到SPATIAL_MOVIE // 当前是SPATIAL_GAME切换到SPATIAL_MOVIE
new_mode = 2; new_mode = 2;
mode_flag = MODE_SPATIAL_MOVIE; mode_flag = MODE_STEREO_8K;
printf("Switching from SPATIAL_GAME (1) to SPATIAL_MOVIE (2)\n"); debug_printf("Switching from SPATIAL_GAME (1) to SPATIAL_MOVIE (2)\n");
} else if (current_mode == 2) { } else if (current_mode == 2) {
// 当前是SPATIAL_MOVIE,切换到无音效模式 // 当前是STEREO_8K,切换到无音效模式
new_mode = 3; new_mode = 3;
mode_flag = MODE_STEREO_2K; // 无音效模式使用STEREO_2K固件 mode_flag = MODE_STEREO_2K; // 无音效模式使用STEREO_2K固件
printf("Switching from SPATIAL_MOVIE (2) to NO_EFFECT (3)\n"); debug_printf("Switching from STEREO_8K (2) to NO_EFFECT (3)\n");
} else if (current_mode == 3) { } else if (current_mode == 3) {
// 当前是无音效模式切换回STEREO_2K完成循环 // 当前是无音效模式切换回STEREO_2K完成循环
new_mode = 0; new_mode = 0;
mode_flag = MODE_STEREO_2K; mode_flag = MODE_STEREO_2K;
printf("Switching from NO_EFFECT (3) to STEREO_2K (0)\n"); debug_printf("Switching from NO_EFFECT (3) to STEREO_2K (0)\n");
} else {
// 其他模式值如4=UAC1不应该在这里处理但为了安全重置为0
new_mode = 0;
mode_flag = MODE_STEREO_2K;
printf("Unknown mode %d, resetting to STEREO_2K (0)\n", current_mode);
} }
// 更新g_game_mode // 更新g_game_mode
SET_SHARED_GLOBAL(g_game_mode, new_mode); SET_SHARED_GLOBAL(g_game_mode, new_mode);
// 改动原因保存新的模式值到flash的 "game_mode" 文件Windows模式专用 // 改动原因保存新的模式值到flash的 "game_mode" 文件Windows模式专用
unsigned char path[] = "game_mode"; unsigned char path[] = "game_mode";
save_value(path, (unsigned char)new_mode); save_value(path, (unsigned char)new_mode);
printf("Saved game_mode %d to flash\n", new_mode); debug_printf("Saved game_mode %d to flash\n", new_mode);
// 设置角色切换标志,触发模式切换 // 设置角色切换标志,触发模式切换
SetRoleSwitchFlag(mode_flag); SetRoleSwitchFlag(mode_flag);
printf("Set role switch flag: 0x%04X\n", mode_flag); debug_printf("Set role switch flag: 0x%04X\n", mode_flag);
delay_milliseconds(5); delay_milliseconds(5);
device_reboot(); device_reboot();
while (1); while (1);
@@ -1403,7 +1477,7 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
GET_SHARED_GLOBAL(uac_vol, g_uac_vol); GET_SHARED_GLOBAL(uac_vol, g_uac_vol);
if (uac_vol != last_uac_vol) { if (uac_vol != last_uac_vol) {
unsigned conv_vol = (0xffffffff - uac_vol + 1) >> 8; unsigned conv_vol = (0xffffffff - uac_vol + 1) >> 8;
//printf("vol: - %d\n", conv_vol); //debug_printf("vol: - %d\n", conv_vol);
chan_out_word(c_uac_vol, conv_vol); chan_out_word(c_uac_vol, conv_vol);
last_uac_vol = uac_vol; last_uac_vol = uac_vol;
} }