Como @ Teresa-e-Junior apontou, pactl
é a ferramenta a ser usada:
Antes de tudo, podemos querer obter os IDs de nossos coletores de PA. No meu sistema, é isso que recebo:
$ 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
O coletor 1 é atualmente o meu coletor padrão.
Mas agora eu quero que todos os meus fluxos atuais e futuros sejam reproduzidos via HDMI (ou seja, coletor 0).
Existe um comando para definir o coletor padrão do PulseAudio, mas parece não ter nenhum efeito no meu PC:
$ pacmd set-default-sink 0 #doesn't work on my PC :(
Em vez disso, novos fluxos parecem estar conectados ao coletor que teve um fluxo movido para ele mais recentemente.
Então, digamos ao pactl para mover todos os fluxos atualmente em execução para afundar 0
. Primeiro, precisamos listá-los:
$ pactl list short sink-inputs
290 1 176 protocol-native.c float32le 2ch 44100Hz
295 1 195 protocol-native.c float32le 2ch 44100Hz
Ok, temos dois fluxos (IDs 290 e 295) que estão anexados ao coletor 1
.
Vamos movê-los para afundar 0
:
$ pactl move-sink-input 290 0
$ pactl move-sink-input 295 0
Então, deve ser isso. Agora só precisamos fazer um script que faça o trabalho para nós:
#!/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
Você pode chamá-lo com um ID de coletor ou um nome de coletor como parâmetro (por exemplo, um 0
ou algo parecido alsa_output.pci-0000_01_00.1.hdmi-surround
).
Agora você pode anexar esse script a um evento udev ou atalho de tecla.
man pactl
opções de linha de comando do PulseAudio.