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 hotplugtv
Udev. Ten sam skrypt można wywołać w wielu miejscach. Na przykład podczas testów użyłem go lock-screen-timer
tam, 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 rick
własnym identyfikatorem użytkownika, tj. UTF-8
Itp.
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.rules
nie 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ć rick
swoją nazwą użytkownika.
- Początkowa
export
linia 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-stereo
poprawki 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 -l
aby 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ć card0
się card1
i 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 card0
i w card1
zależności od rozruchu, popraw program, aby odwoływał się card*
do przechwytywania obu scenariuszy .