Como @ Teresa-e-Junior apontou pactl
é a ferramenta a ser usada:
Antes de mais nada, podemos querer obter os IDs de nossos sumidouros de PA. No meu sistema, é isso que eu 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 dissipador 1 é atualmente meu coletor padrão.
Mas agora eu quero que todos os meus fluxos atuais e futuros sejam reproduzidos via HDMI (ou seja, sink 0).
Existe um comando para definir o coletor padrão para o 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, vamos dizer ao pactl para mover todos os fluxos atualmente em reproduçã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 grupo 1
.
Vamos movê-los para afundar 0
:
$ pactl move-sink-input 290 0
$ pactl move-sink-input 295 0
Então, deveria ser isso. Agora só precisamos criar 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, 0
ou algo como alsa_output.pci-0000_01_00.1.hdmi-surround
).
Agora você pode anexar esse script a um evento ou atalho de tecla do udev.