一、简介

UAC是USB Audio Class的缩写,有时也叫UAD,UAD是USB Audio Device的缩写。

UAC/UAD定义了在USB规范下实现音频的设备的实现和控制功能,这些功能包括不仅音频数字部分的,也包括模拟部分。这些音频数据(模拟和数字)和用于直接控制音频环境的功能,如音量和音调控制。这个音频设备类不包括操作与音频数据的复制,如磁带传输机制或CD-ROM驱动器控制。
UAC 目前的发展已经经历了1.0 ,2.0 到现在的3.0.
win10目前只支持到UAC2.0

注意:UAC3.0不兼容以前的任何版本。

android 配置uart android uac_数据

UAC2.0 和UAC1.0 支持的功能对比图

android 配置uart android uac_描述符_02

二、UAC 传输速率

UAC1 最高实际速度: ≤ 7.8Mbs(1024 x 8 x 1000 )bit/s
UAC2 标准实际速度: ≤ 62.5Mbs(1024 x 8 x 1000 x 8 )bit/s 最高实际速度: ≤187.5Mbs(1024 x 8 x 1000 x 8 x 3)Mb/s
注意:UAC1.0 spec 规定每隔1ms 可以发送一笔数据, High speed 下单笔数据是1024Byte, 因此最大为 (1024 x 8 x 1000 )bit/s

UAC2.0 spec 是可以每隔125us 发送一笔数据, High speed 下标准为单笔数据是1024Byte, 因此最大为 (1024 x 8 x 1000 x 8 )bit/s

最大情况: 单次可以发送 3 笔数据, 所以为(1024 x 8 x 1000 x 8 x 3)bit/s

android 配置uart android uac_数据_03


android 配置uart android uac_音频流_04

三、UAC音频设备的接口的分类

对于每一个USB配置描述符,可能含有多个USB接口描述描述符,同时这些接口描述符可能每个接口描述符又包含多个转换接口描述符。
这些接口描述符可能每一个接口描述符实现的是不同的独立的功能或者多个接口描述符组合实现一些设备功能。

android 配置uart android uac_音视频_05

UAC 音频设置也有独立的接口描述符,这些多接口配合实现的UAC设备接口,分为两种,分别叫做UAC音频控制接口和UAC音频流接口。

UAC音频控制接口:用于实现UAC音频控制接口及拓扑结构的枚举。
UAC音频流接口:用于音频数据流的传输。

下图为USB Microphone 的拓扑图,IT 为输入终端,OT为输出终端

android 配置uart android uac_数据_06


usb 枚举信息的结构如下,主要有两个接口分别为: 音频控制接口和音频流接口 :

android 配置uart android uac_描述符_07


UAC音频控制接口
为了控制特定音频功能的功能行为,主机可以操纵时钟实体、单元以及音频功能内部的终端。为了使这些对象可访问,音频功能应提供单音频控制接口。

UAC音频流接口
UAC音频流接口用于传输音频流数据。一个UAC音频设备可以有多个音频流接口,每个音频流接口可以传输不同的音频数据格式。每一个音频流接口只能有一个等时传输端点,这样保证的是数据的传输与端点相关。
音频流接口包含转换接口进行音频流的切换。但至少包含一个转换接口为0的零带宽即不传输音频流接口和一个包含实际传输数据的转换接口1。


音频控制(AC)接口描述符 UAC1.0

android 配置uart android uac_音频流_08


android 配置uart android uac_音频流_09


android 配置uart android uac_描述符_10

特有类AC接口描述符 UAC1.0

特有类音频接口控制描述并不是指某个特定的描述符,而是一系列描述音频功能的描述符集合的总称。

这些描述符包括:单元描述符(UD)、以及终端描述符(TD)。这些描述符是UAC特有类的描述符,由UAC协议定义。因此,描述符集合的总长度与音频功能中定义的时钟实体、单元实体和终端的个数有关。

特有类AC接口描述符集合用一个头描述符作为开头,头描述符描述了集合的总长、音频设备类规范版本、功能类型等。所以,首先要解析的是特有类AC接口头描述符。

android 配置uart android uac_android 配置uart_11


android 配置uart android uac_音视频_12


android 配置uart android uac_android 配置uart_13


android 配置uart android uac_数据_14

输入终端描述符(ITD)

UAC输入终端描述符全称:Input Terminal Descriptor,简称ITD.
输入终端描述符用于向主机提供输入终端的相关信息,这个概念和UVC摄像头的输入终端描述符类似。

android 配置uart android uac_音频流_15


android 配置uart android uac_数据_16


android 配置uart android uac_描述符_17


android 配置uart android uac_音频流_18


android 配置uart android uac_描述符_19

输出终端描述符(OTD)

UAC输出终端描述符:Output Terminal Descriptor,简称OTD,用于向主机提供输出终端的相关信息。

android 配置uart android uac_数据_20


android 配置uart android uac_数据_21


android 配置uart android uac_音频流_22


android 配置uart android uac_音视频_23

单元描述符(UID)

单元实现了USB音频的基本功能,音频设备的整体功能是由一个个单元级联起来实现的。

单元描述符分为:混音单元描述符、选择单元描述符、特征单元描述符、采样率转换单元描述符、效果单元描述符、处理单元描述符和扩展单元描述符。

效果单元描述符又可以细分为:参数均衡器效果单元描述符、回响效果单元描述符、调制延迟效果单元描述符、动态范围压缩效果描述符。

处理单元描述符又可分为:上/下混合处理单元描述符、杜比音效逻辑处理单元描述符、立体声扩展处理单元描述符。

特征单元描述符(Feature Unit Descriptor)描述了该特征单元前序连接的输入终端上每个通道(声道)可被配置的功能列表。比如:音量控制、静音、声道平衡等等,这是开发USB 音频设备最常用的描述符。

特征单元描述符

android 配置uart android uac_描述符_24


android 配置uart android uac_数据_25


android 配置uart android uac_数据_26


android 配置uart android uac_描述符_27

音频流(AS)接口描述符

音频流接口用于主机和设备之间交换音频数据流,接口下一般会存在两个这样的端点:

(1)音频传输端点:用于传输音频流

(2)音频同步端点:传输同步信息

为了支持多种音频流格式、采样率、传输带宽和其他属性,一个USB音频设备的音频流接口描述符都包含多个接口可替换设置(Alternate Setting)。

例:有一个音频设备,其控制接口(AC)用来控制音量的;音频流接口(AS)用来传输音频数据。那么音频流接口可以有多种可替换设置:

(1)可替换设置0:单声道模式,16KHZ采样率,24位量化,在该设置的音频类数据格式描述符中设置这些值,然后在音频流传输端点上就可以传输对应格式的单通道的音频数据。

(2)可替换设置1:立体声双声道模式,48KHZ采样率,16位量化,在该设置的音频类数据格式描述符中设置这些值,然后在音频流传输端点上就可以传输对应格式的单通道的音频数据。

(3)音频流接口描述符包括:标准音频流接口描述符 和 音频类特有音频流接口描述符。

标准AS接口描述符

UAC音频流接口描述符包含与音频数据流相关的描述符信息。

标准音频流接口描述符,Standard AS Interface Descriptor是音频流接口描述符的第一个描述符。

android 配置uart android uac_android 配置uart_28


android 配置uart android uac_音频流_29


android 配置uart android uac_android 配置uart_30

特定类AS接口描述符

特定类音频流接口描述符:Class-Specific AS Interface Descriptor.

android 配置uart android uac_音频流_31


android 配置uart android uac_数据_32


android 配置uart android uac_音视频_33

特有类音频流数据格式描述符

类特有数据格式描述符:Class-Specific AS Format Type Descriptor

数据格式描述符主要描述音频流的通道数、位分辨率、采样率等信息。

android 配置uart android uac_android 配置uart_34


android 配置uart android uac_数据_35


android 配置uart android uac_描述符_36

下面以Type I 为例,type I 在USB 音频设置中很常见:

(1)Type I数据流格式简介:
Type I信号就是标准的PCM码。
按照物理时序,对音频流进行采样,每一个采样点用一个数据表示,最终的音频信号是把这些连续的采样数据进行AD转换后得到的波形。

(2)音频子帧(Audio Subframe)是传输音频的最基本单位[单位:字节],一个音频子帧就是一个采样点,大小一般是1、2、3或者4个字节(量化之后的量化值,编码的时候,用几个字节来表示),使用字段bSubframeSize来表示。

(3)一个音频子帧数据,使用二进制表示的时候,二进制的位数就是bBitResolution(bBitResolution的单位是:bit—位)。所以,bBitResolution和bSubframeSize存在如下关系:

bBitResolution ≤ bSubframeSize * 8
标准等时音频数据端点描述符

标准等时音频数据端点描述符:Standard AS Isochronous Audio Data Endpoint Descriptor

android 配置uart android uac_描述符_37

android 配置uart android uac_音频流_38


android 配置uart android uac_音视频_39

类特定等时音频数据端点描述符

类特定等时音频数据端点描述符:Class-Specific AS Isochronous Audio Data Endpoint Descriptor,用于描述标准音频传输端点的属性。

android 配置uart android uac_音频流_40


android 配置uart android uac_音视频_41


android 配置uart android uac_描述符_42


android 配置uart android uac_描述符_43


UAC 特定类请求

最后讲一下UAC 特定类请求的格式
特定类请求一般用于设置或获取音频控制。这些控制又分为两大部分:

音频控制请求:对音频控制单元或终端进行控制。
音频流请求: 如对音频流控制的请求,如音频采相率等。

音频设备类也支持其他特定于类的请求:

内存请求(Memory Request):每个可寻址的实体或终端,可导出一个内存映射接口。提供对该实体内存单元的读写控制。
Get Status 请求:对音频控制单元,终端,音频流接口或其它不可操作的状态请求。

android 配置uart android uac_音频流_44

以设置当前音量为例:

android 配置uart android uac_数据_45

android 配置uart android uac_音视频_46


以获取当前音量为例:

android 配置uart android uac_数据_47

android 配置uart android uac_描述符_48