UAC开发调试笔记
+ -

华为USB耳机UAC音量及静音控制实例分析

2022-12-28 61 0

手中的华为耳机是一个复合设备,使用的是USB Composite Device(usbccgp.sys)来驱动。复合的设备为音频设备和HID设备,其中音频设备又使用UAC规范复合了一个麦克风和耳机。
设备管理器中如下:
设备管理器中华为耳机

使用USBTreeViewer分析其配置描述符其内容如下:


        ------- 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               .$..........

        -------- Audio Control Feature Unit Descriptor --------
bLength                  : 0x0D (13 bytes)
bDescriptorType          : 0x24 (Audio Interface Descriptor)
bDescriptorSubtype       : 0x06 (Feature Unit)
bUnitID                  : 0x02 (2)
bSourceID                : 0x01 (1)
bControlSize             : 0x02 (2 bytes per control)
bmaControls[0]           : 0x03, 0x00
 D0: Mute                : 1
 D1: Volume              : 1
 D2: Bass                : 0
 D3: Mid                 : 0
 D4: Treble              : 0
 D5: Graphic Equalizer   : 0
 D6: Automatic Gain      : 0
 D7: Delay               : 0
 D8: Bass Boost          : 0
 D9: Loudness            : 0
 D10: Reserved           : 0
 D11: Reserved           : 0
 D12: Reserved           : 0
 D13: Reserved           : 0
 D14: Reserved           : 0
 D15: Reserved           : 0
bmaControls[1]           : 0x00, 0x00
 D0: Mute                : 0
 D1: Volume              : 0
 D2: Bass                : 0
 D3: Mid                 : 0
 D4: Treble              : 0
 D5: Graphic Equalizer   : 0
 D6: Automatic Gain      : 0
 D7: Delay               : 0
 D8: Bass Boost          : 0
 D9: Loudness            : 0
 D10: Reserved           : 0
 D11: Reserved           : 0
 D12: Reserved           : 0
 D13: Reserved           : 0
 D14: Reserved           : 0
 D15: Reserved           : 0
bmaControls[2]           : 0x00, 0x00
 D0: Mute                : 0
 D1: Volume              : 0
 D2: Bass                : 0
 D3: Mid                 : 0
 D4: Treble              : 0
 D5: Graphic Equalizer   : 0
 D6: Automatic Gain      : 0
 D7: Delay               : 0
 D8: Bass Boost          : 0
 D9: Loudness            : 0
 D10: Reserved           : 0
 D11: Reserved           : 0
 D12: Reserved           : 0
 D13: Reserved           : 0
 D14: Reserved           : 0
 D15: Reserved           : 0
iFeature                 : 0x00 (No String Descriptor)
Data (HexDump)           : 0D 24 06 02 01 02 03 00 00 00 00 00 00            .$...........

        ------- Audio Control Output Terminal Descriptor ------
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x24 (Audio Interface Descriptor)
bDescriptorSubtype       : 0x03 (Output Terminal)
bTerminalID              : 0x03
wTerminalType            : 0x0302 (Headphones)
bAssocTerminal           : 0x00 (0)
bSourceID                : 0x02 (2)
iTerminal                : 0x00 (No String Descriptor)
Data (HexDump)           : 09 24 03 03 02 03 00 02 00                        .$.......

UAC拓扑结构如下:
UAC拓扑结构

从拓扑结构可以看到,数据从输入终端到特性终端,最终到输出终端。
其中输入终端的数据来源于系统,即播放音频的应用软件,而输出终端最终为我们的耳机终端。

通过特性描述符我们可以看到,其支持静音和音量调整,这是可以通过UAC的特定类请求SET_CUR,GET_CUR来控制。

当我们把音量调整为0,通过BUSHOUND抓取的包如下:
音量调整为0

 44.0            CTL    21 01 00 02  00 02 02 00   SET CUR        
 44.0         2  OUT    00 d3                      ..             
 44.0            CTL    21 01 00 01  00 02 01 00   SET CUR         
 44.0         1  OUT    01                         .               
 44.0            CTL    01 0b 01 00  02 00 00 00   SET INTERFACE   
 44.0            CTL    22 01 00 01  03 00 03 00   SET CUR         
 44.0         3  OUT    80 bb 00                   ...             
 44.0            CTL    01 0b 00 00  02 00 00 00   SET INTERFACE

音量控制

音量控制是特性描述符支持的,我们可查看其枚举过程获取的最大和最小的值。

44.0            CTL    a1 81 00 02  00 02 02 00   GET CUR 
44.0         2  IN     00 00                      ..      
44.0            CTL    a1 82 00 02  00 02 02 00   GET MIN 
44.0         2  IN     00 d3                      ..      
44.0            CTL    a1 83 00 02  00 02 02 00   GET MAX 
44.0         2  IN     00 00                      ..      
44.0            CTL    a1 84 00 02  00 02 02 00   GET RES 
44.0         2  IN     00 01

当静音为时,其音量为最小值。这里使用的请求:

 44.0            CTL    21 01 00 02  00 02 02 00   SET CUR        
 44.0         2  OUT    00 d3                      ..

其选择子为02,表示VOLUME_CONTROL=2,表求的是音量控制。
音量的值为db,2字节这里内容为 00 d3,其支持的最小值,这与其枚举过时的内容一致。

而当音量设置为最大时:

 44.0            CTL    21 01 00 02  00 02 02 00   SET CUR        
 44.0         2  OUT    b6 ff                      ..         
 44.0            CTL    21 01 00 02  00 02 02 00   SET CUR        
 44.0         2  OUT    00 00                      ..

其值为00 00。

静音MUTE

通过UAC 特性单元控制请求:https://www.usbzh.com/article/detail-249.html 一文,参照特定类清求可知:

 44.0            CTL    21 01 00 01  00 02 01 00   SET CUR         
 44.0         1  OUT    01                         .

这其实就是使用的选择子为1,即MUTE_CONTROL,而unitid=2表示的是特类描描述符。
其数据长度为1,而内容是否静音为1,表示静音。

设备的打开与关闭

另外,我们在调整音量时,发现有设备的打开与关闭:

 44.0            CTL    01 0b 01 00  02 00 00 00   SET INTERFACE   
 44.0            CTL    22 01 00 01  03 00 03 00   SET CUR         
 44.0         3  OUT    80 bb 00                   ...             
 44.0            CTL    01 0b 00 00  02 00 00 00   SET INTERFACE

其中

 44.0            CTL    01 0b 01 00  02 00 00 00   SET INTERFACE

是选择耳机的接口SET_INTERFACE

0x01,        // bmRequestType: Dir: H2D, Type: Standard, Recipient: Interface
0x0B,        // bRequest (Set Interface)
0x01, 0x00,  // wValue Alt Setting: 1
0x02, 0x00,  // wIndex Interface: 2
0x00, 0x00,  // wLength = 0

然后是设置采样率:

 44.0            CTL    22 01 00 01  03 00 03 00   SET CUR         
 44.0         3  OUT    80 bb 00                   ...

UAC音频流端点控制请求https://www.usbzh.com/article/detail-216.html ,其选择子为SAMPLING_FREQ_CONTROL=0x01,端点为0x03,输出端点。

        ----------------- Endpoint Descriptor -----------------
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x05 (Endpoint Descriptor)
bEndpointAddress         : 0x03 (Direction=OUT EndpointID=3)
bmAttributes             : 0x0D (TransferType=Isochronous  SyncType=Synchronous  EndpointType=Data)
wMaxPacketSize           : 0x0240 (576 bytes)
bInterval                : 0x01 (1 ms)
bRefresh                 : 0x00
bSynchAddress            : 0x00
Data (HexDump)           : 09 05 03 0D 40 02 01 00 00                        ....@....

而SET_CUR请求输出有3字节为80 bb 00 ,表示48000采样率。

0 篇笔记 写笔记

USB3.2超高速 USB2.0扩展特性描述符
USB2.0扩展特性描述符是BOS描述符中一个特性描述符。USB2.0扩展特性描述符用于描述工作在USB2.0高速模式下支持LPM的特性。LPM: Link Power Management protocol链路电源管理协议USB2.0扩展特性描述符定义struct _USB20_EXTE......
USB超高速 增强型超高速USB设备特性描述符
增加型超高速USB设备特性描述符适用于USB3.2 GEN2,用于描述符增强型超高速USB设备特性信息。增加型超高速USB设备特性描述符不能通过GET_DESCRIPTOR或SET_DESCRIPTOR访问。增加型超高速USB设备特性描述符定义如下:struct _SUPER_SPEED_PLUS_......
USB3.2超高速 超高速USB设备特性描述符
USB3.2增强型超高速设备应实现,USB设备特性描述符描述符设备的特性信息。超高速USB设备特性描述符不能通过GET_DESCRIPTOR或SET_DESCRIPTOR访问。USB设备特性描述符定义如下:struct _SUPER_SPEED_USB_DEVICE_CAPABILITY_DESCR......
HID音量控制报告描述符
音量控制HID规范提供了两种报告描述符,分别对应按钮式和旋钮式。Up/Down 按钮音量控制下面的示例定义了一对按钮,用于渐变变量,例如音量增大和音量向下按钮。输入设备必须定义为相对设备。–1将减小音量+1将增大音量。0对音量没有影响。UsagePage(Consumer)Usage(Vol......
耳机音量按键HID报告描述符
耳机音量按键在windows的设备管理器中如下:其报告描述符的原始数据为:05 0c 09 01 a1 01 85 01 15 00 25 01 75 01 95 01 09 e9 81 02 09 ea 81 02 09 cd 81 02 09 b5 81 02 09 b6 81......
UAC耳机自带HID调节声音报告描述符
UAC耳机自速的外接按钮实现声音的控制:增加音量也减少音量。设备管理器如下:05 0C //0 GLOBAL_USAGE_PAGE(Consumer) 09 01 //2 LOCAL_USAGE( Consumer Control ) A1 01 /......
HID 音频设备控制(播放、静音、停止)报告描述符
HID 音频设备控制(播放、静音、停止)报告描述符,感谢USB中文网QQ群吴吹水$同学的贡献。05 0C //0 GLOBAL_USAGE_PAGE(Consumer) 09 01 //2 LOCAL_USAGE(Consumer Control) ......
UAC音频设备的音量静音控制及音量百分比对比分析
UAC音频设备通常我们认为是使用了UAC规范的USB音频设备,如USB麦克风,USB扬声器,USB耳机等。使用了UAC规范的音频设备,都是需要对其音量进行控制,如静音,音调大小的调整等。这些都是通过UAC的特性单元来实再的,其支持的音量控制可根据其UAC特性描述符的bmaControls的位掩码来实......
Windows10 x64使用USB虚拟HID设备控制系统音频音量的播放/暂停
搞了一个虚拟的自定义HID通讯,这一般对程序员来说,比较好用,特别是功能开发的。内容详见:http://www.usbzh.com/article/detail-884.html不过在HID的大类中,有一些特定的类如“符合 HID 标准的用户控制设备”,这些由系统负责打开(我们在应用层是无法打开的......
华为USB耳机UAC音量静音控制实例分析
手中的华为耳机是一个复合设备,使用的是USB Composite Device(usbccgp.sys)来驱动。复合的设备为音频设备和HID设备,其中音频设备又使用UAC规范复合了一个麦克风和耳机。设备管理器中如下:使用USBTreeViewer分析其配置描述符其内容如下: --......
作者信息
USB中文网
B站搜索 站长漫谈 看视频。
pnpon内核开发网,USB中文网,
busrom硬核技术网站长
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!