Passaggio all'audio HDMI quando HDMI è collegato a un laptop (14.04)


12

Sto cercando di convincere il mio laptop a cambiare l'audio su HDMI quando è collegato e tornare all'analogo standard quando viene rimosso.

Ho impostato una regola udev per attivare uno script per eseguire il passaggio, tuttavia ho problemi a farlo funzionare:

  • Sembra che fino a quando non seleziono l'uscita audio HDMI nelle Impostazioni audio, non venga riconosciuto come un sink disponibile, anche una volta selezionata l'uscita HDMI Audio, l'uscita analogica non viene più elencata.

Vedi sotto:

# 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

Lo script che sto usando per attivare / disattivare l'output è il seguente:

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

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

Lo script fornisce un errore su tale sink quando lo innesco prima di selezionare HDMI nelle impostazioni audio.


Risposte:


9
  1. Controlla le schede e i profili disponibili

    pactl list cards
    
  2. Aggiungi il seguente comando allo script per modificare il profilo prima di impostare il sink predefinito e lo spostamento dei flussi

    pactl [options] set-card-profile  CARD PROFILE
    

(Quindi non è necessario cambiarlo manualmente da Impostazioni audio)

Riferimento:

pactl -h & man pactl


9

Basato su questo link e questo link ... ho testato e FUNZIONA FINE Ubuntu 14.04

dovresti creare una regola in /etc/udev/rules.d/100-hdmi_sound.rules

con questo contenuto

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

quindi creare

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

con i tuoi contenuti

#!/bin/bash

HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
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

Spero di poterti aiutare .. Scusa per il mio inglese, ho parlato spagnolo


4

Ho avuto un po 'di problemi a seguire questo. Ho copiato lo script originale e l'ho modificato come suggerito e ora funziona.

Lo sto includendo qui per renderlo più facile da usare per qualcun altro.

#!/bin/bash
## From: /ubuntu/458194/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04
## Script needs to be triggered by a udev rule
## Works manually now

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

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

Ora, vorrei solo attivarlo con udev, ma non ho idea di come farlo.


1
Questo non funziona in 16.04. Ci sto di nuovo lavorando.
Joe

3

Gli script forniti non hanno funzionato per me con udev pronto all'uso su Ubuntu 14.04, ho dovuto aggiungere:

export DISPLAY=:0

all'inizio, converti i due comandi pacmd in pactl ed infine esegui lo script usando sudo -s -u (utente) dalla regola udev.

#!/bin/bash
## From: /ubuntu/458194/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04
## Script needs to be triggered by a udev rule
## Works manually now

export DISPLAY=:0

##source ${HOME}/bin/bash_trace
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pactl list sink-inputs | grep Input | awk '{print $3}' | sed -r 's/^.{1}//')

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 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

2

Bene, tutti gli script forniti non hanno funzionato per me (Ubuntu 16.04), ma ho trovato questo indicatore di app che ti consente di cambiare l'uscita audio in un solo clic:

https://github.com/lkettenb/sound-output-switcher

(nota: è necessario installare il pacchetto AppIndicator prima: sudo apt-get install python-appindicator)

Ho pensato di lasciarlo qui per altri che potrebbero trovarsi nella mia stessa situazione, anche se è una soluzione alternativa ... ma lo rende abbastanza semplice ed è discreto ;-)


0

Anche in questo caso un'altra soluzione (testata nel 16.04) basata su precedenti ma con alcuni miglioramenti che funziona usando il pactlpuntamento corretto verso il server giusto (può essere migliorata per ottenere automaticamente i nomi delle carte e dei profili, fare riferimento pactl listo pactl infoper ora).

#!/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

L' essenza correlata è qui .


Avevo uno script simile che funzionava usando card0ma un giorno è passato a card1così ho cambiato lo script e poi il giorno successivo è tornato a card0. Alla fine ho cambiato il codice card*e tutto va bene da allora. Solo un avvertimento se ti succede qualcosa di simile.
WinEunuuchs2Unix

0

Gli script Udev vengono eseguiti come root, ma devi anche sapere quale display manager stai utilizzando. Questi script dovrebbero funzionare, ma devi autorizzare il display manager a farlo.

Trova il DM che stai utilizzando:

pgrep -a Xorg

Vedi l'opzione -auth, ti mostrerà il display manager. Potrebbe essere sddm ou lightdm nelle ultime versioni di Ubuntu.

Questa riga deve essere esportata come variabile XAUTHORITY, in questo modo:

ls /car/run/sddm*

per esempio, questo potrebbe essere un output valido:

/var/lib/mdm/:0.Xauth (questo sarà usato dallo script)

Ecco come deve apparire il tuo script:

#!/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

Ciò consentirà al display manager di modificare l'uscita HDMI. Seguire le istruzioni per creare i file delle regole udev e rendere eseguibile lo script.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.