Como alternar o áudio entre o PC e o televisor?

4

Eu criei um script que alterna a saída de áudio entre o PC e o aparelho de TV conectado via HDMI. Parece assim:

inactive_sink_id=$(pacmd list-sinks | grep -E "[^*] index: [0-9]+" | sed -r -e "s/.*([0-9]+)//g")

pacmd set-default-sink $inactive_sink_id

move_sink_to_id=$(pacmd list-sink-inputs | grep -E "index: [0-9]+" | sed -r -e "s/.* ([0-9]+)//g")

pacmd move-sink-input $move_sink_to_id $inactive_sink_id

Mas às vezes funciona, às vezes não funciona.

Por exemplo, aconteceu para que um vídeo do youtube estava tocando, eu podia ouvir o som no meu PC. Depois que eu mudei para outra posição no vídeo, nenhum som pode ser ouvido. Eu abri "Configurações de Áudio e Vídeo" e notei que o aparelho de TV HDMI estava no topo da lista "Preferências de Dispositivos".

O que é uma maneira confiável de alternar a saída de áudio?

Tenho notado que, embora meu script faça algumas alterações, as "Configurações de áudio e vídeo" permanecem inalteradas:

$ pacmd list-sinks | grep index
  * index: 0
    index: 1

$ toggle-audio-between-pc-and-tv.sh   # My script

$ pacmd list-sinks | grep index
    index: 0
  * index: 1

LigueoaparelhodeTV

Reproduzaumvídeo.Semsom.

Noentanto,quandoexecutomeuscriptváriasvezes,osoméalteradoparaoaparelhodeTV.

Parecequeasaçõespacmde"Configurações de áudio e vídeo" não estão sincronizadas.

    
por ka3ak 27.02.2017 / 19:02

1 resposta

0

Concluindo os nomes das variáveis, você não entende o que está acontecendo aqui.

Esta linha está bem. (Mas não se você tiver mais de duas pias.) Você está procurando a pia sem * e atribuindo-a a inactive_sink_id .

inactive_sink_id=$(pacmd list-sinks | grep -E "[^*] index: [0-9]+" | sed -r -e "s/.*([0-9]+)//g")

Isso também é bom. Contanto que você tenha apenas dois dissipadores. Se você tiver mais, haverá um erro, pois a variável conterá muitos números.

pacmd set-default-sink $inactive_sink_id

Este também pode estar bem, mas com apenas uma entrada. E o nome da variável aqui não está bem.

move_sink_to_id=$(pacmd list-sink-inputs | grep -E "index: [0-9]+" | sed -r -e "s/.* ([0-9]+)//g")

Você não está movendo uma pia para um id. Você está movendo uma entrada para um coletor identificado por um id. (Os ids não mudam. Por que eles iriam?) Se houver mais entradas, esta linha não funcionará, pois o move_sink_to_id conterá muitos inteiros:

pacmd move-sink-input $move_sink_to_id $inactive_sink_id

Tente usar essa construção:

for input in $(pactl list short sink-inputs | awk '{print $1}'); do
    pacmd move-sink-input $input $inactive_sink_id
done

Agora você tem certeza de que todas as entradas são movidas para o coletor de destino. Isso é importante, porque mesmo se você pausar um vídeo do YouTube, ele ainda permanece na lista de entrada por algum tempo. Você pode fazer algumas experiências com

pactl list short sink-inputs

e veja como o PulseAudio o vê.

Além disso, altero o nome inactive_sink_id para target_sink_id e apresentarei uma cobertura para a situação quando houver mais de dois coletores. Isso pode ser uma codificação rígida com base no nome do coletor. Você pode se referir a pias não apenas por id, mas também por nome, por exemplo.

pactl move-sink-input 65 alsa_output.pci-0000_00_1b.0.analog-stereo

Ou você pode apresentar uma lista de seleção possivelmente opcional que permitirá escolher onde você deseja mover as entradas.

Este comando produz uma lista clara de coletores com nomes na segunda coluna:

pactl list short sinks

E certifique-se de que o seu script esteja em execução assim que o PulseAudio puder ver sua TV afundar!

O script final pode ser assim:

#!/bin/bash

target_sink=alsa_output.pci-0000_00_1b.0.analog-stereo

pactl list short sinks | grep -- "$target_sink" || {
    echo Sink "$target_sink" not found! >&2
    exit 1
}
pacmd set-default-sink "$target_sink"
for input in $(pactl list short sink-inputs | awk '{print $1}'); do
    pacmd move-sink-input "$input" "$target_sink"
done
    
por 28.02.2017 / 08:46