前面我们分享了很多UAC的实例,包括描述符实例和描述符拓扑结构。之前的实例都是单采样率的,UAC支持多采样率,HOST可以选择指定采样率进行传输。我们在原来的基础上修改支持多采样率,介绍对应的描述符和请求,以及测试抓包。
注:UAC1.0和UAC2.0多采样率的实现差异较大,这里以UAC1.0为例,UAC2.0可以参考规格书。
首先需要修改Format Type Descriptor这里以 Type I Format Type Descriptor 为例
描述符参考
frmts10.pdf P10 Table 2-1: Type I Format Type Descriptor
bSamFreqType 字段决定了后面采样率数据的存放方式,如果是0则后面紧接着提供一个最低采样率,一个最高采样率
如果是不是0则代表后面有多少个采样率的数据,一个数据3字节
比如我们这里在原来的基础上,增加一个采样率支持8k和16k,这样描述符长度由11变为14。
注意配置描述符的长度也要相应修改.
SPK
/*
* BasicAudioDevice-10.pdf P32 Table 5-16: Mono Headphone Type I Format Type Descriptor
*/
0x0E, /* bLength */
0x24, /* bDescriptorType 见audio10.pdf P99 Table A-4: Audio Class-specific Descriptor Types CS_INTERFACE=0x24 */
0x02, /* bDescriptorSubtype 见audio10.pdf P100 Table A-6: Audio Class-Specific AS Interface Descriptor Subtypes FORMAT_TYPE=0x02 */
0x01, /* bFormatType 见frmts10.pdf P20 Table A-4: Format Type Codes FORMAT_TYPE_I=0x01 */
UAC_SPK_CH, /* bNrChannels One channel. */
(UAC_SPK_BIT_RES/8)*UAC_SPK_CH, /* bSubFrameSize Two bytes per audio subframe. */
UAC_SPK_BIT_RES, /* bBitResolution 16 bits per sample */
0x02, /* bSamFreqType One frequency supported. */
UVC_MAKE_U24(UAC_SPK_SAMP_REQ1), /* tSamFreq */
UVC_MAKE_U24(UAC_SPK_SAMP_REQ2), /* tSamFreq */
MIC
/*
* BasicAudioDevice-10.pdf P32 Table 5-16: Mono Headphone Type I Format Type Descriptor
*/
0x0E, /* bLength */
0x24, /* bDescriptorType 见audio10.pdf P99 Table A-4: Audio Class-specific Descriptor Types CS_INTERFACE=0x24 */
0x02, /* bDescriptorSubtype 见audio10.pdf P100 Table A-6: Audio Class-Specific AS Interface Descriptor Subtypes FORMAT_TYPE=0x02 */
0x01, /* bFormatType 见frmts10.pdf P20 Table A-4: Format Type Codes FORMAT_TYPE_I=0x01 */
UAC_MIC_CH, /* bNrChannels One channel. */
(UAC_MIC_BIT_RES/8)*UAC_MIC_CH, /* bSubFrameSize Two bytes per audio subframe. */
UAC_MIC_BIT_RES, /* bBitResolution 16 bits per sample */
0x02, /* bSamFreqType One frequency supported. */
UVC_MAKE_U24(UAC_MIC_SAMP_REQ1), /* tSamFreq */
UVC_MAKE_U24(UAC_MIC_SAMP_REQ2), /* tSamFreq */
除此之外还要在Audio Data Endpoint Descriptor中说明支持采样率可配的请求
描述符见audio10.pdf P62 Table 4-21: Class-Specific AS Isochronous Audio Data Endpoint Descriptor
bmAttributes的bit0为1表示支持采样率可配置
描述符如下
SPK
/*
* BasicAudioDevice-10.pdf P33 Table 5-20: Headphone Class-specific Isoc. Audio Data Endpoint Descriptor
*/
0x07, /* bLength */
0x25, /* bDescriptorType 见audio10.pdf P99 Table A-4: Audio Class-specific Descriptor Types CS_ENDPOINT=0x25 */
0x01, /* bDescriptorSubtype 见audio10.pdf P101 Table A-8: Audio Class-Specific Endpoint Descriptor Subtypes EP_GENERAL=0x01. */
0x01, /* bmAttributes D0: Sampling Frequency D1: Pitch D7: MaxPacketsOnly */
0x00, /* bLockDelayUnits */
0x00, 0x00, /* wLockDelay */
MIC
/*
* BasicAudioDevice-10.pdf P33 Table 5-20: Headphone Class-specific Isoc. Audio Data Endpoint Descriptor
*/
0x07, /* bLength */
0x25, /* bDescriptorType 见audio10.pdf P99 Table A-4: Audio Class-specific Descriptor Types CS_ENDPOINT=0x25 */
0x01, /* bDescriptorSubtype 见audio10.pdf P101 Table A-8: Audio Class-Specific Endpoint Descriptor Subtypes EP_GENERAL=0x01. */
0x01, /* bmAttributes D0: Sampling Frequency D1: Pitch D7: MaxPacketsOnly */
0x00, /* bLockDelayUnits */
0x00, 0x00, /* wLockDelay */
参加audio10.pdf P96 5.2.3.2.3.1 Sampling Frequency Control
通过SET和GET请求设置和获取采样率设置值
请求是针对端点的。
所以bmRequestType的b[4:0]为2, b[6:5]为1
wIndex的低字节代表端点地址
bRequest代表GET_XX或者SET_XX
wValue的高字节代表CS,这里是SAMPLING_FREQ_CONTROL=0x01
PC端声音设置,可以看到有两个采样率,可以切换
扬声器设置
麦克风设置
抓包如下
麦克风 的0x82端点
22 01 00 01 82 00 03 00设置值为
0x001F40即8000
麦克风 的0x82端点
22 01 00 01 82 00 03 00设置值为
0x003E80即16000
扬声器 的0x02端点
22 01 00 01 02 00 03 00设置值为
0x001F0即8000
扬声器 的0x02端点
22 01 00 01 02 00 03 00设置值为
0x003E80即16000
由于端点bInterval都是设置为4,即1ms发一包, 对于高速是(2^(4-1)=8个微帧,即8*125uS=1ms)。所以HOST自动根据采样率设置一包发送的大小。
16k采样率,单通道,16位就是 16*(16/2)*1=32字节/mS即32字节/包。
8k采样率,单通道,16位就是 8*(16/2)*1=16字节/mS即16字节/包。
以上分享了UAC多采样率支持的相关描述符和请求,以及实测,可以作为参考。