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.
Odpowiedzi:
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 golock-screen-timer
tam, gdzie dźwięk powrócił do laptopa podczas blokowania ekranu.Gdy edytor zostanie otwarty z pustym ekranem, skopiuj i wklej do niego następujące elementy:
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łę.
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:
Zapisz plik i wyjdź.
Aby włączyć regułę (bez ponownego uruchamiania), musimy ponownie załadować udev:
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:
Przełącz na HDMI / TV:
Wróć do wbudowanych głośników:
Pamiętaj, aby zastąpić
rick
swoją nazwą użytkownika.export
linia prawdopodobnie nie jest konieczna, ale załączyłem ją tylko dla bezpieczeństwa.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:
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: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 wcard1
zależności od rozruchu, popraw program, aby odwoływał sięcard*
do przechwytywania obu scenariuszy .źródło
70-persistent-net.rules
ponieważ nie istnieje./etc/udev/rules.d
zawiera tylko jeden plik o nazwie39-smfp_samsung.rules
.cat /sys/class/drm/card0-HDMI-A-1/status
pokazuje poprawny status (próbowałem kilka razy).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.