diff --git a/patch_v2/files_app/files b/patch_v2/files_app/files index 45a0dda..1eaac88 100755 Binary files a/patch_v2/files_app/files and b/patch_v2/files_app/files differ diff --git a/patch_v2/hello_app/hello b/patch_v2/hello_app/hello index e1d3f97..92fec1d 100755 Binary files a/patch_v2/hello_app/hello and b/patch_v2/hello_app/hello differ diff --git a/patch_v2/ncm_app/ncm b/patch_v2/ncm_app/ncm index 1db9398..1daaae0 100755 Binary files a/patch_v2/ncm_app/ncm and b/patch_v2/ncm_app/ncm differ diff --git a/patch_v2/sdk/meow_ui_input.c b/patch_v2/sdk/meow_ui_input.c index eb5c0dc..11dac2d 100644 --- a/patch_v2/sdk/meow_ui_input.c +++ b/patch_v2/sdk/meow_ui_input.c @@ -109,6 +109,33 @@ static const char *meow_settings_path(void) return (e && e[0]) ? e : "/usr/data/meow/settings.conf"; } +/* ---- 插孔消抖(M2.92,与 launcher/watchdog 255 同款)---- + * 插拔 3.5/4.4 耳机的电气瞬态会在音量键 ADC(event2)上产生幽灵 VOL_UP/DOWN 按下 + * (真机实证:插 4.4 同帧 ramp 爬满上限)。插孔状态变化后 800ms 内忽略音量键边沿。 + * 节流:500ms 才真读 /sys 一次(不在热路径每圈读文件)。 */ +static int g_jack_combo = -1; /* hs*2+bal 缓存,-1=未读 */ +static unsigned long long g_jack_changed_at = 0, g_jack_polled_at = 0; + +static int meow_input_jack_debounce(void) +{ + unsigned long long now = meow_ui_time_ms(); + if (now - g_jack_polled_at >= 500) { + g_jack_polled_at = now; + int hs = -1, bal = -1; + char b[8]; + int fd = open("/sys/class/switch/headset/state", O_RDONLY); + if (fd >= 0) { ssize_t n = read(fd, b, sizeof b - 1); close(fd); if (n > 0) { b[n] = 0; hs = atoi(b); } } + fd = open("/sys/class/switch/balance/state", O_RDONLY); + if (fd >= 0) { ssize_t n = read(fd, b, sizeof b - 1); close(fd); if (n > 0) { b[n] = 0; bal = atoi(b); } } + if (hs >= 0 && bal >= 0) { + int combo = hs * 2 + bal; + if (g_jack_combo >= 0 && combo != g_jack_combo) g_jack_changed_at = now; + g_jack_combo = combo; + } + } + return g_jack_changed_at && (now - g_jack_changed_at) < 800; +} + /* ---- 系统按键语义(M2.55:SDK 输入层消化,App 前台也生效)---- * 物理键是系统资源(APPS.md §3.4.1),语义全局统一。本函数在输入线程执行系统动作: * 电源 116 → 息屏/亮屏/长按菜单(内核/sys_server/watchdog),SDK 不动(维持现状); @@ -124,7 +151,7 @@ static void meow_input_handle_sys_key(int code, int val) break; case MEOW_KEY_VOLUMEDOWN: case MEOW_KEY_VOLUMEUP: - if (val == 1) { + if (val == 1 && !meow_input_jack_debounce()) { /* 插孔瞬态期忽略幽灵音量边沿 */ int dir = (code == MEOW_KEY_VOLUMEUP) ? +1 : -1; int nv = meow_ui_vol_step(meow_settings_path(), dir); /* settings 语义+持久化 */ meow_ui_vol_dac_write(nv); /* 写真实 CS43198 DAC */ diff --git a/patch_v2/sdk/test_sdk_input_keys b/patch_v2/sdk/test_sdk_input_keys index 15f72da..174a543 100755 Binary files a/patch_v2/sdk/test_sdk_input_keys and b/patch_v2/sdk/test_sdk_input_keys differ