fundo
Tive um problema semelhante durante a suspensão / retomada, quando o som mudava da TV HDMI para os alto-falantes do laptop. Ao retomar, o som permaneceria nos alto-falantes do laptop e eu teria que redefinir manualmente o dispositivo de saída para TV em System Settings
-> Sound
.
Esta foi uma das minhas primeiras experiências irritantes com a atualização do Ubuntu 14.04 para 16.04 e a raiz foi a atualização para o PulseAudio 8 que vem com o 16.04 LTS
Depois de muita pesquisa, criei um script chamado TV-sound
. Embora eu não conecte e desconecte a TV como você, fiz algumas pesquisas no Google e criei uma variação do script para funcionar na sua situação. Eu testei e funciona.
Etapa 1: criar script para alternar o áudio entre os dispositivos conectados
Vamos criar um script chamado hotplugtv
udev. Esse mesmo script pode ser chamado em muitos lugares. Por exemplo, durante o teste, usei-o lock-screen-timer
onde o som voltava ao laptop durante o bloqueio da tela.
cd /usr/local/bin
sudo touch hotplugtv
sudo chmod +x hotplugtv
gksu gedit hotplugtv
Quando o editor abrir com uma tela em branco, copie e cole o seguinte:
#! /bin/bash
# NAME: hotplugtv
# PATH: /usr/local/bin
# DESC: Update pulseaudio output device when HDMI TV plugged / unplugged
# CALL: called from /etc/udev/rules.d/99-monitor-hotplug.rules
# DATE: Created Nov 26, 2016.
# NOTE: logs output using log-file
# UPDT: Dec 14, 2016 - Sometimes /sys/class/drm/card0 & sometimes /sys/class/drm/card1
# so use /sys/class/dmcard* instead.
if [[ $(cat /sys/class/drm/card*-HDMI-A-1/status | grep -Ec "^connected") -eq 1 ]]; then
# log-file "HDMI TV connected" ~/bin/log-hotplugtv;
/bin/sleep 2;
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
else
# log-file "HDMI TV disconnected" ~/bin/log-hotplugtv;
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
fi
exit 0
Você precisará substituir as duas ocorrências rick
por seu próprio ID de usuário, por exemplo UTF-8
, etc.
Eu sei que isso pode ser mais profissional, com o nome de usuário definido automaticamente como uma variável bash, mas ainda não sou tão habilidoso :( De qualquer forma, salve o arquivo e saia gedit
.
Etapa 2: criar regras do udev
O udev monitora os eventos de hotplug quando você conecta e desconecta o monitor HDMI. Digite o seguinte para criar uma nova regra.
cd /etc/udev/rules.d
sudo cp 70-persistent-net.rules 99-hotplugtv.rules
gksu gedit 99-hotplugtv.rules
NOTA: Se o arquivo 70-persistent-net.rules
não existir no seu diretório, copie qualquer outro arquivo lá. Não precisamos do conteúdo do arquivo, apenas as permissões do arquivo para garantir que as nossas sejam as mesmas.
O editor irá mostrar um monte de texto irrelevante, destacá-lo e excluí-lo. Em seguida, destaque o código abaixo e cole-o no editor:
# NAME: 99-hotplugtv.rules
# PATH: /etc/udev/rules.d
# DESC: Update pulseaudio output device when HDMI TV plugged / unplugged
# CALL: automatically called on system events
# DATE: Created Nov 26, 2016.
# NOTE: in future may requre systemd service hooks
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/usr/local/bin/hotplugtv"
Salve o arquivo e saia.
Para habilitar a regra (sem reiniciar), precisamos recarregar o udev:
sudo udevadm control --reload-rules
Agora você pode conectar e desconectar o monitor / TV HDMI e o som muda adequadamente.
Embargo
No meu sistema, o som reverte automaticamente para os alto-falantes do laptop quando o HDMI é desconectado. No seu sistema, isso não aconteceu. Poderão ser necessários aprimoramentos adicionais no código se o som não for para os alto-falantes do laptop quando o HDMI estiver desconectado. Por favor, responda via comentário abaixo como as coisas funcionam / não funcionam.
Teste rápido na CLI
Você pode testar rapidamente o código no terminal usando:
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
Mudar para HDMI / TV:
sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
Volte para os alto-falantes embutidos:
sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
Lembre-se de substituir rick
pelo seu nome de usuário.
- A
export
linha inicial provavelmente não é necessária, mas eu a incluí apenas por segurança.
- Se você possui várias placas de som, ou algo diferente de
hdmi-stereo
ajustes é obviamente necessário para descobrir os parâmetros corretos antes de escrever seu script.
Decifrando o nome do seu dispositivo no PulseAudio
O código abaixo usa o mesmo comando duas vezes. Uma vez quando o som estiver definido para TV HDMI externa. Uma segunda vez quando o som é definido para os alto-falantes embutidos do laptop. Cada vez que você vir o nome que o PulseAudio usa:
$ pacmd list-sinks | grep -e 'name:' -e 'index'
* index: 28
name: <alsa_output.pci-0000_00_1b.0.hdmi-stereo>
───────────────────────────────────────────────────────────────────────────────
$ pacmd list-sinks | grep -e 'name:' -e 'index'
* index: 30
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
Quando você tem várias placas de som
Use o comando aplay -l
para verificar se você possui cartões maiores que o número 0. Nesse caso, você precisará usar o número de cartão apropriado em seus scripts. Por exemplo:
$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: 92HD91BXX Analog [92HD91BXX Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
Subdevices: 0/1
Subdevice #0: subdevice #0
No exemplo acima, todos os números de cartões são 0 com diferentes fontes de saída. Se você possui alto-falantes USB, eles podem ter um número de cartão diferente de 0.
Editar 2 de dezembro de 2016
Por alguma razão desconhecida, o script foi quebrado hoje. O código acima costumava ler: "$ (cat / sys / class / drm / card0-HDMI-A-1 / status", mas tive que mudar card0
para card1
e o código acima foi revisado como tal. Não sei explicar o que mudou no meu sistema, exceto atualizações regulares do Ubuntu desde 26 de novembro de 2016.
Editar 14 de dezembro de 2016
O código acima precisava ser alternado novamente para: "$ (cat / sys / class / drm / card0-HDMI-A-1 / status". Em vez de revisar o código entre card0
e card1
dependendo da inicialização, revise o programa para fazer referência card*
a capturar os dois cenários .