USB 音频非常流行,原因之一是USB Audio 是USB 标准的一部分,因此原生模式驱动程序可用于所有流程的操作系统(Win Linux Mac)。USB 音频是一种灵活的解决方案,因为任何PC都提供USB接口。
提示:以下是本篇文章正文内容
USB Audio Class,USB音频类,一个像USB这样的通用数据接口,可以有很多种实现数字音频数据传输的方式。不同的开发者可以根据自己的喜好和需求,定义任意的控制方式,传输模式,音频格式等等参数。
USB非常适合作为以PC为平台的音频(包括语音和音乐等)传输协议,而基于PC的电话系统从一开始就是USB接口发展的重要考量和推动力。从另一方面来说,USB接口拥有远远高于音频需求的带宽,可以传输极高品质(高采样率,高编码率,多声道)的音频数据。因此,例如电话,音乐回放,录音等音频功能都可以很容易在USB接口实现。
----- 摘录于百度百科
UAC是USB Audio Class的缩写,应用场景一般有会议宝、耳机、麦克风等设备。UAC分为UAC1.0和UAC2.0,由于UAC2.0,在windows上兼容性不好,在产品中,会带来各种坑,所以一般选择UAC1.0
理论上,一个像USB这样的通用数据接口,可以有很多种实现数字音频数据传输的方式。不同的开发者可以根据自己的喜好和需求,定义任意的控制方式,传输模式,音频格式等等参数。但是,从市场和工业开发考虑,定义一个被不同开发者认可,高质量的,并且被标准化的音频传输机制是非常必要的。只有这样,才有可能使可能在USB上连接的不同音频设备保持最大的兼容性。标准化的传输机制,同样可以使软件驱动尽可能保持通用和简洁。而USB音频类(Audio Device Class)就是为了满足以上要求而定义。USB音频类包括了所有和USB接口兼容的音频流和音频控制功能,甚至包括使用模拟音源,利用USB接口作为控制接口的设备也被归入USB音频类设备。
----- 摘录于百度百科
因此UAC规范就应运而生了。协议的介绍可以参考 UAC规范(USB音频),协议这个东西理论上得多看几遍。才能够理解相关的一些细节。 看协议的过程中一般要经历过
对于需要从事USB开发的程序员来说,熟悉USB描述符是第一步也是很重要的一步。通过这篇文章可以针对描述符有个清楚的认识。USB定义的各种描述符有那些功能
//通过 UsbTreeView 工具查看一款带有UAC功能的音箱中的描述符
---------------------- Device Descriptor ----------------------
bLength : 0x12 (18 bytes)
bDescriptorType : 0x01 (Device Descriptor)
bcdUSB : 0x200 (USB Version 2.00)
bDeviceClass : 0x00 (defined by the interface descriptors)
bDeviceSubClass : 0x00
bDeviceProtocol : 0x00
bMaxPacketSize0 : 0x40 (64 bytes)
idVendor : 0x12D1 (Huawei Technologies Co., Ltd.)
idProduct : 0x0206
bcdDevice : 0x0100
iManufacturer : 0x01 (String Descriptor 1)
Language 0x0409 : "bestechnic"
iProduct : 0x02 (String Descriptor 2)
Language 0x0409 : "HUAWEI Sound Joy"
iSerialNumber : 0x03 (String Descriptor 3)
Language 0x0409 : "20160406.1"
bNumConfigurations : 0x01 (1 Configuration)
Data (HexDump) : 12 01 00 02 00 00 00 40 D1 12 06 02 00 01 01 02 .......@........
03 01 ..
------------------ Configuration Descriptor -------------------
bLength : 0x09 (9 bytes)
bDescriptorType : 0x02 (Configuration Descriptor)
wTotalLength : 0x00E5 (229 bytes)
bNumInterfaces : 0x04 (4 Interfaces)
bConfigurationValue : 0x01 (Configuration 1)
iConfiguration : 0x00 (No String Descriptor)
bmAttributes : 0xA0
D7: Reserved, set 1 : 0x01
D6: Self Powered : 0x00 (no)
D5: Remote Wakeup : 0x01 (yes)
D4..0: Reserved, set 0 : 0x00
MaxPower : 0x32 (100 mA)
Data (HexDump) : 09 02 E5 00 04 01 00 A0 32 09 04 00 00 00 01 01 ........2.......
00 00 0A 24 01 00 01 52 00 02 01 02 0C 24 02 01 ...$...R.....$..
01 02 00 04 0F 00 00 00 11 24 06 02 01 02 03 00 .........$......
00 00 00 00 00 00 00 00 00 09 24 03 03 01 01 00 ..........$.....
02 00 0C 24 02 04 01 01 00 02 03 00 00 00 0D 24 ...$...........$
06 05 04 02 03 00 00 00 00 00 00 09 24 03 06 01 ............$...
03 00 05 00 09 04 01 00 00 01 02 00 00 09 04 01 ................
01 01 01 02 00 00 07 24 01 03 00 01 00 0B 24 02 .......$......$.
01 04 02 10 01 80 3E 00 09 05 83 0D 80 00 01 00 ......>.........
00 07 25 01 00 00 00 00 09 04 02 00 00 01 02 00 ..%.............
00 09 04 02 01 01 01 02 00 00 07 24 01 04 00 01 ...........$....
00 0B 24 02 01 02 02 10 01 80 BB 00 09 05 03 0D ..$.............
C0 00 01 00 00 07 25 01 00 00 00 00 09 04 03 00 ......%.........
01 03 00 00 00 09 21 11 01 00 01 22 4B 00 07 05 ......!...."K...
84 03 03 00 04 .....
---------------- Interface Descriptor -----------------
bLength : 0x09 (9 bytes)
bDescriptorType : 0x04 (Interface Descriptor)
bInterfaceNumber : 0x00
bAlternateSetting : 0x00
bNumEndpoints : 0x00 (Default Control Pipe only)
bInterfaceClass : 0x01 (Audio)
bInterfaceSubClass : 0x01 (Audio Control)
bInterfaceProtocol : 0x00
iInterface : 0x00 (No String Descriptor)
Data (HexDump) : 09 04 00 00 00 01 01 00 00 .........
//TODO