🎧 Behringer UMC ASIO Driver

自定义 ASIO 驱动 — 技术文档 v5.0 (2026-03-22)

📐 系统架构

代理模式(当前使用)

🎵 DAW
Studio One 等
📦 BehringerASIO.dll
我们的代理层
📦 umc_audioasio_x64.dll
官方 ASIO DLL
🔌 umc_audio.sys
内核驱动
🎤 UMC 硬件
USB 音频

所有 ASIO 调用 100% 转发给官方 DLL,稳定性与官方完全一致。

✅ 功能状态

功能状态说明
音频输入✅ 正常18 通道,48kHz / 44.1kHz
音频输出✅ 正常20 通道,完美清晰
CPU 占用✅ 正常与官方一致
延迟✅ 正常128 采样 = 2.67ms @ 48kHz
DAW 兼容✅ 验证Studio One 完美运行
ASIO 注册✅ 正常COM/注册表完整

📁 源代码结构

BehringerASIO.cpp / .h

主类 代理模式

ASIO 驱动主类。实现 IASIO 接口,所有调用转发给 AsioProxy。包含 COM 注册、IUnknown 实现。

AsioProxy.cpp / .h

代理层

加载官方 umc_audioasio_x64.dll,通过 COM (DllGetClassObject → IClassFactory → IASIO) 创建实例并转发所有调用。

TusbAudioDirect.cpp / .h

技术储备

完整的 TUSBAUDIO IOCTL 直连引擎。可直接和 umc_audio.sys 内核驱动通信,绕过官方 DLL。输入路径已验证可行。

🔧 TUSBAUDIO IOCTL 协议(逆向成果)

完整逆向的 TUSBAUDIO 专有协议,通过分析官方 DLL 的 DeviceIoControl 调用获得:

IOCTL名称说明
0x80882004GET_DEVICE_INFO获取设备信息 (VID/PID/序列号)
0x80882820GET_USB_CONFIG获取 USB 配置
0x808820C4GET_HW_CAPS获取硬件能力信息
0x80882804SET_MODE设置工作模式
0x80882808GET_STREAM_CONFIG获取流配置 (采样率等)
0x8088280CGET_CHANNEL_LIST获取输入/输出通道列表
0x80882810GET_CHANNEL_INFO获取通道详细信息
0x80882824SET_BUFFER_SIZE设置缓冲区大小
0x80882840SELECT_CHANNEL选择通道用于流式传输
0x80882844DESELECT_CHANNEL取消选择通道
0x80882880SET_CALLBACKS设置控制页和事件句柄
0x808828A0MAP_CHANNEL_BUFFER映射 DMA 缓冲区到用户空间
0x808828C0ENABLE_STREAM启用流 (激活 DMA)
0x808828C4STOP_STREAMING停止流式传输
0x808828C8START_STREAMING启动流式传输
0x808828F4WAIT_FOR_BUFFER等待缓冲区完成 / 泵送数据

💾 DMA 缓冲区模型

双缓冲 (Double Buffering)

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 映射

控制页 (Control Page)

Offset 0x00: DWORD counter  — 每完成一个 buffer half 递增
用户通过读取 counter 变化来检测新数据:
  输入: 读取 buf[(counter+1) & 1] 获取最新采集数据
  输出: 写入 buf[(counter+1) & 1] 供硬件播放

⚠️ 已知限制:输出 DMA

直连模式下,内核驱动会持续清零输出 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.libCOM 基础
oleaut32.libCOM 自动化
setupapi.lib设备接口枚举 (直连模式)
winmm.lib多媒体定时器
avrt.libMMCSS 线程优先级