USB音频设备UAC数据同步方式
2021-12-19
3426
1
对于USB扬声器,USB主机负载发送音频数据,而USB设备负责接收来自主机发送过来的数据,数据的传输方式采用的是同步方式。由于USB主机和USB设备时钟同步的问题,会有一定的偏差,长时间的累积会导致主机和设备之间数据的不同步。如USB主机可能会发送数据相对USB设备播放数据过快,导致USB设备来不及接收数据,会产生噪音;也可能由于USB主机发送数据过慢,导致USB设备没有数据播放,导致数据不连惯。
针对这两种情况UAC音频设备与主机之间的数据需要同步,大概有以下几种:
同步式式
- USB设备根据缓冲区里剩余空间的大小,动态调整自己的时钟频率,使USB主机和USB设备双方产生和消耗数据的速度一致,这种方式称为同步方式。这种方式由USB设备来进行调整。
同步方式的端点描述如下:
----------------- Endpoint Descriptor -----------------
bLength : 0x09 (9 bytes)
bDescriptorType : 0x05 (Endpoint Descriptor)
bEndpointAddress : 0x01 (Direction=OUT EndpointID=1)
bmAttributes : 0x0D (TransferType=Isochronous SyncType=Synchronous EndpointType=Data)
wMaxPacketSize : 0x00C0 (192 bytes)
bInterval : 0x01 (1 ms)
bRefresh : 0x00
bSynchAddress : 0x00
Data (HexDump) : 09 05 01 0D C0 00 01 00 00 .........
----------- Audio Data Endpoint Descriptor ------------
bLength : 0x07 (7 bytes)
bDescriptorType : 0x25 (Audio Endpoint Descriptor)
bDescriptorSubtype : 0x01 (General)
bmAttributes : 0x01
D0 : Sampling Freq : 0x01 (supported)
D1 : Pitch : 0x00 (not supported)
D6..2: Reserved : 0x00
D7 : MaxPacketsOnly : 0x00 (no)
bLockDelayUnits : 0x01 (Milliseconds)
wLockDelay : 0x0001 (1 ms)
Data (HexDump) : 07 25 01 01 01 01 00
异步方式
- 另一种方式由USB主机来调整,即USB设备通过一个反馈端点(FeedBack Endpoint)通知USB主机调整音频流的发送速度,使USB主机和USB设备双方发送和接收数据的速度一致。这种方式称为异步方式。
异步方式端点描述如下:
/******************************* Audio Speaker OUT ENDPOINT descriptor: 0x05 *******************************/
//播放端点描述符
0x09, //Length
0x05, //DescriptorType:endpoint descriptor
0x01, //EndpointAddress:Output endpoint 01
0x01 | 0x04, //Attributes:0x05,Isochronous,Synchronization Type(Asynchronous).........
AUDIO_PACKET_SZE(AUDIO_OUT_PACKET),
0x01, //Interval AUDIO_OUT_PACKET
0x00, //没有使用
0x81, //这个值是反馈端点的端点号 bSynchAddress:同步端点的地址
/**************** Audio Class Specific ENDPOINT Descriptor: 0x25 0x01**************/
0x07, //Length
0x25, //DescriptorType:audio endpoint descriptor
0x01, //DescriptorSubType:audio endpiont general
0x00, //Attributes:0x00.............
0x00, //LockDelayUnits
0x00,
0x00, //LockDelay
//反馈端点描述符
/*********** Audio feedback IN ENDPOINT descriptor: 0x05 *******************************/
0x09, /* bLength */
0x05, /* bDescriptorType */
AUDIO_FEEDBACK_EP,
0x01 | 0x04 | 0x10, /* Types -
Transfer: ISOCHRONOUS
Sync: Async
Usage: Feedback EP */
0x04, /* wMaxPacketSize */
0x00, /* wMaxPacketSize */
0x03, /* interval polling(2^x ms) */
0x05, //这个字节也是有用的,好像是控制时间的。
0x00,
反馈端点示例内容来自: USB开发——-实现USB Audio 带Feedback端点,录音播放
自适应方式Adaptive
- 还有一种方式叫做适配模式。
对于扬声器类型:
----------------- Endpoint Descriptor -----------------
bLength : 0x09 (9 bytes)
bDescriptorType : 0x05 (Endpoint Descriptor)
bEndpointAddress : 0x02 (Direction=OUT EndpointID=2)
bmAttributes : 0x09 (TransferType=Isochronous SyncType=Adaptive EndpointType=Data)
wMaxPacketSize : 0x00C0 (192 bytes)
bInterval : 0x01 (1 ms)
bRefresh : 0x00
bSynchAddress : 0x00
Data (HexDump) : 09 05 02 09 C0 00 01 00 00 .........
----------- Audio Data Endpoint Descriptor ------------
bLength : 0x07 (7 bytes)
bDescriptorType : 0x25 (Audio Endpoint Descriptor)
bDescriptorSubtype : 0x01 (General)
bmAttributes : 0x01
D0 : Sampling Freq : 0x01 (supported)
D1 : Pitch : 0x00 (not supported)
D6..2: Reserved : 0x00
D7 : MaxPacketsOnly : 0x00 (no)
bLockDelayUnits : 0x01 (Milliseconds)
wLockDelay : 0x0001 (1 ms)
Data (HexDump) : 07 25 01 01 01 01 00 .%.....
对于麦克风类型:
------- Audio Streaming Format Type Descriptor --------
bLength : 0x0E (14 bytes)
bDescriptorType : 0x24 (Audio Interface Descriptor)
bDescriptorSubtype : 0x02 (Format Type)
bFormatType : 0x01 (FORMAT_TYPE_I)
bNrChannels : 0x01 (1 channel)
bSubframeSize : 0x02 (2 bytes per subframe)
bBitResolution : 0x10 (16 bits per sample)
bSamFreqType : 0x02 (supports 2 sample frequencies)
tSamFreq[1] : 0x0BB80 (48000 Hz)
tSamFreq[2] : 0x0AC44 (44100 Hz)
Data (HexDump) : 0E 24 02 01 01 02 10 02 80 BB 00 44 AC 00 .$.........D..
----------------- Endpoint Descriptor -----------------
bLength : 0x09 (9 bytes)
bDescriptorType : 0x05 (Endpoint Descriptor)
bEndpointAddress : 0x82 (Direction=IN EndpointID=2)
bmAttributes : 0x09 (TransferType=Isochronous SyncType=Adaptive EndpointType=Data)
wMaxPacketSize : 0x0064 (100 bytes)
bInterval : 0x01 (1 ms)
bRefresh : 0x00
bSynchAddress : 0x00
Data (HexDump) : 09 05 82 09 64 00 01 00 00 ....d....
----------- Audio Data Endpoint Descriptor ------------
bLength : 0x07 (7 bytes)
bDescriptorType : 0x25 (Audio Endpoint Descriptor)
bDescriptorSubtype : 0x01 (General)
bmAttributes : 0x01
D0 : Sampling Freq : 0x01 (supported)
D1 : Pitch : 0x00 (not supported)
D6..2: Reserved : 0x00
D7 : MaxPacketsOnly : 0x00 (no)
bLockDelayUnits : 0x00 (Undefined)
wLockDelay : 0x0000
Data (HexDump) : 07 25 01 01 00 00 00 .%.....
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936