AskaEth
6e67c74fe6
fix(audiod): M50 r3 评审 P2 三条 — fd 卫生 / 端点路径按 MAC 精确匹配 / 多 ACL 逐个试开
评审 r1(p2-3items/merge,reviewed 26c6077)三条:
① P2-1 dev_close() 在「BT 写路径判死 → 回落」这条路上会 close(0) 误关 stdin:
播放线程处理 g_bt_fail_req 时**提前把 g_bt_dev 清 0**,下拍 dev_close() 就落到
close(g_dev_fd) 分支,而 BT 打开成功时 dev_open() 返回 0(g_dev_fd==0)。
- 去掉那行提前清零(让 dev_close 走 BT 分支自己清),并同时置 g_dev_fd = -1 做第二道保险;
- 把关闭决策抽成纯函数 bt_dev_close_kind(bt_dev, fd)(0=NONE/1=BT/2=FD):**fd 0/1/2
一律不当设备 fd 关**,宿主单测 D10 覆盖(含 bt_dev=0+fd=0 这条回归用例);
- 补不变式「设备 fd 恒 >2」:dev_open 的 DAC/WAV open 过 fd_high()(0..2 时 F_DUPFD 升位,
dup 失败则关掉并报打开失败——绝不留 stdio 区间里没人认领的设备 fd);
- dev_close 注释改成诚实版:不再声称「已消除」,写明「BT 分支内自行清理;调用方不得
提前清 g_bt_dev」。
② P2-2 g_bt_pcm 只写一次 → 换耳机 A→B 后 volume/info 打在 A 的端点上:
- bt_refresh_endpoint() 每次先清空再探测,并用新 bt_dev_pick_endpoint() **按 g_bt_mac
精确挑端点**(找不到就留空,宁可跳过 volume/info 也不串台);
- bt_vol_full() 删除「拿 list-pcms 第一条端点凑数」的兜底(同样会串台);
- 单测 D9:两条端点里按 MAC 分别取 A/B、未知 MAC 返回 -1。
③ P2-3 bt_dev_acl_mac() 只取第一条 ACL,多设备(手机/手柄并存,M49 正在测 BT 控制面)
会挑错设备 → 耳机连着却回落 DAC:
- 改名/重写为 bt_dev_acl_macs():收集**全部** ACL MAC(去重、上限由调用方给);
- bt_find_mac() → bt_collect_candidates():①list-pcms 里已有端点的设备优先(真 A2DP)
②其后全部 ACL 设备;候选按可信度排序、去重;
- bt_try_open() 改为对候选**轮流试开**,3 次尝试、300ms 间隔(1 候选=A,A,A 与 r2 语义
相同;2 候选=A,B,A;3 候选=A,B,C),仍受退避门控;**删除裸 "bluealsa" 兜底**
(那会落到「最近连接」的错设备,review §P2-3 明确指出);
- 单测 D8c/D8d:两条 ACL 全取到且保序、三条含重复时去重并受上限裁剪。
顺带清死代码(评审「其余观察 2」):删除 bt_dev_count_src()、bt_dev_endpoint_path()
(生产路径已无调用者,前者早已只剩单测)。
宿主:test_bt_dev 71/71(新增 D8c/D8d/D9/D10 共 10 条),test_audiod_host 109/0,
交叉编译 0 warning(68604B,md5 9f58b2197ed91d24951918d41a78cf29,NEEDED 三条、
interpreter /lib/ld.so.1、GLIBC≤2.17),test_time32_abi.sh --builds 里
`build meow_audio src=yes macro=yes` 保持。真机项(耳机)未动:本轮不连蓝牙、不扫设备。
2026-11-11 19:37:03 +08:00
..
2026-09-01 18:28:07 +08:00
2026-11-11 18:51:16 +08:00
2026-11-10 22:51:00 +08:00
2026-11-10 22:51:00 +08:00
2026-11-11 18:51:16 +08:00
2026-11-11 19:37:03 +08:00
2026-11-11 18:51:16 +08:00
2026-11-11 17:59:13 +08:00
2026-11-11 19:15:00 +08:00
2026-11-11 18:51:16 +08:00
2026-08-31 22:40:08 +08:00
2026-08-31 19:30:32 +08:00
2026-11-11 18:51:16 +08:00
2026-09-01 03:25:01 +08:00
2026-11-11 18:51:16 +08:00
2026-11-11 18:51:16 +08:00
2026-08-31 15:36:45 +08:00
2026-11-10 22:51:00 +08:00
2026-11-11 18:51:16 +08:00
2026-11-10 21:42:37 +08:00
2026-11-10 22:54:11 +08:00
2026-11-06 13:34:45 +08:00
2026-11-11 13:15:54 +08:00
2026-11-11 18:51:16 +08:00
2026-09-01 11:06:01 +08:00
2026-08-30 01:12:34 +08:00
2026-08-30 01:12:34 +08:00
2026-08-30 03:27:24 +08:00
2026-08-30 01:12:34 +08:00
2026-08-30 01:12:34 +08:00
2026-08-30 01:12:34 +08:00
2026-08-30 03:27:24 +08:00
2026-08-30 01:12:34 +08:00
2026-08-30 01:12:34 +08:00
2026-08-30 03:27:24 +08:00
2026-08-30 03:27:24 +08:00
2026-08-30 01:12:34 +08:00
2026-08-30 01:12:34 +08:00