如何从ALSA USB音频设备句柄获取USB设备文件路径?
开发Focusrite Scarlett USB音频设备管理工具的问题
我正在Linux平台上用Rust开发一套用于管理Focusrite Scarlett USB音频设备的库/CLI/UI工具。这类设备包含大量内部设置(我的18i8型号有近300项独立控制项),因此工具需要覆盖所有设置,方便用户修改路由配置、输入/输出/混音增益、静音开关等。
幸运的是,通过简单的modprobe配置和较新版本的内核,Linux已支持这类设备:
/etc/modprobe.d/scarlett.conf:
options snd_usb_audio vid=0x1235 pid=0x8214 device_setup=1
针对不同型号及可能的硬件大版本,需修改上述值中的USB产品ID以启用对应设备的支持。
我研究ALSA API已有数周,有以下几点收获:
- 已有开发者用C语言编写了一款Scarlett设备的GTK4 UI工具,我通读了其代码库,理清了实现逻辑及所用的ALSA API。
- ALSA文档质量极差,项目完成后我会撰写博客分享经验、解释细节,并尝试为ALSA文档做贡献,节省他人时间。
- ALSA用户空间库通常只是内核系统调用的typedef,像
snd_ctl_t、snd_hctl_t和snd_mixer_t这类API在用户空间几乎没有实际代码。所有结构体都是不透明的,需通过结构体引用调用函数(系统调用)获取细节,内存由内核处理后返回给用户空间。 - 已有开发者将大部分ALSA API移植到了Rust,我也会为该项目贡献文档帮助他人。
目前我遇到了一个问题:我可以列出并遍历ALSA设备,通过snd_ctl_card_info_t获取以下有用属性:
name: Scarlett 18i8 USBid: USBlongname: Focusrite Scarlett 18i8 USB at usb-0000:00:14.0-2.2, high speedmixername: USB Mixercomponents: USB1235:8214driver: USB-Audio
但这些似乎是现有API能获取的全部信息。我可以从components字段提取USB厂商/产品ID来确定型号,也可以尝试解析longname获取实际USB句柄,但存在以下问题:
- 可能连接多个相同USB厂商/产品ID的设备:这是串联设备扩展输入/输出的常用方法。
- 提取
usb-*标识及USB厂商/产品ID的方式稳定性存疑,这些内容可能随内核版本变更而失效。 - 我需要唯一识别每个设备,最好通过序列号,避免将A设备(18i8)的配置误应用到B设备(18i8)上,而USB设备本身应该包含序列号字段。
因此,**是否存在Linux API可以从某类ALSA句柄获取USB设备文件路径?**或者,我是否遗漏了什么方法可以直接从ALSA API获取序列号?
编辑:我可以通过lsusb命令找到序列号,字段名为iSerial:
$ sudo lsusb -d 1235:8214 -vv | grep iSerial iSerial 2 4K1A0P443EPEW7
似乎需要以root身份才能获取该字段的实际值,但我可以通过在udev规则中为用户授予设备权限来解决这个问题。如果能从ALSA API获取稳定的USB设备路径,我就可以使用libusb或其他API提取iSerial字段。
内容的提问来源于Stack Exchange,提问作者Naftuli Kay
相关产品推荐
相关产品推荐

