From 68f91f7de2935efd4bbe5ca7bb658cf732796682 Mon Sep 17 00:00:00 2001 From: AskaEth Date: Fri, 4 Sep 2026 20:43:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(audio):=20M6.42=20=E2=80=94=20audiod?= =?UTF-8?q?=E5=BC=80=E6=9C=BA=E8=B7=AF=E7=94=B1=E6=AD=A6=E8=A3=85=E7=98=A6?= =?UTF-8?q?=E8=BA=AB(=E5=8E=BB=E6=97=A0=E6=9D=A1=E4=BB=B6apply=5Froute(5)?= =?UTF-8?q?=E2=86=92target=E5=8F=8C=E5=86=99,=20=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E5=8F=A3=E6=AD=A3=E7=A1=AE=E5=88=99=E8=B7=B3=E8=BF=87?= =?UTF-8?q?=E5=BC=BA=E7=83=A7,=20=E4=BB=85=E6=9C=AA=E6=AD=A6=E8=A3=85/?= =?UTF-8?q?=E7=AB=AF=E5=8F=A3=E4=B8=8D=E5=AF=B9/=E8=AF=BB=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E6=89=8D=E5=86=99=E7=9B=AE=E6=A0=87;=20=E4=BF=9D?= =?UTF-8?q?=E7=95=99M2.91=E6=A0=B8=E5=BF=83=E9=98=B2=E6=8C=82=E6=AD=BB?= =?UTF-8?q?=E6=AD=A6=E8=A3=85,=20numid=3D9=E8=AF=AD=E4=B9=89/popen?= =?UTF-8?q?=E6=9C=89=E7=95=8C=E8=B6=85=E6=97=B6/D=E6=80=81=E6=8A=9B?= =?UTF-8?q?=E5=BC=83/io=5Fthread=E6=9C=AA=E5=8A=A8)=20=E2=80=94=20?= =?UTF-8?q?=E9=99=8D=E4=BD=8Estock=20hbc3000=E9=A9=B1=E5=8A=A8=E6=A5=94?= =?UTF-8?q?=E6=AD=BB=E6=95=B4=E6=9C=BA=E7=A1=AC=E5=86=BB=E7=BB=93=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E9=9D=A2(reader=E5=90=8E=E5=8F=B0+Files=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E6=92=9E=E6=A5=94=E6=AD=BB=E9=A9=B1=E5=8A=A8=E5=8F=A3?= =?UTF-8?q?);=200warning,=20=E5=AE=BF=E4=B8=BBtest=5Faudiod=5Fhost=20100-0?= =?UTF-8?q?;=20=E9=9C=80=E7=9C=9F=E6=9C=BA=E5=A4=9Aboot=E5=A4=8D=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- patch_v2/meow_audiod/meow_audiod.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/patch_v2/meow_audiod/meow_audiod.c b/patch_v2/meow_audiod/meow_audiod.c index de00b07..63c6529 100644 --- a/patch_v2/meow_audiod/meow_audiod.c +++ b/patch_v2/meow_audiod/meow_audiod.c @@ -1930,8 +1930,10 @@ static void *route_thread(void *arg) /* M2.91 挂死根治(AUDIO_HANG_INVESTIGATION.md):hbc3000 FPGA 未烧录+enable 时 * 启动 PCM 会在第二次 hbc3000_start 死锁整机。写 Output Port Switch 是烧录触发器 * (驱动 put:set_spdif_mode→program_ram→enabled)。开机端口恒 0=未烧,故启动时 - * 无条件写一次:4.4 在→3,3.5 在→2,都没→4(官方播放器拔插孔后的选择,保 FPGA 已烧)。 - * 端口已是目标值(audiod 重启场景,驱动同值短路不写)→ 先写 5(disable) 强制重烧。 + * 武装一次:4.4 在→3,3.5 在→2,都没→4(官方播放器拔插孔后的选择,保 FPGA 已烧)。 + * 多余重烧收敛(AUDIO_HANG_INVESTIGATION):端口已是目标值(audiod 重启场景)时 + * **不再**先写 5(disable) 强制重烧——每次开机做 5→目标 双写等于把 FPGA 烧录暴露翻倍, + * 正是驱动级非确定楔死触发面;改为只需读回一致即跳过,仅当未武装/端口不对时才写目标。 * ⚠️ P2 蓝牙:numnid=9/FPGA 武装只作用于 **DAC 物理路径**(plan §五解耦);target=BT 时 * 不开 hw:0,0,无 hbc3000 start 死锁风险,故 BT 期间跳过 numid=9/FPGA(切回 DAC 再武装)。 */ int need_arm = 1; /* 启动(DAC 起点)武装一次;BT 期间置 1(回 DAC 再武装) */ @@ -1951,8 +1953,19 @@ static void *route_thread(void *arg) int bal = read_switch("/sys/class/switch/balance/state"); int target = (bal == 1) ? 3 : (hb == 1) ? 2 : 4; int cur = amixer_get(9, 1); - if (cur == target) { logmsg("route: port already %d, force re-arm via 5", target); apply_route(5); } - apply_route(target); + if (cur == target) { + /* 端口已正确:跳过 5→target 双重强烧,只确认读回一致(cur==target 已由 + * 上一拍 amixer_get 证实)。原逻辑「cur==target 时先写 5(disable) 再回 + * target」是给 audiod 重启/同值短路场景强制重烧用的,但每次开机无条件做 + * 等于把 FPGA 烧录暴露翻倍——正是驱动级非确定楔死的触发面,故收敛掉。 */ + g_route_cur = target; /* 保持 QUERY/monitor 最近端口与读回一致 */ + logmsg("route: port already %d, skip re-arm (no 5->%d re-burn)", target, target); + } else { + /* 未武装(cur=0/读失败)或端口不对:写目标端口。这是 M2.91「未武装则武装」 + * 防挂死核心(FPGA 未烧+enable 时二次 hbc3000_start 死锁整机),绝不可裸奔; + * 直接写 target 即触发烧录,无需再绕写 5(同值短路场景已被上一分支跳过)。 */ + apply_route(target); + } last_hb = hb; last_bal = bal; last_target = (hb == 0 && bal == 0) ? -1 : target; logmsg("route: boot/DAC-return arm done (port %d %s)", target, port_name(target)); need_arm = 0;