Automatyczne przełączanie między głośnikami wewnętrznymi i HDMI

18

Wiesz, jak po podłączeniu słuchawek do gniazda AUX laptopa, wewnętrzne głośniki są automatycznie wyciszane, a dźwięki wydobywają się ze słuchawek? Chcę dokładnie tego dla HDMI.

Czasami podłączam monitor z wbudowanymi głośnikami do laptopa, aby oglądać filmy. To bardzo dziwne, gdy wideo znajduje się na monitorze (który znajduje się 3 m od mojego biurka), ale dźwięk dochodzi z wewnętrznych głośników mojego laptopa (laptop siedzi na biurku).

Oczywiście mogę po prostu przejść do ustawień dźwięku i przełączyć kanał wyjściowy na HDMI. Ale później, kiedy kilka godzin temu wyjąłem kabel HDMI i mogłem nawet znaleźć się w zupełnie innym miejscu, dźwięk nie będzie odtwarzany, ponieważ serwer dźwięku nadal próbuje go odtwarzać przez HDMI, ale nic nie jest z nim podłączone .

Automatyczne przełączanie z powrotem na głośniki wewnętrzne, gdy żadne urządzenie nie jest podłączone przez HDMI, jest ważniejsze, ale przełączenie na dźwięk emitowany przez HDMI, gdy urządzenie jest podłączone, nadal byłoby bardzo przyjemne.

To najwyraźniej działało z 11.10, ale nie działa z 16.04.

UTF-8
źródło
Posiadanie klawisza skrótu do przełączania dźwięku może być dla Ciebie dobrym rozwiązaniem. Druga odpowiedź w tym wątku brzmi
WinEunuuchs2Unix
wciąż szukam rozwiązania tego problemu (16.04; żadne z sugerowanych rozwiązań nie działa). problem jest również omawiany na forum mennicy .
główny bohater Hiro,
@hiroprotagonist Tak, ja też. Wydaje się, że odpowiedź tutaj działa w większości przypadków, ale nie we wszystkich.
UTF-8
W rzeczywistości automatyczne przełączanie działało w Ubuntu 14.04, chyba że zostało to wyłączone przez aktualizację.
BurninLeo

Odpowiedzi:

8

tło

Miałem podobny problem podczas zawieszania / wznawiania, gdy dźwięk przełączał się z telewizora HDMI na głośniki laptopa. Po wznowieniu dźwięk pozostałby na głośnikach laptopa i musiałbym ręcznie zresetować urządzenie wyjściowe do TV w System Settings-> Sound.

Było to jedno z moich pierwszych irytujących doświadczeń z aktualizacją z Ubuntu 14.04 do 16.04, a rootem była aktualizacja do PulseAudio 8, która jest dostarczana z 16.04 LTS

Po wielu poszukiwaniach stworzyłem skrypt o nazwie TV-sound. Chociaż nie podłączam i nie odłączam telewizora tak jak ty, przeprowadziłem kilka wyszukiwań w Google i stworzyłem odmianę skryptu, aby działał w twojej sytuacji. Przetestowałem to i działa.

Krok 1: Utwórz skrypt do przełączania dźwięku między podłączonymi urządzeniami

Stworzymy skrypt o nazwie hotplugtvUdev. Ten sam skrypt można wywołać w wielu miejscach. Na przykład podczas testów użyłem go lock-screen-timertam, gdzie dźwięk powrócił do laptopa podczas blokowania ekranu.

cd /usr/local/bin
sudo touch hotplugtv
sudo chmod +x hotplugtv
gksu gedit hotplugtv

Gdy edytor zostanie otwarty z pustym ekranem, skopiuj i wklej do niego następujące elementy:

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

Będziesz musiał zastąpić dwa wystąpienia rickwłasnym identyfikatorem użytkownika, tj. UTF-8Itp.

Wiem, że to może być bardziej profesjonalne, z nazwą użytkownika automatycznie ustawioną na zmienną bash, ale nie jestem jeszcze tak wykwalifikowany :( W każdym razie, zapisz plik i wyjdź gedit.

Krok 2: Utwórz reguły udev

udev monitoruje zdarzenia hotplug po podłączeniu i odłączeniu monitora HDMI. Wpisz następujące polecenie, aby utworzyć nową regułę.

cd /etc/udev/rules.d
sudo cp 70-persistent-net.rules 99-hotplugtv.rules
gksu gedit 99-hotplugtv.rules

UWAGA: Jeśli plik 70-persistent-net.rulesnie istnieje w twoim katalogu, skopiuj tam dowolny inny plik. Nie potrzebujemy zawartości pliku, tylko uprawnienia do plików, aby upewnić się, że nasze są takie same.

Edytor wyświetli kilka nieistotnych tekstów, podświetli je i usunie. Następnie zaznacz poniższy kod i wklej go do edytora:

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

Zapisz plik i wyjdź.

Aby włączyć regułę (bez ponownego uruchamiania), musimy ponownie załadować udev:

sudo udevadm control --reload-rules

Teraz możesz odpowiednio podłączyć i odłączyć monitor HDMI / telewizor, a dźwięk przełącza się odpowiednio.

Zastrzeżenie

W moim systemie dźwięk automatycznie powraca do głośników laptopa, gdy HDMI jest odłączony. W twoim systemie tak nie było. Konieczne mogą być dalsze udoskonalenia kodu, jeśli dźwięk nie dochodzi do głośników laptopa, gdy HDMI jest odłączony. Odpowiedz w komentarzu poniżej, jak to działa / nie działa.

Szybkie testowanie w CLI

Możesz szybko przetestować kod na terminalu, używając:

    export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
  • Przełącz na HDMI / TV:

        sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
  • Wróć do wbudowanych głośników:

        sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
  • Pamiętaj, aby zastąpić rickswoją nazwą użytkownika.

  • Początkowa exportlinia prawdopodobnie nie jest konieczna, ale załączyłem ją tylko dla bezpieczeństwa.
  • Jeśli masz wiele kart dźwiękowych lub coś innego niż hdmi-stereopoprawki są oczywiście potrzebne, aby znaleźć poprawne parametry przed napisaniem skryptu.

Odszyfrowanie nazwy urządzenia w PulseAudio

Poniższy kod używa dwukrotnie tego samego polecenia. Raz, gdy dźwięk jest ustawiony na zewnętrzny telewizor HDMI. Po raz drugi dźwięk jest ustawiony na wbudowane głośniki laptopa. Za każdym razem, gdy zobaczysz nazwę PulseAudio, używa:

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

Gdy masz wiele kart dźwiękowych

Użyj polecenia, aplay -laby sprawdzić, czy masz karty większe niż 0. Jeśli tak, będziesz musiał użyć odpowiedniego numeru karty w swoich skryptach. Na przykład:

$ 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

W powyższym przykładzie wszystkie numery kart mają wartość 0 przy różnych źródłach wyjściowych. Jeśli masz głośniki USB, mogą mieć inny numer karty niż 0.

Edytuj 2 grudnia 2016 r

Z nieznanego powodu skrypt został dziś zepsuty. Powyższy kod używany do odczytu: „$ (cat / sys / class / drm / card0-HDMI-A-1 / status”, ale musiałem zmienić card0się card1i kod powyżej została zmieniona jako taka nie mogę wyjaśnić, co się zmieniło. w moim systemie innym niż zwykłe aktualizacje Ubuntu od 26 listopada 2016 r.

Edytuj 14 grudnia 2016 r

Powyższy kod musiał zostać ponownie przełączony z powrotem na: „$ (cat / sys / class / drm / card0-HDMI-A-1 / status”. Zamiast zmieniać kod między card0i w card1zależności od rozruchu, popraw program, aby odwoływał się card*do przechwytywania obu scenariuszy .

WinEunuuchs2Unix
źródło
Nie mogę skopiować, 70-persistent-net.rulesponieważ nie istnieje. /etc/udev/rules.dzawiera tylko jeden plik o nazwie 39-smfp_samsung.rules.
UTF-8
No cóż, skopiuj plik 30-smfp_samsung.rules, nie potrzebujemy zawartości pliku tylko po to, aby upewnić się, że mamy odpowiednie uprawnienia do naszego nowego pliku. Skopiowanie istniejącego pliku jest najłatwiejszym sposobem (w każdym razie dla mnie).
WinEunuuchs2Unix
1
To nie działa w moim systemie. @ Osoba, która już oceniła tę odpowiedź: Czy działa na ciebie? | Najpierw wypróbowałem to bez restartu, ale to nie działało. Nie działa również po ponownym uruchomieniu. Odłączyłem HDMI i przestawiłem dźwięk na wewnętrzne głośniki przed ponownym uruchomieniem. Po ponownym uruchomieniu odtworzyłem trochę muzyki i podłączyłem kabel HDMI. Muzyka wciąż (tylko) wychodziła z wbudowanych głośników. Czy musisz zmienić cokolwiek innego niż 2 wystąpienia nazwy użytkownika? cat /sys/class/drm/card0-HDMI-A-1/statuspokazuje poprawny status (próbowałem kilka razy).
UTF-8
@ UTF-8 Dodałem nową sekcję, w której możesz przetestować przełączanie w wierszu poleceń. Czy możesz to uruchomić i sprawdzić, czy wystąpią błędy?
WinEunuuchs2Unix
Wydaje się, że nie ma output:analog-stereo: pastebin.com/n5bHyhCm To sprawia, że ​​jest jeszcze dziwniejszy, ponieważ wtedy spodziewałbym się, że dźwięk będzie zawsze odtwarzany przez HDMI. Zrzuty ekranu z moimi ustawieniami dźwięku, gdy HDMI jest podłączone i kiedy HDMI nie jest podłączone . Edycja: Próbowałem już tego, ale opublikowanie tego komentarza zajęło mi kilka minut, ponieważ musiałem przesłać zrzuty ekranu.
UTF-8