面向莱维特 LEWITT CONNECT 2 Ultra 声卡的用户态 ASIO 增强驱动。在原厂 ASIO 之上构建低延迟代理转发层,叠加虚拟通道、共享内存 IPC、采样率端点同步与 Pro Tools 深度兼容修复,把这块消费级声卡打磨到专业 DAW 工作站级别的稳定性。
LEWITT CONNECT 2 Ultra 是莱维特面向播客 / 直播 / 录音的一体化声卡。原厂 ASIO 驱动在消费场景够用,但在专业 DAW(尤其 Avid Pro Tools)下存在格式兼容、采样率不同步、底噪等问题。本项目在不替换原厂硬件驱动的前提下,于用户态构建一层 ASIO 增强代理:DAW 看到的是我们的虚拟 ASIO 设备,我们在内部转发并修正原厂驱动的行为,同时挂载虚拟通道与共享内存数据通路。
增强层以独立的 ASIO 设备身份注册。运行时通过注册表 HKLM\SOFTWARE\ASIO 按品牌关键词定位并加载原厂 ASIO 驱动作为底层 m_baseAsio,把 getBufferSize / getLatencies / createBuffers / start 等调用透明转发给它,再在外层叠加增强逻辑。加载时排除自身关键字,从机制上杜绝递归自加载。
当 ASIO 驱动切换采样率时,Windows 共享模式音频端点的默认格式不会自动跟随——它会一直停留在旧采样率,直到用户手动打开"声音设置 → 格式"重新选择。这会导致 DAW 加载工程时拿到错误采样率,出现变调、杂音或拒绝加载。
本项目的 EndpointFormatSync 模块解决了这一点:在 ASIO 切换采样率时,于独立后台线程异步调用系统的 IPolicyConfig::SetDeviceFormat,强制把所有 LEWITT 渲染 / 采集端点的默认格式刷新到目标采样率,让 DAW 工程加载时立刻拿到正确的采样率。
setSampleRate 后回读 actualRate 校验,确保软硬两侧一致早期架构用单一变量同时记录输入与输出的数据格式。但在某些采样率 / 总线配置下,声卡的输入端(带麦克风前级信息)与输出端格式其实不对称,合并后会让 Pro Tools 把输入格式错套到输出通道,强行解析错位字节 → 巨大爆音。
修复:将格式追踪器拆分为 m_vrtTypeIn / m_vrtTypeOut,握手时对录音、播放通道分别提交独立且精准的位深格式。
ASIO 高频热路径原本缺乏对未定义 / 非标准类型的兜底。当 Pro Tools 发出探测性或非标准对齐的缓冲区配置时,类型转换出现断层,未清零的未初始化内存(脏内存)被直接送入硬件 DMA → 刺耳数字杂音。
修复:在浮点→整型转换引擎中增加强校验分支,任何未识别类型一律安全回退到标准 32-bit LSB 补齐,从根上杜绝脏数据流入硬件。
增强层在原厂物理通道之外创建若干虚拟通道对,通过 SharedMemoryBridge 共享内存与 LEWITT WDM 虚拟音频驱动通信。共享内存通道分为三类:
| 通道 | 方向 | 用途 |
|---|---|---|
| PLAY | 播放 | DAW 输出 → 虚拟设备,可路由到其它应用 |
| REC | 录制 | 虚拟设备 → DAW 输入,采集系统 / 应用声音 |
| LOOP | 环回 | Loopback 内录,无需物理跳线 |
共享内存以 Local\\<prefix>_PLAY/REC/LOOP_<channelId> 命名,内存映射后由读写双方按帧无锁交换音频,延迟与抖动控制在专业级范围。
音频回调路径不做多余拷贝与分配,同步类工作全部甩到后台线程,回调线程只做必要搬运。
以标准 IASIO 设备身份呈现,DAW 无感知,无需任何插件或宿主改动。
未知 ASIO 类型一律安全回退,杜绝脏内存与未定义行为流入硬件。
采样率切换后自动同步 Windows 端点格式,工程加载即正确,无需手动重设。