Pulseaudio:连接 USB 音频接口时重新映射源

Pulseaudio:连接 USB 音频接口时重新映射源

我有 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 和本教程:

如果您发现任何有用的变化,或者有办法纯粹在 Pulseaudio 中执行此操作而无需 udev,请告诉我!

相关内容