USB Audio Class(UAC)协议定义了通过USB接口传输音频数据的标准格式和控制机制。其数据格式涉及描述符配置、音频流传输格式及控制请求结构。以下为UAC协议数据格式的详细解析:
—
1. UAC协议版本与核心结构
USB Audio Class分为 UAC1.0、UAC2.0 和 UAC3.0,不同版本支持的功能不同:
- UAC1.0:支持基本音频功能(如PCM音频流、音量控制)。
- UAC2.0:增加高带宽支持(如32位/384kHz音频、更多声道)。
- UAC3.0:优化功耗管理,支持上下文感知控制(如设备唤醒)。
所有版本均通过 描述符(Descriptors) 定义设备能力,并通过 等时传输(Isochronous Transfers) 传输音频数据。
2. USB描述符结构
UAC设备需配置以下关键描述符:
(1) 标准USB描述符
- 设备描述符(Device Descriptor):标识设备类型为音频类(
bDeviceClass = 0x00
,bDeviceSubClass = 0x00
,在接口中声明类)。 - 配置描述符(Configuration Descriptor):定义设备的功能集合。
(2) 音频类特定描述符
- 接口关联描述符(IAD, Interface Association Descriptor)(仅UAC2+):关联音频控制接口和音频流接口。
- 音频控制接口(AC Interface):管理音量、静音等控制功能。
- 类特定AC接口描述符(CS_AC_Interface Descriptor):定义支持的控件类型。
- 音频流接口(AS Interface):传输音频数据。
- 类特定AS接口描述符(CS_AS_Interface Descriptor):定义音频格式、声道数、采样率等。
- 端点描述符(Endpoint Descriptor):配置数据传输方向与模式(如等时传输端点)。
3. 音频流数据格式
音频数据通过 等时端点(Isochronous Endpoint) 传输,格式由AS接口描述符定义:
(1) 音频格式类型
- Type I格式:用于PCM音频,支持以下参数:
bFormatType = 0x01
(UAC1.0)或0x02
(UAC2.0)。- 位深度(
bBitResolution
):16/24/32位。 - 声道数(
bNrChannels
):1~255(UAC2.0支持更多声道)。 - 采样率(通过
Sample Frequency
描述符定义,如44.1kHz、48kHz、96kHz等)。
- Type II/III格式:用于压缩音频(如MPEG、Dolby Digital)。
(2) 数据包结构
- 每帧数据:包含多个音频样本,按声道交错排列。
- 示例(24位/立体声PCM):
每个声道样本占3字节,单帧数据为[Left_LSB, Left_MSB][Right_LSB, Right_MSB]
,共6字节。
- 示例(24位/立体声PCM):
- 同步机制:通过
bmAttributes
字段定义同步类型:- 异步模式(Asynchronous):设备或主机提供独立时钟。
- 同步模式(Synchronous):基于USB帧时钟(1ms周期)。
- 自适应模式(Adaptive):动态调整时钟以匹配数据速率。
4. 控制请求与数据格式
音频控制通过 控制传输(Control Transfer) 实现,常用请求如下:
(1) 标准控制请求
- 设置/获取音量(SET_CUR/GET_CUR):
数据格式为uint16_t
,范围0x0000~0xFFFF
(对应最小~最大音量)。 - 静音控制(SET_MUTE/GET_MUTE):
数据格式为uint8_t
(0=取消静音,1=静音)。
(2) 类特定控制请求
- 设置采样率(SET_SAMPLING_FREQ):
数据格式为uint32_t
,单位Hz(如48000
)。 - 选择音频通道(SET_CHANNEL):
数据格式为位掩码(如0x03
表示启用左/右声道)。
5. UAC2.0与UAC3.0扩展
(1) UAC2.0新增特性
- 高带宽支持:支持32位/384kHz音频。
- 时钟源选择:通过
bClockSource
字段指定内部/外部时钟。 - 扩展通道布局:支持7.1声道、3D音频。
(2) UAC3.0改进
- 低功耗模式:支持设备休眠与快速唤醒。
- 上下文感知控制:根据使用场景动态调整参数(如耳机插入检测)。
6. 示例描述符解析(UAC1.0 PCM音频设备)
// 设备描述符
struct usb_device_descriptor dev_desc = {
.bLength = 18,
.bDescriptorType = USB_DT_DEVICE,
.bcdUSB = 0x0200,
.bDeviceClass = 0x00, // 类在接口中定义
.bDeviceSubClass = 0x00,
.bDeviceProtocol = 0x00,
.idVendor = 0x1234,
.idProduct = 0x5678,
// ...其他字段省略
};
// 类特定AS接口描述符(PCM格式)
struct uac1_as_header_descriptor as_header = {
.bLength = 7,
.bDescriptorType = USB_DT_CS_INTERFACE,
.bDescriptorSubtype = UAC_AS_GENERAL,
.bTerminalLink = 0x01, // 关联输入终端
.bDelay = 0x01,
.wFormatTag = 0x0001, // PCM格式
};
// 端点描述符(等时传输)
struct usb_endpoint_descriptor ep_desc = {
.bLength = 7,
.bDescriptorType = USB_DT_ENDPOINT,
.bEndpointAddress = 0x01, // OUT端点
.bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ADAPTIVE,
.wMaxPacketSize = 1024, // 每帧最大字节数
.bInterval = 0x01,
};
7. 调试与兼容性
- 工具推荐:
- USB协议分析仪(如Wireshark + USB捕获硬件)。
- USB-IF官方测试工具(USB Command Verifier)。
- 兼容性注意:
- Windows/macOS/Linux对UAC的支持差异(如UAC2.0需特定驱动)。
- 确保描述符严格符合规范,避免枚举失败。
通过以上数据格式的配置与解析,开发者可实现符合UAC标准的USB音频设备,确保与主机系统的兼容性和高性能音频传输。详细规范可参考USB-IF发布的 《USB Audio Class Specification》。