Ainda outro script de comutador de pia
testado no Ubuntu 16.04
Mas este permite alternar apenas o áudio do aplicativo que você deseja.
USO: concentre o aplicativo que você deseja alterar seu coletor e execute este script. É isso aí!!!
Esse script detecta o aplicativo que está em foco, localiza todos os áudios reproduzidos nele e os muda para o próximo coletor disponível.
https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3
Explicando o script
Precisamos encontrar o PID do aplicativo em foco
Mas primeiro precisamos do xid
xprop -root _NET_ACTIVE_WINDOW
Em seguida, insira-o aqui $xid
para obter o pid da aplicação
xprop -id $xid _NET_WM_PID
Agora precisamos encontrar as entradas de coletor relacionadas a esse PID
Primeiro, vamos linearizar a saída do comando pacmd list-sink-inputs
para listar uma entrada de coletor por linha, mostrando seu índice, coletor e pid na mesma linha
pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2
vamos analisá-lo passo a passo:
grep -E 'index:|sink:|process.id
só manter linhas que contêm index:
, sink:
ouprocess.id
tr '\n' ' '
junta todas as linhas
tr -d '"'
remove todos os "
caracteres. Necessário para receber o pid sem aspas
sed -e 's/index:/\n/g'
substitui todas as index:
ocorrências por um novo caractere de linha\n
tail -n +2
remove a primeira linha porque está vazia
E o resultado é algo como isto:
180 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 3521
181 sink: 1 <alsa_output.pci-0000_00_01.0.analog-stereo> application.process.id = 2733
182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752
Vamos analisar uma linha para entender o que isso significa:
# 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752
182
é o índice de entrada do coletor, 0
é o índice do coletor e, 13752
no final, é o pid do aplicativo pertencente
Então iteramos através de cada linha
... | while IFS= read -r line || [ -n "$line" ]; do
sink_input_pid=$(echo $line | awk '{print $NF}')
E, finalmente, filtre apenas o pid da entrada do coletor que corresponde ao pid do aplicativo focado
if [ $sink_input_pid = $app_pid ]; then
Extraindo dados
Com awk
podemos obter os elementos que precisamos
sink_input_index=$(echo $sink_input | awk '{print $1}')
current_sink_index=$(echo $sink_input | awk '{print $3}')
Obtenha o número de sumidouros para saber quando a rotação dos sumidouros deve reiniciar de 0.
sink_list_size=${#sink_list_array[@]}
Para encontrar o próximo coletor, precisamos percorrer a lista de coletores, para saber qual deles corresponde a current_sink_index e para saber o índice do próximo coletor.
i=0
for sink in "${sink_list_array[@]}"; do
i=$((($i+1)%sink_list_size)) # i++ mod(#sinks)
if [ $sink = $current_sink_index ]; then
next_sink_index=${sink_list_array[i]}
break
fi
done
E, finalmente, movemos a entrada do coletor para tocar no next_sink_index
pacmd move-sink-input $sink_input_index $next_sink_index
Nota no Ubuntu 16.04:
Ao configurar a tecla de atalho, não consegui fazê-lo funcionar com o gerenciador de atalhos do ubuntu. Então eu tive que instalar o compizconfig-settings-manager
sudo apt-get install compizconfig-settings-manager