简单的UAC2.0设备的Audio Function Topology如下:
- Input Terminal Descriptor
下面描述了一个立体声的USB输入数据流的输入终端
AUDIO_20_IT_DESC_SIZE, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
AUDIO_CONTROL_INPUT_TERMINAL, /* bDescriptorSubtype */
AUDIO_IT_ID, /* bTerminalID */
0x01, /* wTerminalType AUDIO_TERMINAL_USB_STREAMING 0x0101 */
0x01,
0x00, /* bAssocTerminal */
AUDIO_CLK_ID, /* bCSourceID*/
0x02, /* bNrChannels */
0x03, /* wChannelConfig 0x00000003 Stereo */
0x00,
0x00,
0x00,
0x00, /* iChannelNames */
0x00, /* bmControls */
0x00,
0x00, /* iTerminal */
- Feature Unit Descriptor
主通道支持音量和mute控制
0x12, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
AUDIO_CONTROL_FEATURE_UNIT, /* bDescriptorSubtype */
AUDIO_FU_ID, /* bUnitID */
AUDIO_IT_ID, /* bSourceID */
AUDIO_20_CTL_MUTE(CONTROL_BITMAP_PROG)/* bmaControls(0) */
| AUDIO_20_CTL_VOLUME(CONTROL_BITMAP_PROG),
0x00,
0x00,
0x00,
0x00, /* bmaControls(1) */
0x00,
0x00,
0x00,
0x00, /* bmaControls(2) */
0x00,
0x00,
0x00,
0x00, /* iFeature */
- Output Terminal Descriptor
这里有个细节,如果OT的wTerminalType为0x0101(即USB Streaming),在Mac OSX 10.12.5上是无法进行音量控制的
AUDIO_20_OT_DESC_SIZE, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype */
AUDIO_OT_ID, /* bTerminalID */
0x02, /* wTerminalType 0x0301: Speaker, 0x0302: Headphone*/
0x03,
0x00, /* bAssocTerminal */
AUDIO_FU_ID, /* bSourceID */
AUDIO_CLK_ID, /* bCSourceID */
0x00, /* bmControls */
0x00,
0x00, /* iTerminal */
- Clock Source Descriptor
时钟域的概念是UAC2.0里新提出的,通过时钟域的改变进行采样率的更新。
AUDIO_20_CLK_SOURCE_DESC_SIZE, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
AUDIO_CONTROL_CLOCK_SOURCE, /* bDescriptorSubtype */
AUDIO_CLK_ID, /* bClockID */
0x01, /* bmAttributes */
0x07, /* bmControls TODO */
0x00, /* bAssocTerminal */
0x00, /* iClockSource */
细节可参考我基于STM32F4Discovery实现了一个简单的UAC2.0设备(https://git.oschina.net/crouchggj/STM32F4_USB_SoundCard.git)。