Ainda outro script de comutador Sink
testado no Ubuntu 16.04
Mas este permite que você mude apenas o áudio do aplicativo desejado.
USO: Focalize o aplicativo que você deseja alterar seu coletor e execute este script. É isso!
Esse script detecta o aplicativo que está em foco, localiza todos os áudios reproduzidos a partir dele e os alterna para o próximo coletor disponível.
link
Explicando o script
Precisamos encontrar o PID do aplicativo em foco
Mas primeiro precisamos do xid
xprop -root _NET_ACTIVE_WINDOW
Em seguida, insira aqui $xid
para obter o pid da aplicação
xprop -id $xid _NET_WM_PID
Agora precisamos encontrar as entradas do coletor relacionadas a esse PID
Primeiramente vamos linearizar a saída do comando pacmd list-sink-inputs
para listar uma entrada de sumidouro por linha, mostrando seu índice, sink 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
apenas manter linhas que contenham index:
, sink:
ou process.id
tr '\n' ' '
une todas as linhas
tr -d '"'
remove todos os caracteres "
. Necessário para obter o pid sem aspas
sed -e 's/index:/\n/g'
substitui todas as ocorrências index:
por um novo caractere de linha \n
tail -n +2
remove a primeira linha porque está vazia
E o resultado é algo assim:
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
Depois, percorremos 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 de que precisamos
sink_input_index=$(echo $sink_input | awk '{print }')
current_sink_index=$(echo $sink_input | awk '{print }')
Obtenha números de coletores, para saber quando a rotação de coletores deve reiniciar de 0.
sink_list_size=${#sink_list_array[@]}
Encontrando o próximo coletor, precisamos percorrer a lista de coletores, saber qual deles corresponde a current_sink_index e conhecer 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 sink para tocar em 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ê-la funcionar com o gerenciador de atalhos do ubuntu.
Então eu tive que instalar compizconfig-settings-manager
sudo apt-get install compizconfig-settings-manager