Skip to content

fix: backport DiPlay microphone, wireless and USB reliability improvements - #14

Merged
fython merged 1 commit into
mainfrom
fix/upstream-medium-high-reliability
Oct 15, 2026
Merged

fython merged 1 commit into
mainfrom
fix/upstream-medium-high-reliability

Conversation

@fython

@fython fython commented Oct 14, 2026

Copy link
Copy Markdown
Owner

部分车机缺少系统 Opus 编码器,Siri/通话录音可能在读取错误后直接停止;无线启动会在热点尚未稳定时发布地址,或在 StartSession 后一直等不到 TCP;USB 超时与完成重叠、NTB 分片和配置切换也会造成启动缓慢或连接中断。本 PR 移植 DiPlay 对应的中高优先级修复,并适配 WheelPlay 的浏览器麦克风和连接生命周期。

基于本次 fetch 后最新的 origin/main:5c5b080acecf7757e3f38b20c3a10391dcb74cac(已包含 #11)。

改动

  • 麦克风:Siri 的 VOICE_RECOGNITION 创建/初始化失败时尝试 VOICE_COMMUNICATION;非 DEAD_OBJECT 的读取错误最多重启三次,丢弃中断前的半帧。系统 Opus 不可用时使用软件 Opus,并按实际可用能力声明输入格式。保留浏览器 PCM 输入、禁用麦克风配置及已修复的 RTP 时钟。
  • 无线:确认热点接口归属,连续三次稳定采样后才就绪,发布前再次验证。成功发送 StartSession 后 30 秒仍无外部 TCP,重新采样当前接口并尝试另一个可用地址族;优先 IPv6 的重试会等待延迟出现的 scoped link-local 地址。每轮连接最多自动重试五次,稳定连接一分钟或手动重连后重置额度;终止状态阻止界面层再次自动重建控制器。
  • 交接:只有当前会话已渲染画面、蓝牙 iAP2 已认证且链路仍存活时,才在隧道交接超时后保留投屏及蓝牙控制;迟到的已认证隧道会继续完成交接并释放蓝牙。旧监听、旧定时器和本机探测不能影响新连接。
  • USB:保留超时后刚完成的 USBMUX 数据;读请求被车机拒绝时逐级减小读取块并记住成功尺寸;增量处理 USBMUX 的已验证四字节尾部及 NCM 分片/合并、可选短包填充和有限次数的损坏后重同步。重试 NCM 接口 claim/alternate setting;配置切换失败时先释放阻塞切换的内核驱动;iOS 新版的普通 USBMUX+NCM 配置先尝试 CarPlay 模式切换,拒绝时保留兼容回退。NCM 首次成功写入前使用最多 20ms 的等待,之后恢复调用方超时。

上游依据

实现与回归用例参考 DiPlay 0.2.19 的代码基线,按 WheelPlay 现有架构适配,具体关联如下:

修复 DiPlay 上游
Siri 录音源回退、录音读取恢复 #371、#644
软件 Opus 和可用能力声明 #468、#483
热点稳定性、首个 TCP 超时、地址族恢复 #229、#474,包括其后续 39c052f5 的延迟 IPv6 修复
需要已渲染画面证据的无线交接保留 #258
USB/NCM 接收分帧、损坏后恢复、较小读取块和超时竞态 #478、#495、#575、#625
USB 配置/驱动释放、CarPlay 模式切换顺序、20ms 启动写入 #618、#644

软件 Opus 引入上游原样保留的 Concentus Java 源码(124 个 Java 文件,占本 PR 大部分新增行数),来源为 lostromb/concentus@3885c4e46513ef0fc81fca100189e54f1714c6ca,保留 BSD-style 版权和许可证,并将许可证随 APK 分发。Android 最低版本仍为 28。

验证

  • :shared:testDebugUnitTest:419 条通过;:common:testDebugUnitTest:252 条通过,共 671 条,无失败或跳过。
  • :mobile:lintDebug:通过,0 errors(18 warnings)。
  • :mobile:assembleDebug:通过,APK 内已确认包含 Concentus 许可证。
  • 回归包括实际 UDP 麦克风输出/软件 Opus 解码、录音源回退与有限重启、旧监听及本机探测隔离、交接超时保留与迟到隧道晋升、重试耗尽状态、USB 超时完成/分片/尾部/NCM 损坏回放及配置切换策略。
  • 已自审异步清理顺序、跨连接回调、界面层自动重连上限与浏览器麦克风兼容性。

使用 JDK 25 / Android SDK 36 执行:

./gradlew :shared:testDebugUnitTest :common:testDebugUnitTest :mobile:lintDebug :mobile:assembleDebug --max-workers=2

硬件相关的 Siri/通话、热点冷启动、iOS USB 模式及长时间连接表现仍需在真实 iPhone 和车机上验证;软件回放与模拟测试不能替代实车验证。

@fython
fython merged commit 39485f9 into main Oct 15, 2026
2 checks passed
@fython
fython deleted the fix/upstream-medium-high-reliability branch October 15, 2026 03:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants