Alternar para o áudio HDMI quando o HDMI é conectado a um laptop (14.04)

11

Estou tentando fazer com que meu laptop mude o áudio para HDMI quando ele estiver conectado e de volta ao padrão quando for removido.

Eu configurei uma regra do udev para acionar um script para realizar a troca, mas estou com problemas para fazer isso funcionar:

  • Parece que, até eu selecionar a saída de áudio HDMI nas configurações de som, ela não é reconhecida como um coletor disponível, assim que a saída de áudio HDMI for selecionada, a saída analógica não será mais listada.

Veja o seguinte:

# HDMI plugged in, not selected in Sound settings.
$ pactl list short sinks 
5   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
kingamajick@kingamajick-laptop: ~

# HDMI selected in sound settings    
$ pactl list short sinks 
7   alsa_output.pci-0000_00_1b.0.hdmi-stereo    module-alsa-card.c  s16le 2ch 48000Hz   SUSPENDED
kingamajick@kingamajick-laptop: ~

# HDMI removed
$ pactl list short sinks 
9   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 48000Hz   SUSPENDED

O script que estou usando para alternar a saída é o seguinte:

#!/bin/bash
HDMI_STATUS='cat /sys/class/drm/card0/*HDMI*/status'
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print }'))

if [ $HDMI_STATUS = "connected" ]
then
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done-server $PULSE_SERVER set-card-profile 0 output:analog-stereo+input:analog-stereo
fi

O script apresenta um erro sobre a ausência desse coletor quando eu o aciono antes de selecionar HDMI nas configurações de som.

    
por Kingamajick 30.04.2014 / 11:22

7 respostas

8
  1. Verifique se há cartões disponíveis & amp; perfis

    pactl list cards
    
  2. Adicione o seguinte comando ao script para alterar o perfil antes de definir o coletor padrão & amp; movendo fluxos

    pactl [options] set-card-profile  CARD PROFILE
    

(Não é necessário alterá-lo manualmente nas configurações de som)

Referência:

pactl -h & amp; man pactl

    
por user.dz 09.05.2014 / 01:39
7

Baseado neste link e este link ... eu testei e FUNCIONA BEM ubuntu 14.04

você deve criar uma regra em /etc/udev/rules.d/100-hdmi_sound.rules

com esse conteúdo

SUBSYSTEM=="drm", ACTION=="change", RUN+="/lib/udev/hdmi_sound_toggle.sh"

crie então

sudo -H gedit /lib/udev/hdmi_sound_toggle.sh

com seu conteúdo

#!/bin/bash

HDMI_STATUS='cat /sys/class/drm/card0/*HDMI*/status'
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print }'))
if [ $HDMI_STATUS = "connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi

Espero que possa ajudar .. desculpe pelo meu Inglês eu falei espanhol

    
por Sk. 10.08.2014 / 00:33
3

Eu tive um pouco de dificuldade depois disso. Copiei o script original e modifiquei como sugerido e agora funciona.

Estou incluindo aqui para facilitar o uso de outra pessoa.

#!/bin/bash
## From: https://sobrelinux.info/questions/12631/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04"connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi

Agora, gostaria apenas de ativá-lo com o udev, mas não sei como fazer isso.

    
por Joe 06.08.2014 / 21:58
2

Bem, todos os scripts fornecidos não funcionaram para mim (Ubuntu 16.04), mas Eu encontrei este indicador app que permite que você mude a saída de som em apenas um clique:

link

(nota: você precisa primeiro instalar o pacote appindicator: sudo apt-get install python-appindicator )

Pensei em deixar isso aqui para outras pessoas que poderiam estar na mesma situação que eu, mesmo que seja uma solução alternativa ... mas isso torna tudo muito fácil e discreto; -)

    
por Nat Azodnem 10.08.2016 / 10:14
2

Os scripts fornecidos não funcionaram para mim com o udev pronto para uso no Ubuntu 14.04, eu tive que adicionar:

export DISPLAY=:0

no começo, converta os dois comandos pacmd para pactl e finalmente execute o script usando sudo -s -u (user) da regra do udev.

#!/bin/bash
## From: https://sobrelinux.info/questions/12631/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04"connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pactl move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pactl move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi
    
por Ken 22.09.2014 / 03:32
0

Mais uma vez outra solução (testada funcionando em 16.04) baseada em anterior, mas com algumas melhorias que funcionam usando o pactl adequado apontando para o servidor correto (pode ser melhorado para obter automaticamente os nomes dos cartões e perfis, consulte pactl list ou pactl info por enquanto).

#!/bin/bash

USER_NAME=$(who | grep tty$(sudo fgconsole) | cut -f1 -d' ')
USER_ID=$(id -u "$USER_NAME")
HDMI_STATUS=$(</sys/class/drm/card0/*HDMI*/status)

HDMI_CARD="pci-0000_00_03.0"
HDMI_PROFILE="hdmi-stereo-extra1"

INTERNAL_CARD="pci-0000_00_1b.0"
INTERNAL_PROFILE="analog-stereo"

export LANG=C
export PULSE_SERVER="unix:/run/user/$USER_ID/pulse/native"

function pactl_cmd() {
  sudo -u $USER_NAME pactl --server $PULSE_SERVER $*
}

if [ "$HDMI_STATUS" = "connected" ]; then
  CARD=$HDMI_CARD
  OUTPUT=$HDMI_PROFILE
else
  CARD=$INTERNAL_CARD
  OUTPUT=$INTERNAL_PROFILE
fi

pactl_cmd set-default-sink alsa_output.$CARD.$OUTPUT
pactl_cmd set-card-profile alsa_card.$CARD output:$OUTPUT

INPUTS=($(pactl_cmd list sink-inputs | grep "^Sink Input #"|cut -d# -f2))
for i in ${INPUTS[*]}; do
  pactl_cmd move-sink-input $i alsa_output.$CARD.$OUTPUT
done

Relacionadas gist está aqui .

    
por Treviño 08.02.2017 / 00:05
0

Os scripts do Udev são executados como root, mas você também precisa saber qual gerenciador de exibição está usando. Esses scripts devem funcionar, mas você deve autorizar o gerenciador de exibição a fazê-lo.

Encontre o DM que você está usando:

pgrep -a Xorg

Veja a opção -auth, ele mostrará o gerenciador de exibição. Poderia ser sddm ou lightdm nos últimos lançamentos do Ubuntu.

Esta linha deve ser exportada como variável XAUTHORITY, assim:

ls /car/run/sddm*

por exemplo, esta pode ser uma saída válida:

/var/lib/mdm/:0.Xauth (Isso será usado pelo script)

É assim que o seu script deve ser:

#!/bin/bash
export DISPLAY=:0
export XAUTHORITY='ls /var/run/sddm*'
HDMI_STATUS="$(cat /sys/class/drm/card0-HDMI-A-1/status)"
USER='whoami'
export XAUTHORITY=/home/$USER/.Xauthority
export DISPLAY=:0

if [ "$HDMI_STATUS" = connected ];
then
    sudo -u $USER pactl set-card-profile 0 output:hdmi-stereo+input:analog-stereo
else
    sudo -u $USER pactl set-card-profile 0 output:analog-stereo+input:analog-stereo
fi
exit 0

Isso permitirá que seu gerenciador de exibição altere a saída HDMI. Siga as instruções para criar os arquivos de regras do udev e tornar o script executável.

    
por LinuxHelper 10.02.2017 / 14:20