UAC开发调试笔记
+ -

Windows虚拟UAC麦克风增加特性单元的开发调试笔记

2021-08-06 1519 1

昨晚突然接到通知,需要增加对UAC麦克风设备音量增益的控制。
AC麦克风设备音量增益的控制

我努力地回忆了去年12月份自己粗略地整理的UAC规范,发布于http://www.usbzh.com/article/forum-1.html
想着今天完成应该是美好的周五,会心满意足地完成工作,然后美美地打卡下班。可没想到就这么一个简单的东西(想着UVC的各种单元都可以轻松完成,你UAC还不手到擒来),可没想到实际在操作过程中差一点就闪了我的老腰…

在UAC的音频控制类有一个UAC 特性单元描述符,该描述符用于描述特性单元的功能,如常见的静音、音量大小等,详情见本人总结的特性单元描述符一节的bmaControls字节段描述。
该特性描述符由于是对音频特性的控制,所以在音频的拓扑结构中应位于输入终端和输出终端之间。
拓扑结构

增加了描述符后,再后再增加其对应的特定类请求,类似这样的代码:


    PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
    if (irpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_INTERNAL_USB_SUBMIT_URB)
    {
        PURB  Urb = (PURB)irpStack->Parameters.Others.Argument1;
        if (Urb->UrbHeader.Function == URB_FUNCTION_CLASS_INTERFACE)
        {
            //在这里根据过滤特性单元ID进行特性类请求相关代码的实现
        }
    }

特定类的请求一般包括SET_CUR,GET_CUR,GET_MIN,GET_MAX,GET_RES,GET_LEN,GET_IN,GET_DEF
特定类请求不了解的同学可以参见以下网址:

关于该特性单元的选择子由于这里只设置音量的大小,所以选择子只有VOLUME_CONTROL。

关于该选择子的解释可详见:http://www.usbzh.com/article/detail-249.html

实现以上的代码,可能只需要几分钟,如果代码正常,应该分分钟调试完成。可实际上我是调试了一个上午外加下午一个小时。现象是只要我增加了特性单元描述符,Windows设备管理器中枚举出的设备显示设备启动失败,原因是找不到对象。
很粗略的解释,我的理解应该是这个对象应该就是特性单元,但我左看右看上看下看我的拓年结构配置没有问题啊,为什么会出现这种情况了。

开始怀疑人生了…
开始怀疑自己对UAC的认识了…
喵喵喵…
气死我了…

一翻波折,终于在单步调试的时候发现UA控制单元头的长度感觉有点不对,进而最后再查原来是特性单元的描述符的长度设置错误了:

PUSB_AUDIO_CONTROL_FEATURE_DESCRIPTOR pAudioControlDesc = (PUSB_AUDIO_CONTROL_FEATURE_DESCRIPTOR)((char*)pACITDesc + pACITDesc->bLength);
pAudioControlDesc->bControlSize = 9; //本该设置的是length,怎么奈写成了bControlSize
pAudioControlDesc->bDescriptorType = 0x24;//AUDIO INTERFACE DESCRIPTOR
pAudioControlDesc->bDescriptorSubtype = 6;//Feature unit
pAudioControlDesc->bUnitID = 0x0a;
pAudioControlDesc->bSourceID = 1;
pAudioControlDesc->bControlSize = 1;
pAudioControlDesc->bmaControls[0] = 0x02;//main channel
pAudioControlDesc->bmaControls[1] = 0x00;// other channel
pAudioControlDesc->iFeature = 0;//no string

描述符的定义如下:

typedef struct _USB_AUDIO_CONTROL_FEATURE_DESCRIPTOR
{
    UINT8 bLength;
    UINT8 bDescriptorType;
    UINT8 bDescriptorSubtype;
    UINT8 bUnitID;
    UINT8 bSourceID;
    UINT8 bControlSize;
    UINT8 bmaControls[2];  //0为主通道,后续依次为各逻辑通道
    UINT8 iFeature;
}USB_AUDIO_CONTROL_FEATURE_DESCRIPTOR;
HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

USB-UAC麦克风 音频控制接口
音频控制接口描述符描述了设备的结构(拓扑结构),并通过特定类请求对音频的控制。UAC麦克风 音频控制接口描述符偏移地址字段长度值描述0bLength10x09接口描术符的长度1bDescriptorType10x04描述符的类型接口描述符2bInterfaceNumber10x00接口ID号3bA......
USB-UAC麦克风 配置描述符
UAC麦克风采用的配置描述符结构和USB配置描述符的结构一致.偏移地址字段长度值描述0bLength10x09配置描述符的长度1bDescriptorType10x02描述符类型,配置描述符类型2wTotalLength20x0064配置描述符的总长度(包括后续的UAC音频控制和UAC音频流接口描述......
华为UAC麦克风的工作过程数据分析
看完了耳机的数据分析,再来分析麦克风,就相对来说很简单了,这是因为:第一:麦克风没有音频控制特效单元描述符,所以少了很多特定类请求。第二:麦克风只有一个音频流转换接口,且只支持采样率为48000HZ 16位。具体的过程见下:Length Phase Data-------- --......
UAC 特性单元控制请求
特性单元控制请求对应于音频特性单元描述符。特性单元控制请求支持的选择子Control SelectorValueFU_CONTROL_UNDEFINED0x00MUTE_CONTROL0x01VOLUME_CONTROL0x02BASS_CONTROL0x03MID_CONTROL0x04TREBL......
USB-UAC麦克风 功能简介
这里描述的设备是一个USB麦克风。这是一个非常简单的设备,没有音频控制合并等其它功能。它通过音频流接口向主机提供单声道音频数据流。这个使用的音频数据格式是16位8KHz PCM。同步类型为异步源。它使用内部时钟作为参考源。本章要介绍的是UAC1.0规范附录B自带的USB麦克风的内容。从拓年图上可以看......
USB-UAC麦克风 字符串描述符
偏移地址字段长度值描述0bLength10x18描述符长度1bDescriptorType10x03描述符类型:字符串描述符2bString10x00540x00480x00450x00200x00430x004F0x004D0x00500x00410x004E0x0059“THE COMPANY”......
USB通用父驱动usbccgp.sys的过滤UVC摄像头、UAC麦克风和HID设备硬件ID
激动的心情,无溢言表。。虽然只是一个很简单的东西。。但相于折腾了这么久,还是很开心的了。最近有个需求,功能是这样的:有一个USB复合设备,连接到windows系统中它在windows下的设备树如下:USB Composite Device(usbccgp.sys)UVC CameraUAC ......
USB-UAC麦克风 音频流接口
音频流接口有2个转换接口。UAC麦克风 零带宽转换接口转换接口0是零带宽设置,用于在麦克风未使用。这是通电后的默认设置。实现了零带宽通过指定接口的此备用设置没有与之关联的端点(bNumEndpoints=0)。偏移地址字段长度值描述0bLength10x091bDescriptorType10x04......
UVC 静止图像触发控制
静止图像触发控制通知设备开始通过相关的同步或大容量管道发送静态图像数据。专用的静态图像大容量管道仅用于静态图像捕获的方法3。此控制只能在流式传输时设置,并且在发送静态图像后,硬件应将其重置为“正常操作”模式。仅当设备支持静态图像检索的方法2或方法3时,才需要此控件。控制选择子VS_STILL_IMA......
UAC 特性单元描述符
UAC特性单元描述符即Feature Unit Descriptor,用于描述音频的控制特性,用bmaControls字段的各bit描述各通道支持的特性。特性单元描述符结构定义UAC1.0和UAC2.0的结构定义一样。 UINT8 bLength; UINT8 bDescriptorTyp......
USB-UAC麦克风 设备描述符
UAC麦克风采用的设备描述符结构和USB设备描述符的结构一致,只是有些字段的值有所要求。偏移地址字段长度值描述0bLength10x12设备描述符的总和长度1bDescriptorType10x01设备描述符类型2bcdUSB 20x01001.00使用的USB版本号4bDeviceClass10x......
UAC麦克风拓扑图
UAC麦克风是UAC规范中的USB音频输入设备,它的拓扑图如下:可以看到,在UAC域内,这个拓扑图是一个最简单的UAC麦克风拓扑图,只包括一个输入终端和一个输出终端,输入终端对应的是拾音端,而输出终端将最终的音频数据打包通过USB端点传输给主机。当然,不管是不是最简单的麦克风,最基本的东西都是......
UAC麦克风设备描述符
所有的USB设备第一个要设计的描述符基本都是设备描述符。这里的UAC音频设备描述符数据配置如下:结构体定义如下:/* USB_DT_DEVICE: Device descriptor */struct usb_device_descriptor { __u8 bLength; ......
UAC麦克风配置描述符
配置描述符包含了设备的配置信息,随配置描述符一起返回给主机的其它描述符代表了该设备的特性。UAC麦克风配置描述符的数据配置如下:数据结构定义如下:struct usb_config_descriptor { __u8 bLength; __u8 bDescriptorType; ......
UAC麦克风音频控制的接口描述符
UAC麦克风包含一个音频控制接口,其以接口描述符为起始描述符。描述符的关系如下:接口描述符 //音频控制接口类特定音频流接口描述符输入终端描棕符输出终端描述符接口描述符的内容详见:USB接口描述符 http://www.usbzh.com/article/detail-64.ht......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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