Przełączanie na HDMI Audio, gdy HDMI jest podłączony do laptopa (14.04)

12

Próbuję zmusić laptopa do przełączenia dźwięku na HDMI po podłączeniu i powrotu do standardowego analogu po odłączeniu.

Skonfigurowałem regułę udev, aby uruchomić skrypt do wykonania przełączenia, ale mam problemy z uruchomieniem go:

  • Wygląda na to, że dopóki nie wybiorę wyjścia HDMI Audio w Ustawieniach dźwięku, nie zostanie on rozpoznany jako dostępny zlew, również po wybraniu wyjścia HDMI Audio wyjście analogowe nie będzie już wyświetlane.

Zobacz poniżej:

# 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

Skrypt, którego używam, przełącza wyjście w następujący sposób:

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

Skrypt wyświetla błąd dotyczący braku takiego zlewu, gdy uruchamiam go przed wybraniem HDMI w ustawieniach dźwięku.

Kingamajick
źródło

Odpowiedzi:

9
  1. Sprawdź dostępne karty i profile

    pactl list cards
    
  2. Dodaj następujące polecenie do skryptu, aby zmienić profil przed ustawieniem domyślnego ujścia i przenoszenia strumieni

    pactl [options] set-card-profile  CARD PROFILE
    

(Więc nie trzeba przełączać go ręcznie w Ustawieniach dźwięku)

Odniesienie:

pactl -h I man pactl

user.dz
źródło
9

W oparciu o ten link i ten link ... przetestowałem i WORKS FINE ubuntu 14.04

powinieneś utworzyć regułę w /etc/udev/rules.d/100-hdmi_sound.rules

z tej treści

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

następnie utwórz

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

z twoją treścią

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

Mam nadzieję, że mogę pomóc .. przepraszam za mój angielski. Mówiłem po hiszpańsku

Sk.
źródło
4

Po tym miałem trochę problemów. Skopiowałem oryginalny skrypt i zmodyfikowałem go zgodnie z sugestią, a teraz działa.

Zamieszczam go tutaj, aby ułatwić innym osobom korzystanie.

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

Teraz chciałbym uruchomić go za pomocą udev, ale nie mam pojęcia, jak to zrobić.

Joe
źródło
1
To nie działa w 16.04. Pracuję nad tym ponownie.
Joe
3

Dostarczone skrypty nie działały dla mnie z udev po wyjęciu z pudełka na Ubuntu 14.04, musiałem dodać:

export DISPLAY=:0

na początku przekonwertuj dwie komendy pacmd na pactl i na koniec uruchom skrypt za pomocą sudo -s -u (użytkownik) z reguły 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
Rozpoznać
źródło
2

Cóż, wszystkie dostarczone skrypty nie działały dla mnie (Ubuntu 16.04), ale znalazłem ten wskaźnik aplikacji, który pozwala zmienić wyjście dźwięku za pomocą jednego kliknięcia:

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

(uwaga: trzeba najpierw zainstalować pakiet appindicator: sudo apt-get install python-appindicator)

Pomyślałem, że zostawię to tutaj innym, którzy mogą być w takiej samej sytuacji jak ja, mimo że jest to alternatywne rozwiązanie ... ale sprawia, że ​​jest to dość łatwe i dyskretne ;-)

Nat Azodnem
źródło
0

Znów inne rozwiązanie (przetestowane w 16.04) oparte na poprzednich, ale z pewnymi ulepszeniami, które działają przy użyciu odpowiedniego pactlwskazywania na właściwy serwer (można ulepszyć, aby automatycznie otrzymywać nazwy kart i profili, patrz pactl listlub pactl infona razie).

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

Powiązana istota jest tutaj .

Treviño
źródło
Miałem podobny skrypt, który działał, card0ale któregoś dnia się zmienił, card1więc zmieniłem skrypt, a następnego dnia zmieniłem z powrotem na card0. W końcu zmieniłem kod na card*i od tego czasu wszystko jest w porządku. Tylko jedna głowa, jeśli coś podobnego ci się stanie.
WinEunuuchs2Unix
0

Skrypty Udev działają jako root, ale musisz także wiedzieć, którego menedżera wyświetlania używasz. Te skrypty powinny działać, ale musisz upoważnić do tego menedżera wyświetlania.

Znajdź DM, którego używasz:

pgrep -a Xorg

Zobacz opcję -auth, wyświetli się menedżer wyświetlania. Może to być sddm lub lightdm w najnowszych wydaniach Ubuntu.

Ten wiersz musi zostać wyeksportowany jako zmienna XAUTHORITY, jak poniżej:

ls /car/run/sddm*

na przykład może to być poprawny wynik:

/var/lib/mdm/:0.Xauth (będzie używany przez skrypt)

Tak powinien wyglądać twój skrypt:

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

Umożliwi to menedżerowi ekranu zmianę wyjścia HDMI. Postępuj zgodnie z instrukcjami, aby utworzyć pliki reguł udev i umożliwić wykonanie skryptu.

LinuxHelper
źródło