UAC 设备协议栈
本文档描述 XRUSB 的 USB Audio Class 1.0(UAC1) 麦克风设备类实现:LibXR::USB::UAC1MicrophoneQ。该类面向 UAC1 录音(Device → Host) 场景,使用字节队列驱动(queue-driven)将上层产生的 PCM 数据持续送入 Isochronous IN 端点输出,并实现 UAC1 典型控制面(采样率、静音、音量)。
支持能力概览:
- IAD + AC + AS 的标准 UAC1 描述符组织(AC/AS 两接口)
- AS 接口 Alt Setting 0/1 切换,按主机选择启动/停止等时流
- Iso IN 端点 Sampling Frequency Control(3 字节小端)
- Feature Unit Mute / Volume 控制(UAC1 语义:Volume 单位 1/256 dB)
- 根据采样率与服务周期自动计算 每次等时服务的发送字节数(FS=1ms;HS 由
bInterval决定服务频率)
1. 类与模板参数
LibXR::USB::UAC1MicrophoneQ<CHANNELS, BITS_PER_SAMPLE>
模板参数:
CHANNELS:通道数(1..8)BITS_PER_SAMPLE:位深(8 / 16 / 24)
内部常量:
K_SUBFRAME_SIZE:每通道每采样的字节数- 8-bit → 1
- 16-bit → 2
- 24-bit → 3(按 3 字节打包,不是 32-bit 容器)
2. 构造参数与运行时状态
构造函数(核心参数):
sample_rate_hz:采样率(Hz)vol_min / vol_max / vol_res:音量范围与步进,单位 1/256 dBspeed:USB 速度(Speed::FULL/Speed::HIGH)queue_bytes:PCM 队列容量(字节,默认 8192)interval:Iso IN 端点bInterval- Full-Speed:必须为 1(代码中强制)
- High-Speed:允许 1..16(规范含义为微帧指数调度)
iso_in_ep_num:Iso IN 端点号(默认自动分配)
初始化后关键状态:
streaming_:AS Alt=1 时为true(正在流式输出)sr_hz_:当前采样率(可由主机 SET_CUR 动态修改)w_max_packet_size_:运行期计算得到的wMaxPacketSize(受 FS/HS 上限约束)pcm_queue_:PCM 字节队列(LibXR::LockFreeQueue<uint8_t>)
3. 上层数据输入接口(Producer API)
对上层暴露的最小接口如下:
ErrorCode WritePcm(const void* data, size_t nbytes);
size_t QueueSize() const;
size_t QueueSpace();
void ResetQueue();
3.1 PCM 数据格式要求
WritePcm()写入的是交错(interleaved)PCM 字节流,由上层决定具体格式(需与描述符宣告一致):- 16-bit:S16LE(小端)
- 24-bit :S24_3LE(三字节小端)
- 通道交错:例如 2ch 时为
L0 R0 L1 R1 ...
3.2 队列容量建议
为了避免短时间抖动造成欠载(underflow),建议 queue_bytes 至少覆盖数十毫秒缓冲:
- 估算:
bytes_per_ms ≈ sample_rate_hz * CHANNELS * K_SUBFRAME_SIZE / 1000 - 示例:48kHz / 2ch / 16-bit →
48000 * 2 * 2 / 1000 = 192 bytes/ms
8192 bytes ≈ 42 ms 缓冲
4. UAC1 接口与描述符布局
该设备暴露 2 个接口并通过 IAD 关联:
- Audio Control(AC)接口:实体拓扑与控制(Feature Unit)
- Audio Streaming(AS)接口:承载音频流(Alt 0/Alt 1)
实现约束:
GetInterfaceNum()返回2HasIAD()返回true
4.1 实体拓扑(Entity Graph)
实体 ID(代码固定):
| Entity | ID | 说明 |
|---|---|---|
| Input Terminal (Microphone) | 1 | wTerminalType = 0x0201 |
| Feature Unit (Mute/Volume) | 2 | 控制选择器:Mute(0x01)、Volume(0x02) |
| Output Terminal (USB Streaming) | 3 | wTerminalType = 0x0101 |
连接关系:
IT_MIC (1) → FU (2) → OT_USB (3) → AS Interface
4.2 AS 接口的 Alternate Setting
- Alt 0:无端点(不传输)
- Alt 1:包含 1 个 Isochronous IN 端点(开始传输)
主机切换 Alt Setting 是启动/停止音频流的唯一触发条件(见第 6 节)。
4.3 通道配置 wChannelConfig
当前实现仅对 CHANNELS == 2 显式声明:
wChannelConfig = 0x0003(Left Front | Right Front)
其余通道数默认 0x0000(未声明)。如需更严格的多声道位置声明,建议按 UAC1 规范扩展映射表。