如何通过 USB 树中的物理位置命名 Pulseaudio USB 设备?

如何通过 USB 树中的物理位置命名 Pulseaudio USB 设备?

在这个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

相关内容