自定义 ASIO 驱动 — 技术文档 v5.0 (2026-03-22)
所有 ASIO 调用 100% 转发给官方 DLL,稳定性与官方完全一致。
| 功能 | 状态 | 说明 |
|---|---|---|
| 音频输入 | ✅ 正常 | 18 通道,48kHz / 44.1kHz |
| 音频输出 | ✅ 正常 | 20 通道,完美清晰 |
| CPU 占用 | ✅ 正常 | 与官方一致 |
| 延迟 | ✅ 正常 | 128 采样 = 2.67ms @ 48kHz |
| DAW 兼容 | ✅ 验证 | Studio One 完美运行 |
| ASIO 注册 | ✅ 正常 | COM/注册表完整 |
ASIO 驱动主类。实现 IASIO 接口,所有调用转发给 AsioProxy。包含 COM 注册、IUnknown 实现。
加载官方 umc_audioasio_x64.dll,通过 COM (DllGetClassObject → IClassFactory → IASIO) 创建实例并转发所有调用。
完整的 TUSBAUDIO IOCTL 直连引擎。可直接和 umc_audio.sys 内核驱动通信,绕过官方 DLL。输入路径已验证可行。
完整逆向的 TUSBAUDIO 专有协议,通过分析官方 DLL 的 DeviceIoControl 调用获得:
| IOCTL | 名称 | 说明 |
|---|---|---|
0x80882004 | GET_DEVICE_INFO | 获取设备信息 (VID/PID/序列号) |
0x80882820 | GET_USB_CONFIG | 获取 USB 配置 |
0x808820C4 | GET_HW_CAPS | 获取硬件能力信息 |
0x80882804 | SET_MODE | 设置工作模式 |
0x80882808 | GET_STREAM_CONFIG | 获取流配置 (采样率等) |
0x8088280C | GET_CHANNEL_LIST | 获取输入/输出通道列表 |
0x80882810 | GET_CHANNEL_INFO | 获取通道详细信息 |
0x80882824 | SET_BUFFER_SIZE | 设置缓冲区大小 |
0x80882840 | SELECT_CHANNEL | 选择通道用于流式传输 |
0x80882844 | DESELECT_CHANNEL | 取消选择通道 |
0x80882880 | SET_CALLBACKS | 设置控制页和事件句柄 |
0x808828A0 | MAP_CHANNEL_BUFFER | 映射 DMA 缓冲区到用户空间 |
0x808828C0 | ENABLE_STREAM | 启用流 (激活 DMA) |
0x808828C4 | STOP_STREAMING | 停止流式传输 |
0x808828C8 | START_STREAMING | 启动流式传输 |
0x808828F4 | WAIT_FOR_BUFFER | 等待缓冲区完成 / 泵送数据 |
DMA Buffer Layout:
┌──────────────────────────────────────┐
│ Half 0 (128 × 4 bytes = 512B) │ ← 控制页 counter & 1 == 0
├──────────────────────────────────────┤
│ Half 1 (128 × 4 bytes = 512B) │ ← 控制页 counter & 1 == 1
└──────────────────────────────────────┘
数据格式: 32-bit INT (24-bit PCM 左对齐)
每通道独立 DMA 缓冲区,通过 MAP_CHANNEL_BUFFER 映射
Offset 0x00: DWORD counter — 每完成一个 buffer half 递增
用户通过读取 counter 变化来检测新数据:
输入: 读取 buf[(counter+1) & 1] 获取最新采集数据
输出: 写入 buf[(counter+1) & 1] 供硬件播放
直连模式下,内核驱动会持续清零输出 DMA 缓冲区。用户写入的数据在 1-2 个 cycle 后被覆盖为全零。
| 测试 | 结果 |
|---|---|
| 开始前写入模式数据 | ✅ 数据保持不变 |
| 流式传输中写入模式数据 | ❌ 2个 cycle 后全部清零 |
| 写入一半 + WAIT_FOR_BUFFER | ❌ 杂音 |
| 官方 DLL 输出正弦波 | ✅ 完美清晰 |
结论:输出需要官方 DLL 的内部机制(可能涉及特殊的 IOCTL 序列或内存映射方式),暂时无法绕过。当前解决方案:代理模式。
# 以管理员身份运行命令提示符
# 1. 复制 DLL
copy BehringerASIO.dll C:\Windows\System32\
# 2. 注册
regsvr32 C:\Windows\System32\BehringerASIO.dll
# 卸载
regsvr32 /u C:\Windows\System32\BehringerASIO.dll
前提:必须已安装官方 Behringer UMC Audio Driver v5.x
# 需要 Visual Studio 2019+ 和 CMake 3.16+
cd D:\UMCasio
cmake -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release
# 输出: build\bin\Release\BehringerASIO.dll
| 库 | 用途 |
|---|---|
ole32.lib | COM 基础 |
oleaut32.lib | COM 自动化 |
setupapi.lib | 设备接口枚举 (直连模式) |
winmm.lib | 多媒体定时器 |
avrt.lib | MMCSS 线程优先级 |