我有 Roland UA-22 (Duo Capture Ex) USB 音频接口,默认情况下,它将两个输入通道显示为单个立体声源。但是,我想将它们分别用作独立的源。
使用这个建议我添加了以下两行来/etc/pulse/default.pa
创建虚拟源:
load-module module-remap-source source_name=UA_22_Input_1 source_properties="device.description='Roland UA-22 Input 1'" master=alsa_input.usb-Roland_UA-22-00.analog-stereo master_channel_map=front-left,front-left channel_map=front-left,front-right
load-module module-remap-source source_name=UA_22_Input_2 source_properties="device.description='Roland UA-22 Input 2'" master=alsa_input.usb-Roland_UA-22-00.analog-stereo master_channel_map=front-right,front-right channel_map=front-left,front-right
当我使用 完全启动后,重新启动 pusleaudio 后,一切正常pulseaudio -k
。但是,当我启动(设备已连接)或拔下并重新插入设备时,虚拟源会消失,并且不会重新创建,直到我再次终止 pulseaudio。
我怀疑这里发生的情况是,在启动时,当 pulseaudio 评估其配置时,声卡尚未得到充分利用,并且在稍后连接接口时不会重新评估它。
有没有一种方法可以让 pulseaudio 在连接音频接口时自动恢复源而不杀死整个东西?
答案1
我不确定这是否会在启动时有所帮助,但对于断开连接和重新连接,您可以尝试使用 udev。我为我的 MOTU M2 这样做,但大概可以针对您的设备进行调整。首先找出 udev 对您的设备的了解。udevadm monitor
在终端中运行并连接您的设备。您应该看到如下一行:
KERNEL[425578.748455] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6 (usb)
(随后还有许多其他人)
复制 /devices/ 路径并运行:
$ udevadm info -ap /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6
looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6':
...
ATTR{product}=="M2"
ATTR{manufacturer}=="MOTU"
...
现在在 /etc/udev/rules.d/ 中创建一个 .rules 文件(您可以将其命名为 99-roland.rules 或类似的名称)。
--- /etc/udev/rules.d/99-motu.rules ---
ACTION=="add", ATTR{manufacturer}=="MOTU", ATTR{product}=="M2", RUN+="/home/marf/self/bin/motu-udev.sh"
显然,您需要更改 ATTR 参数以匹配您发现的内容,udevadm info
并更改脚本位置以匹配您想要放置下一个脚本的位置。
告诉 udev 加载新规则:
sudo udevadm control --reload-rules
在 RUN 参数指向的脚本中,您可以运行 pactl 命令来设置 pulseaudio,以便在设备连接时按照您的需要进行操作。(如果您还需要在断开连接时执行操作,您可以在 udev 配置中使用 ACTION="remove",并根据需要指向其他脚本。)
对于我的设备,不幸的是,它直到 udev 完成后才会出现在 pulseaudio 中,所以我必须生成一个单独的脚本并等待它出现。我不确定这是否特定于我的设备,或者只是因为 pulseaudio 也使用 udev 来添加设备。此外,udev 中的脚本以 root 身份运行,但 pulseaudio 通常以您的非特权用户帐户运行。前几行是为了弄清楚该帐户是什么(这部分我在 Arch wiki 中找到)。以下是我的脚本:
--- motu-udev.sh ---
#! /bin/bash
export PATH=/usr/bin:/bin
USER_NAME=$(who | awk -v vt=tty$(fgconsole) '$0 ~ vt {print $1}')
USER_ID=$(id -u "$USER_NAME")
PULSE_SERVER="unix:/run/user/"$USER_ID"/pulse/native"
/home/marf/self/bin/motu-pulse.sh "$USER_NAME" "$PULSE_SERVER" & disown
--- motu-脉冲.sh ---
#! /bin/sh
USER_NAME="$1"
PULSE_SERVER="$2"
sleep 2
if ! sudo -u "$USER_NAME" pactl --server "$PULSE_SERVER" list modules | grep master=alsa_input.usb-MOTU > /dev/null; then
sudo -u "$USER_NAME" pactl --server "$PULSE_SERVER" load-module module-remap-source master=alsa_input.usb-MOTU_M2_M2MT078C8F-00.analog-stereo master_channel_map=front-left channel_map=mono source_name=MXL-M2 source_properties=device.description=MXL-M2
fi
sudo -u "$USER_NAME" pactl --server "$PULSE_SERVER" set-default-sink alsa_output.usb-MOTU_M2_M2MT078C8F-00.analog-stereo
因此,udev 在设备的 USB 连接上触发,并运行 motu-udev.sh。然后 motu-udev.sh 生成 motu-pulse.sh 并放弃它,以便 udev 可以完成处理(并在 pulseaudio 中实际创建我的设备)。motu-pulse.sh 脚本会休眠一段时间以等待处理完成,然后它会在必要时创建通道映射,并将设备设置为默认输出。(如果您只想将其用作输入设备,则可以省略最后一行)
我发现一些有用的资源是 Arch wiki 和本教程:
- https://wiki.archlinux.org/title/PulseAudio/Examples
- https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux
如果您发现任何有用的变化,或者有办法纯粹在 Pulseaudio 中执行此操作而无需 udev,请告诉我!