使用pyusb控制STM32复合USB设备音频流的可行性及验证方法咨询
问题解答
核心结论
解绑内核驱动后可以通过pyusb控制音频流传输,但无法直接使用Audacity验证控制效果,具体说明和可行方案如下:
pyusb控制音频流的实现说明
你把内核USB Audio Class(UAC)驱动解绑后,原本内核占用的UAC接口控制权就释放到了用户态,只要补充必要步骤就可以通过pyusb实现音频流控制:
- 你当前使用的解绑代码可以正常运行:
注意这段代码会解绑设备所有接口的内核驱动,如果你这个复合设备还有其他需要用到系统驱动的接口,建议加判断逻辑,仅解绑UAC对应的接口即可。dev = usb.core.find(idVendor=1155, idProduct=22362) c = 1 for config in dev: for i in range(config.bNumInterfaces): if dev.is_kernel_driver_active(i): dev.detach_kernel_driver(i) print (i) c+=1 - 解绑后需要补充两个必要操作才能正常访问设备:
- 调用
dev.set_configuration()选择设备的目标配置 - 调用
usb.util.claim_interface(interface_number)声明对应UAC接口的控制权
- 调用
- 完成配置后直接通过pyusb读写UAC接口对应的同步(ISO)传输端点,自行实现UAC协议的流控逻辑,包括采样率匹配、数据包长度控制、同步反馈处理,即可完成音频输入/输出的流传输。
- 额外注意:UAC使用的同步传输在不同平台的pyusb后端支持度有差异,Linux下只要有root权限即可正常使用,Windows下需要先将设备的驱动替换为WinUSB,MacOS需要提前配置好设备访问权限。
无法直接用Audacity验证的原因
Audacity是调用系统内置的音频API(比如Linux的ALSA、Windows的WinMM、MacOS的CoreAudio)来枚举可用音频设备的,你解绑了内核UAC驱动后,该设备会从系统的音频设备列表中消失,Audacity无法直接识别到该设备,也就没法直接抓取/播放设备的音频流。
替代验证方案
如果需要用Audacity验证pyusb的控制效果,可以采用以下两种方案:
- 方案1:编写用户态虚拟音频设备驱动,将pyusb接收/发送的音频数据转发到虚拟音频设备上,Audacity可以直接对这个虚拟设备进行录制/播放操作,验证效果。
- 方案2:如果只是做功能验证,可以先把pyusb从设备读取到的音频数据存储为标准WAV格式文件,再用Audacity打开文件验证采样率、音质、声道数等参数是否符合预期;发送音频时可以先用Audacity导出WAV文件,再用pyusb读取文件内容发送给USB设备,通过外接耳机/音箱验证输出效果。
内容的提问来源于stack exchange,提问作者Thilak
相关产品推荐
相关产品推荐

