在这个2016 年的邮件列表帖子,一位 Pulseaudio 用户询问如何为可能具有相同供应商和序列号的不同 USB 音频卡分配稳定名称。
他在 GitHub 上发布了他的解决方案;它基于根据卡的设备路径为每个卡添加 Udev 行。
我正在尝试修改此解决方案,以便我可以在不更改 Udev 规则的情况下添加新卡。
我注意到 Udev 已经给了我两个变量,如果我将它们连接起来,可以用来为卡构造一个稳定的名称。这ID_ID
似乎是 Pulseaudio 选择的接收器名称的基础,同时ID_PATH_TAG
包含 USB 集线器的端口号,这就是我想要附加到名称中的内容:
$ (sleep 1; sudo udevadm trigger -s sound -c remove ; \
sudo udevadm trigger -s sound -c add) &; \
udevadm monitor --subsystem=sound -p | grep -P 'ID_ID|ID_PATH_TAG'
ID_PATH_TAG=pci-0000_06_00_3-usb-0_3_4_1_1_0
ID_ID=usb-C-Media_Electronics_Inc._USB_Audio_Device-00
... (some repeats)
如何创建一个 Udev 规则,通过组合这两个变量来生成 Pulseaudio 设备名称?
答案1
这就是我想出的:
$ cat /etc/udev/rules.d/99-usb-audio.rules
ACTION=="change", SUBSYSTEM=="sound", DEVPATH=="/devices/*/usb*/sound/card?", ENV{PULSE_NAME}="$env{ID_ID}.$env{ID_PATH_TAG}"
99 很重要,因为ID_PATH_TAG
它是由较早的规则设置的(我不确定是哪一个);使用较低的数字导致我最初的尝试失败。
现在接收器名称包含ID_PATH_TAG
通过物理位置标识卡的:
$ pactl list sinks | grep Name
Name: alsa_output.usb-C-Media_Electronics_Inc._USB_Audio_Device-00.pci-0000_06_00_3-usb-0_2_4_2_1_1_0.analog-stereo
Name: alsa_output.usb-C-Media_Electronics_Inc._USB_Audio_Device-00.pci-0000_06_00_3-usb-0_2_4_2_3_1_0.analog-stereo
该位置被编码在子字符串中:
usb-0_2_4_2_1_1_0
usb-0_2_4_2_3_1_0
这显然意味着我的笔记本电脑上的端口 2 插入了一个 USB 集线器;另一个集线器插入该集线器的端口 4;将第三个集线器插入第二个集线器的端口 2。音频设备插入最后一个集线器的端口 1 和 3。我不确定“-0_”前缀或“_1_0”后缀。
$ lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
|__ Port 2: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 4: Dev 4, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 2: Dev 26, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 3: Dev 28, If 0, Class=Audio, Driver=snd-usb-audio, 12M
|__ Port 1: Dev 27, If 0, Class=Audio, Driver=snd-usb-audio, 12M