UAC 音频通道集描述符
UAC音频通道集描述符全称Audio Channel Cluster Descriptor。音频通道集描述符是为了引入一组具有相同特性(如采样)的音频通道的描述符。
音频通道描述符主要包括两方面的内容:
- bNrChannels:音频通道的数量。
bmChannelConfig:位图字段,用于指定通道占用的通道位置。通道位置的定义如下:
- D0: Front Left - FL - 左声道
- D1: Front Right - FR - 右声道
- D2: Front Center
- D3: Low Frequency Effects- LFE
- D4: Back Left - BL
- D5: Back Right - BR
- D6: Front Left of Center - FLC
- D7: Front Right of Center - FRC
- D8: Back Center - BC
- D9: Side Left - SL
- D10: Side Right - SR
- D11: Top Center - TC
- D12: Top Front Left - TFL
- D13: Top Front Center - TFC
- D14: Top Front Right - TFR
- D15: Top Back Left - TBL
- D16: Top Back Center - TBC
- D17: Top Back Right – TBR
- D18: Top Front Left of Center – TFLC
- D19: Top Front Right of Center – TFRC
- D20: Left Low Frequency Effects– LLFE
- D21: Right Low Frequency Effects– RLFE
- D22: Top Side Left – TSL
- D23: Top Side Right – TSR
- D24: Bottom Center – BC
- D25: Back Left of Center – BLC
- D26: Back Right of Center – BRC
- D27..D30: Reserved
- D31: Raw Data – RD; Mutually exclusive with all other spatial locations
iChannelNames:通道的字符串名称数字索引。描述符描述集群中第一个未重定义逻辑通道的空间位置。所有剩余逻辑通道的空间位置必须由字符串描述符描述,其索引紧跟第一个非预定义通道。ChannelNames所以描述了一个字符串数组的描述符索引,范围从iChannelNames到(iChannelNames+(bNrChannels-[Number_Of_Bits_Set]) - 1。
有一种情况是音频通道集传递的是原始数据,这时bNrChannels和iChannelNames必须为0,bmChannelConfig的Bit31置1,其余位为0。所以当bmChannelConfig字段中的位D31被设置时,描述符中的所有其他信息都必须被忽略。
UAC音频通道集描述符结构体
struct
{
UINT8 bNrChannels;
UINT32 bmChannelConfig;
UINT8 iChannelNames;
}
UAC音频通道集描述符结构体示例
如下定义一个杜比定向逻辑II(Dolby ProLogic II)具有左右前后4个通道的音频描述符。
偏移 | 字段 | 长度 | 值 | 描述 |
---|---|---|---|---|
0 | bNrChannels | 1 | 4 | 4个通道 |
1 | bmChannelConfig | 4 | 0x00000107 | 左前,右前,前中,后中 |
5 | iChannelNames | 1 | 0 | 因为没有非预定义的通道。,所以必须将此索引设置为0 |
含有未预定义的通道
偏移 | 字段 | 长度 | 值 | 描述 |
---|---|---|---|---|
0 | bNrChannels | 1 | 5 | 5个通道 |
1 | bmChannelConfig | 4 | 0x00000051 | 左前,右后,左前中(Front Left, Back Left , Front Left of Center)和两个未定义的能道 |
5 | iChannelNames | 1 | Index | 第一个非预定义字符串描述符的可选索引,后续的依次累加 |
bmChannelConfig值为5代表5个通道,bmChannelConfig=0x00000051定义了3个预定义的通道。故有2个非预定义的通道。
字符串索引类似像这样:
- String (Index) = ‘Left Down Mix 1’
- String (Index+1) = ‘Left Down Mix 2’
由于对逻辑和实际的特理音频通道进行了区分,所以定义了两种类型的通道集描述符:
- 逻辑音频通道集描述符 - Logical audio channel cluster descriptor
- 物理音频通道集描述符 - Physical audio channel cluster descriptor
说明:
无论是逻辑音频通道集描述符还是物理音频通道集描述符,都不是独立的描述符,所以这上音频通道描述符镶嵌在其它描述中。
逻辑音频通道集描述符可镶嵌在以下描述中:
- 输入端描述符 Input Terminal descriptor
- 混合单元描述符 Mixer Unit descriptor
- 处理单元描述符 Processing Unit descriptor
- 扩展单元描述符 Extension Unit descriptor
如下面是定义在输入终端描述符描符中的音频通道集描述符。
------- Audio Control Input Terminal Descriptor -------
bLength : 0x0C (12 bytes)
bDescriptorType : 0x24 (Audio Interface Descriptor)
bDescriptorSubtype : 0x02 (Input Terminal)
bTerminalID : 0x01
wTerminalType : 0x0101 (USB streaming)
bAssocTerminal : 0x00
bNrChannels : 0x02 (2 channels)
wChannelConfig : 0x0003 (L, R)
iChannelNames : 0x00 (No String Descriptor)
iTerminal : 0x00 (No String Descriptor)
Data (HexDump) : 0C 24 02 01 01 01 00 02 03 00 00 00 .$..........
物理音频通道集描述符只镶嵌在类特定音频流接口描述符(class-specific AS interface descriptor)。
UAC音频通道集描述符本质上是动态的。在音频设备枚举完成后尚未工作时,这意味着逻辑音频通道描述符将表示一个空集群(所有字段为零)。因为所有表示USB端点的音频流接口都需要在空闲模式下启动(Alternate Setting 0, zero bandwidth)。