Alterne entre alto-falantes internos e HDMI automaticamente

18

Você sabe como, quando você conecta fones de ouvido na entrada auxiliar do laptop, os alto-falantes internos são silenciados automaticamente e o som sai dos fones de ouvido? Eu quero exatamente isso para HDMI.

Conecto um monitor com alto-falantes embutidos ao meu laptop para assistir a vídeos, às vezes. É muito estranho quando o vídeo está no monitor (a 3 metros da minha mesa), mas o som sai dos alto-falantes internos do meu laptop (o laptop fica na mesa).

Claro, eu posso apenas ir para as configurações de som e mudar o canal de saída para HDMI. Porém, mais tarde, quando removi o cabo HDMI horas atrás e talvez até estivesse em um local totalmente diferente, o som não será reproduzido porque o servidor de som ainda tenta reproduzi-lo via HDMI, mas não há nada conectado a ele .

Voltar automaticamente para os alto-falantes internos quando nenhum dispositivo estiver conectado via HDMI é mais importante, mas alternar para a saída de som via HDMI quando um dispositivo estiver conectado ainda seria muito bom.

Aparentemente, isso funcionou com a 11.10, mas não com a 16.04.

UTF-8
fonte
Ter uma tecla de atalho para alternar o som pode ser uma boa solução para você. A segunda resposta neste tópico faz o seguinte: askubuntu.com/questions/41858/…
WinEunuuchs2Unix 8/17
Ainda estou procurando uma solução para isso também (em 16.04; nenhuma das soluções sugeridas funciona). o problema também é discutido no fórum mint .
Hiro protagonista
@hiroprotagonist Sim, eu também. Parece que a resposta aqui funciona na maioria dos casos, mas não em todos.
UTF-8
Na verdade, a alternância automática funcionou no Ubuntu 14.04, a menos que isso tenha sido desativado por uma atualização.
BurninLeo

Respostas:

8

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 hotplugtvudev. Esse mesmo script pode ser chamado em muitos lugares. Por exemplo, durante o teste, usei-o lock-screen-timeronde 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 rickpor 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.rulesnã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 rickpelo seu nome de usuário.

  • A exportlinha 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-stereoajustes é 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 -lpara 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 card0para card1e 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 card0e card1dependendo da inicialização, revise o programa para fazer referência card*a capturar os dois cenários .

WinEunuuchs2Unix
fonte
Não consigo copiar 70-persistent-net.rulesporque não existe. /etc/udev/rules.dcontém apenas um único arquivo chamado 39-smfp_samsung.rules.
UTF-8
Bem, copie 30-smfp_samsung.rules, não precisamos do conteúdo do arquivo apenas para garantir que tenhamos as permissões corretas para o nosso novo arquivo. Copiar um arquivo existente é a maneira mais fácil (de qualquer maneira).
WinEunuuchs2Unix
1
Não funciona no meu sistema. @ Pessoa que já votou positivamente nesta resposta: Isso funciona no seu? | Eu tentei pela primeira vez sem reiniciar, mas não funcionou. Também não funciona após a reinicialização. Desliguei o HDMI e ajustei o som para os alto-falantes internos antes de reiniciar. Após a reinicialização, toquei algumas músicas e conectei meu cabo HDMI. A música ainda (apenas) saiu dos alto-falantes embutidos. Você precisa alterar algo além das 2 ocorrências do nome de usuário? cat /sys/class/drm/card0-HDMI-A-1/statusmostra o status correto (tentei várias vezes).
UTF-8
@ UTF-8 Adicionei uma nova seção onde você pode testar a alternância na linha de comando. Você pode executar isso e ver se há erros por favor?
WinEunuuchs2Unix
Parece não haver output:analog-stereo: pastebin.com/n5bHyhCm Isso torna ainda mais estranho, porque eu esperaria que o som fosse sempre reproduzido via HDMI. Capturas de tela das minhas configurações de som quando o HDMI está conectado e quando o HDMI não está conectado . Edit: Eu já tentei isso, mas levei mais alguns minutos para postar este comentário porque eu tinha que fazer o upload das capturas de tela.
UTF-8