You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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 USB
  • id: USB
  • longname: Focusrite Scarlett 18i8 USB at usb-0000:00:14.0-2.2, high speed
  • mixername: USB Mixer
  • components: USB1235:8214
  • driver: USB-Audio

但这些似乎是现有API能获取的全部信息。我可以从components字段提取USB厂商/产品ID来确定型号,也可以尝试解析longname获取实际USB句柄,但存在以下问题:

  1. 可能连接多个相同USB厂商/产品ID的设备:这是串联设备扩展输入/输出的常用方法。
  2. 提取usb-*标识及USB厂商/产品ID的方式稳定性存疑,这些内容可能随内核版本变更而失效。
  3. 我需要唯一识别每个设备,最好通过序列号,避免将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:02:14