USB Audio Class
编辑
锁定
讨论
上传视频
本词条缺少信息栏,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!
USB Audio Class,USB音频类,一个像USB这样的通用数据接口,可以有很多种实现数字音频数据传输的方式。不同的开发者可以根据自己的喜好和需求,定义任意的控制方式,传输模式,音频格式等等参数。
USB Audio Class音频类定义
编辑
USB非常适合作为以PC为平台的音频(包括语音和音乐等)传输协议,而基于PC的电话系统从一开始就是USB接口发展的重要考量和推动力。从另一方面来说,USB接口拥有远远高于音频需求的带宽,可以传输极高品质(高采样率,高编码率,多声道)的音频数据。因此,例如电话,音乐回放,录音等音频功能都可以很容易在USB接口实现。
理论上,一个像USB这样的通用数据接口,可以有很多种实现数字音频数据传输的方式。不同的开发者可以根据自己的喜好和需求,定义任意的控制方式,传输模式,音频格式等等参数。但是,从市场和工业开发考虑,定义一个被不同开发者认可,高质量的,并且被标准化的音频传输机制是非常必要的。只有这样,才有可能使可能在USB上连接的不同音频设备保持最大的兼容性。标准化的传输机制,同样可以使软件驱动尽可能保持通用和简洁。而USB音频类(Audio Device Class)就是为了满足以上要求而定义。USB音频类包括了所有和USB接口兼容的音频流和音频控制功能,甚至包括使用模拟音源,利用USB接口作为控制接口的设备也被归入USB音频类设备。
下面将介绍开发USB音频类中设计USB语音设备所有必须的信息。
任何USB设备在连接到USB接口后,主机检测到有新设备接入,会利用不同的请求命令(Request)查询该设备的属性,设备通过不同的描述符向主机报告自己的情况。包括设备的种类,设备的功能,设备具有的端点数量以及其他工作属性等等。在了解这些信息之后,主机就可以根据需要分配USB工作带宽。USB定义了描述符层级如下:
/*Device Descriptors设备描述符*/
struct _DEVICE_DESCRIPTOR_STRUCT
{
BYTE bLength; //设备描述符的字节数大小,为0x12
BYTE bDescriptorType; //描述符类型编号,为0x01
WORD bcdUSB; //USB版本号
BYTE bDeviceClass; //USB分配的设备类代码,0x01~0xfe为标准设备类,0xff为厂商自定义类型
//0x00不是在设备描述符中定义的,如HID
BYTE bDeviceSubClass; //usb分配的子类代码,同上,值由USB规定和分配的
BYTE bDeviceProtocl; //USB分配的设备协议代码,同上
BYTE bMaxPacketSize0; //端点0的最大包的大小
WORD idVendor; //厂商编号
WORD idProduct; //产品编号
WORD bcdDevice; //设备出厂编号
BYTE iManufacturer; //描述厂商字符串的索引
BYTE iProduct; //描述产品字符串的索引
BYTE iSerialNumber; //描述设备序列号字符串的索引
BYTE bNumConfiguration; //可能的配置数量
}
/*Configuration Descriptor 配置描述符*/
struct _CONFIGURATION_DESCRIPTOR_STRUCT
{
BYTE bLength; //配置描述符的字节数大小,为0x09[1]
BYTE bDescriptorType; //描述符类型编号,为0x02
WORD wTotalLength; //配置所返回的所有数量的大小
BYTE bNumInterface; //此配置所支持的接口数量
BYTE bConfigurationVale; //Set_Configuration命令需要的参数值
BYTE iConfiguration; //描述该配置的字符串的索引值
BYTE bmAttribute; //供电模式的选择
BYTE MaxPower; //设备从总线提取的最大电流
}
/*Interface Descriptor 接口描述符*/
struct _INTERFACE_DEscriptOR_STRUCT
{
BYTE bLength; //接口描述符的字节数大小,为0x09[1]
BYTE bDescriptorType; //描述符类型编号,为0x04
BYTE bInterfaceNunber; //接口的编号
BYTE bAlternateSetting;//备用的接口描述符编号
BYTE bNumEndpoints; //该接口使用端点数,不包括端点0
BYTE bInterfaceClass; //接口类型
BYTE bInterfaceSubClass;//接口子类型
BYTE bInterfaceProtocol;//接口所遵循的协议
BYTE iInterface; //描述该接口的字符串索引值
}
/*Endpoint Descriptor 端点描述符*/
struct _ENDPOIN_DESCRIPTOR_STRUCT
{
BYTE bLength; //端点描述符的字节数大小,为0x07[1]
BYTE bDescriptorType; //描述符类型编号,为0x05
BYTE bEndpointAddress; //端点地址及输入输出属性
BYTE bmAttribute; //端点的传输类型属性
WORD wMaxPacketSize; //端点收、发的最大包的大小
BYTE bInterval; //主机查询端点的时间间隔
}
表1- 1音频类接口描述符码
Audio Interface Class CodeValue
Audio0x01
USB Audio Class子类和协议
编辑
USB音频类定义在接口层,而USB音频类又分为不同的子类(SubClass)以便于进一步的细节枚举和设置。所有的USB音频功能都被包括在USB音频类的子类中。USB定义了3种不同的音频子类:
[01] AudioControl Interface Subclass 音频控制接口子类
[02] AudioStreaming Interface Subclass 音频流接口子类
[03] MIDIStreaming Interface Subclass MIDI流接口子类
USB不同音频子类描述符码:
表1-2音频子类描述符码
Audio Subclass CodeValue
SUBCLASS_UNDEFINED0x00
AUDIOCONTROL0x01
AUDIOSTREAMING0x02
MIDISTREMING0x03
USB Audio Class数据格式
编辑
USB音频类可以被分为3种不同的类别,分别称为TYPE I,TYPE II,以及TYPE III。
TYPE I
TYPE I主要针对于音频数据流是按照物理时序以采样为单位的数据格式,每一个采样点由一个数据表示,而最终的音频信号是将这些连续发送的采样数据进行DA转换后得到的波形。在此类型中,使用某些压缩算法并不改变其格式类型,只要该压缩算法不影响数据以样本为单位的基本格式,例如G.711语音编码算法。在TYPE I格式下如果需要传送多个声道的数据,不同声道的数据是交叉传送的。因此,要从TYPE I中恢复多声道数据,只需要将每个簇(Cluster)中依次提取出各个声道的采样值并分别恢复即可,因此,TYPE I在传送过程中,保存了每个声道的独立性,恢复非常方便。
典型的TYPE I信号就是标准的PCM码。
TYPE II
TYPE II针对语音编码在传输中不保存每个物理信道独立标志的语音格式。总的来说,所有的非PCM语音编码都属于这个类型,通常,来自不同物理声道的一定数量的音频采样点被编码到一个比特流。只有在经过传输并解码以后,才能以一定精度恢复出不同物理声道的声音。这种编码模式相对于标准的PCM码而言通常需要更少的数据量来传送同样的声音数据,可以有效的降低传送中对带宽的需求。
TYPE III
TYPE III包括那些不属于以上两类的特殊的音频数据格式。事实上,通常TYPE III应用在同时具有TYPE I和TYPE II两种特点的数据流中。在这类音频格式中,一个或多个非PCM编码的音频数据流被打包成伪立体声采样(Pseudo-stereo sample),在传输中,把这种信号假设成PCM信号进行传输。由于TYPE III通过伪采样保存了原始的采样率信息,比起TYPE II格式,更容易在输出端准确恢复出时钟信号。不过缺点在于除非把不同的非PCM编码流打包成一个伪立体声数据流,比起TYPE II需要更多的带宽。当然,比起TYPE I对带宽的需求更低。
USB音频终端使用PCM码,数据格式采用TYPE I,因此主要介绍TYPE I。
为了让主机了解语音外设使用的音频格式,同其他USB外设一样,在设备列举阶段,需要利用描述符进行配置。
表1-3 TYPE I描述符格式如下
OffsetFieldSizeSizeValue
0bLength1Number
1bDescriptorType1Constant
2bDescriptorSubtype1Constant
3bFormatType1Constant
4bNrChannels1Number
5bSubframeSize1Number
6bBitResolution1Number
7bSamFreqType1Number
8n
其中,Size表示该字段长度,以字节为单位。BLength表示该描述符长度,计算公式为:
bLength=8+(ns*3)
公式中,8为固定字段长度,ns代表该接口的端点支持的不同采样率数量。例如,当该端点同时支持针对语音8KHz和针对音乐回放的44.1KHz时,ns取值2。
bDescriptorType 表示该描述符种类为音频类特有的接口
bDescriptorSubtype 表示该描述符为数据格式描述符
bFormatType 指定该接口具体数据格式
bNrChannels 表示该接口支持的物理声道数
bSubframeSize 音频子帧大小
bBitResolution 指定采样量化比特数
bSamFreqType 指定该接口支持频率类型,可选为连续和固定两种
最后一个字段由bSamFreqType决定,采用单一采样率,只需要填入以24位二进制数表示的具体采样率值即可,可选范围为0到16777215Hz。
TYPE II和TYPE III的具体描述符这里不再介绍。
USB Audio Class数据流定义
编辑
USB音频子帧是在USB总线上传输音频数据最基本的单位,每个音频子帧装载一个采样点。而每个子帧只能包含整数个字节(Byte)的数据。USB协议限制了音频子帧的数据大小,由bSubframeSize定义,可选范围包括1,2,3,4字节数据。一个音频采样是以一定位数的二进制数表示,由bBitResolution定义,其包含的二进制位数必须小于或等于一个音频子帧的位数。例如,可以把一个12bit量化的音频采样放入一个2Byte的音频子帧中。只要正确的配置了描述符,主机就会自动将12bit有效数据装载到2Byte子帧中或从子帧中取出有效数据。
USB音频帧是由一组音频子帧组成的在物理时间上同时采样得到的数据。他是不同物理声道的子帧的组合,一个音频帧中的子帧数量等同于在该音频流中的逻辑声道数,同一个音频帧中的不同子帧定义的数据大小必须一致。在单声道系统中,音频帧和子帧数量是一致的。
数据流是一个连续的,由大量的音频帧组成并按照采样时间连续传送的数据。音频流被打包成USB数据包(USB packets)在USB总线上传送。每个数据包只能包含整数个音频流数据。
USB Audio Class模块拓扑结构
编辑
为了能对应声音的各种物理特性进行控制,例如简单的音量增减,左右声道平衡,较复杂的3D声效,回声等等功能。需要将声音设备分割成不同的可独立控制的实体(Entity)。在USB音频类中,这些实体被分为两大类,分别称为单元和端口(Units and Terminals)。
单元(Unit)提供基本的音频设备拓扑结构的构筑“砖块”,他们通过合理的逻辑连接能够完成各种音频功能,不同的音频设备和功能都是利用将不同的单元通过不同的结构连接起来实现的。一个单元包括一个或多个拥有各自编号的输入端以及唯一输出端。
每一个设备中的单元都完全由它的单元描述符(Unit Descriptpr UD)描述。单元描述符包括了所有单元需要的描述信息。
端口(Terminal)只有输入端口与输出端口两种。输入端口(IT)代表音频设备内一个声道进入的起始端。相应的,输出端口(OT)代表音频设备内一个声道的结束端。考虑整个语音设备和PC机形成的音频功能中,USB端点就是一个典型的音频输出或输入端。例如,对电脑而言麦克风捕捉的音频信号经过设备处理发送USB输入端点,该端点同时也是语音设备的输出端口。与单元类似,端口也完全由端口描述符(Terminal Descriptor TD)描述。
USB音频类主要定义了以下单元和接口实体:
Input Terminal
Output Terminal
Mixer Unit
Selector Unit
Feature Unit
Processing Unit
Extension Unit
每一个单元内部通常还包含不同的功能,例如Feature Unit就包括声道平衡,音量控制,EQ调整等等功能,通过利用Extension Unit不同的开发者还可以根据自己的需求自己定制功能模块。
USB音频设备必须将其具有的,以一定的拓扑结构连接的单元和端口的拓扑结构和所支持的所有功能完全地通过描述符提交给主机端。主机端的通用驱动程序将利用这些信息来正确控制和配置USB音频设备。以我们采用的USB音频终端的拓扑结构为例:
USB OUT Input Terminal Feature Unit Output Terminal
Endpoint ---> ID:1 ---> ID:9 ---> ID:6 ---> Speaker
Input Terminal Feature Unit Output Terminal USB IN
MicroPhone---> ID:2 ---> ID:a ---> ID:7 ---> Endpoint
图1- 2USB语音终端拓扑结构
由上图可知,该设备主要由输出端口,输入端口,特征单元三种实体组成。其中一个输入端口对应于一个USB输出端口,另一个输出对应于一个USB输入端口。对这两个端口,在向主机列举设备的描述符时,还必须同时列举其对应的USB端点的描述符,才能让主机驱动程序完全了解设备的功能结构,以便正确的配置设备。其中,音频流相关的参数信息由USB端点描述符描述,声音控制(Audio Control)信息则由设备端口描述符描述。
以ID为1的输入端口和ID为6的输出端口为例,他们的描述符格式如下:
表1 - 4输出端描述符
OffsetFieldSizeValuedescription
0bLength10x0c本描述符长度,以字节为单位
1bDescriptorType10x24本描述符种类为音频专属类别
2bDescriptorSubType10x02本描述符子类为输入端口
3bTerminalID10x01本描述符对应实体ID号为1
4wTerminalType20x0101输入端口种类为USB数据流
6bAssocTerminal10x00绑定端口,无
7bNrChannels10x02本端口对应声道数为2
8wChannelConfig20x0003本端口对应声道空间位置为左右声道
10iChannelNames10x00Unused
11iTerminal10x00unused
表1 - 5 输出端口描述符
OffsetFieldSizeValuedescription
0bLength10x09本描述符长度,以字节为单位
1bDescriptorType10x24本描述符种类为音频专属类别
2bDescriptorSubType10x03本描述符子类为输出端口
3bTerminalID10x06本描述符对应实体ID号为6
4wTerminalType20x0301输入端口种类为喇叭
6bAssocTerminal10x00无绑定端口
7bSourceID10x09本实体输入信号来自于ID号为9的实体
8iTerminal10x00unused
特征单元负责声音信号的一些常规处理工作,例如经常使用到的音量控制,静音开关,音调调整,可视化均衡器,延迟,重低音加强等等。它几乎包括了所有常用的控制功能,针对语音应用而言,特征单元足以满足对声音的控制需求。在Windows操作系统中,操作系统在得到设备的特征单元参数后,将利用这些参数调整Windows的音频控制对画框。以便于用户使用可视化的界面对设备进行操作。以ID号为9的特征单元为例,其描述符如下:
表2 - 6特征单元描述符表
OffsetFieldSizeValuedescriotion
0bLength10x0aDescriptor length
1bDescriptorType10x24CS_INTERFACE
2bDescriptorSubType10x06FEATURE_UNIT
3bUnitID10x09ID of this Output Terminal.
4bSourceID10x01ID of input terminal
5bControlSize10x01Size of an element of bmaControls
6bmaControls(0)10x01A bit set to 1 indicates that the mentioned Control is supported for master channel 0:
D0: Mute
D1: Volume
D2: Bass
D3: Mid
D4: Treble
D5: Graphic Equalizer
D6: Automatic Gain
D7: Delay
D8: Bass Boost
D9: Loudness
D10..(n*8-1): Reserved
[2]
参考资料
1.
马 伟.计算机USB系统原理及其主/从机设计:北京航空航天大学出版社,2004