正如@ Teresa-e-Junior指出的pactl
是要使用的工具:
首先,我们可能想要获取PA接收器的ID。在我的系统上,这是我得到的:
$ pactl list short sinks
0 alsa_output.pci-0000_01_00.1.hdmi-surround module-alsa-card.c s16le 6ch 44100Hz SUSPENDED
1 alsa_output.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 44100Hz RUNNING
接收器1当前是我的默认接收器。
但是现在我希望所有当前和将来的流都可以通过HDMI播放(即接收器0)。
有一个命令可以为PulseAudio设置默认接收器,但是它对我的PC似乎没有任何影响:
$ pacmd set-default-sink 0 #doesn't work on my PC :(
取而代之的是,新的流似乎已连接到最近有流移动到的接收器。
因此,让我们告诉pactl将所有当前正在播放的流移动到sink 0
。我们首先需要列出它们:
$ pactl list short sink-inputs
290 1 176 protocol-native.c float32le 2ch 44100Hz
295 1 195 protocol-native.c float32le 2ch 44100Hz
好的,我们有两个流(ID 290和295)都连接到sink 1
。
让我们将它们下沉0
:
$ pactl move-sink-input 290 0
$ pactl move-sink-input 295 0
所以,应该是这样。现在,我们只需要编写一个脚本即可为我们完成工作:
#!/bin/bash
if [ -z "$1" ]; then
echo "Usage: $0 <sinkId/sinkName>" >&2
echo "Valid sinks:" >&2
pactl list short sinks >&2
exit 1
fi
newSink="$1"
pactl list short sink-inputs|while read stream; do
streamId=$(echo $stream|cut '-d ' -f1)
echo "moving stream $streamId"
pactl move-sink-input "$streamId" "$newSink"
done
您可以使用接收器ID或接收器名称作为参数来调用它(即0
或之类的alsa_output.pci-0000_01_00.1.hdmi-surround
)。
现在,您可以将此脚本附加到udev事件或快捷键。
man pactl
PulseAudio命令行选项。