Как отметил @ Teresa-e-Junior, pactl
это инструмент для использования:
Прежде всего мы могли бы хотеть получить идентификаторы наших раковин PA. В моей системе это то, что я получаю:
$ 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, но она, похоже, не влияет на мой компьютер:
$ pacmd set-default-sink 0 #doesn't work on my PC :(
Вместо этого новые потоки, похоже, подключены к приемнику, которому поток был перемещен в него совсем недавно.
Итак, давайте скажем pactl переместить все потоки, которые сейчас воспроизводятся, в сток 0
. Сначала нам нужно перечислить их:
$ pactl list short sink-inputs
290 1 176 protocol-native.c float32le 2ch 44100Hz
295 1 195 protocol-native.c float32le 2ch 44100Hz
Хорошо, у нас есть два потока (идентификаторы 290 и 295), которые оба присоединены к стоку 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
Вы можете вызывать его либо с идентификатором приемника, либо с именем приемника в качестве параметра (т. Е. Либо с 0
каким- либо другим способом alsa_output.pci-0000_01_00.1.hdmi-surround
)
Теперь вы можете прикрепить этот скрипт к событию udev или сочетанию клавиш.
man pactl
параметры командной строки PulseAudio.