Dahili ve HDMI hoparlörler arasında otomatik olarak geçiş yapma


18

Dizüstü bilgisayarınızın aux jakına kulaklık taktığınızda, dahili hoparlörlerin sesi otomatik olarak kapatıldığını ve seslerin kulaklığınızdan nasıl çıktığını biliyor musunuz? HDMI için tam olarak bunu istiyorum.

Bazen video izlemek için yerleşik hoparlörleri olan bir monitörü dizüstü bilgisayarıma bağlarım. Video monitörde olduğunda (garip masamdan 3 m uzağa yerleştirildiğinde) çok garip ama ses dizüstü bilgisayarımın dahili hoparlörlerinden çıkıyor (dizüstü bilgisayar masanın üstüne oturuyor).

Tabii ki, ses ayarlarına gidip çıkış kanalını HDMI olarak değiştirebilirim. Ama sonra, daha sonra, HDMI kablosunu saat önce çıkardığımda ve tamamen farklı bir yerde olabileceğimde, ses çalmayacak çünkü ses sunucusu hala HDMI üzerinden oynatmaya çalışıyor, ancak buna bağlı bir şey yok .

HDMI üzerinden hiçbir cihaz bağlı olmadığında otomatik olarak dahili hoparlörlere geri dönmek daha önemlidir, ancak bir cihaz bağlıyken HDMI üzerinden ses çıkışına geçmek yine de çok hoş olacaktır.

Bu görünüşe göre 11.10 ile çalıştı ama 16.04 ile çalışmıyor.


Sesi değiştirmek için kısayol tuşlarına sahip olmak sizin için iyi bir çözüm olabilir. Bu konudaki ikinci cevap bunu yapar: askubuntu.com/questions/41858/…
WinEunuuchs2Unix

Ben hala bunun için bir çözüm arıyorum (16.04; önerilen çözümlerin hiçbiri işe yaramaz). problem nane forumunda da tartışılmaktadır .
hiro kahramanı

@hiroprotagonist Evet, ben de. Buradaki cevabın çoğu durumda işe yaradığı anlaşılıyor, ancak hepsi değil.
UTF-8

Aslında bir güncelleme tarafından devre dışı bırakılmadığı sürece Ubuntu 14.04'te otomatik olarak geçiş yapıldı.
BurninLeo

Yanıtlar:


8

Arka fon

Sesin HDMI TV'den dizüstü bilgisayar hoparlörlerine geçmesi durumunda bekleme / devam sırasında da benzer bir sorun yaşadım. Devam ettiğinde ses Dizüstü hoparlörlerde kalır ve çıkış cihazını TV'ye manuel olarak sıfırlamak zorunda kalırdım System Settings-> Sound.

Bu yükseltme ile ilk can sıkıcı deneyimleri oldu Ubuntu 14.04 için 16.04 ve kök ile gelir PulseAudio 8'e yükseltme edildi 16,04 LTS

Çok fazla arama yaptıktan sonra adlı bir komut dosyası oluşturdum TV-sound. TV'yi kendiniz gibi takıp çıkarmama rağmen, bazı google aramaları yaptım ve durumunuzda çalışmak için komut dosyasının bir varyasyonunu oluşturdum. Test ettim ve işe yarıyor.

1. Adım: Sesi bağlı cihazlar arasında değiştirmek için komut dosyası oluşturun

hotplugtvUdev adlı bir komut dosyası yaratacağız . Aynı komut dosyası birçok yerde çağrılabilir. Örneğin, test lock-screen-timersırasında ekran kilidi sırasında sesin Dizüstü bilgisayara geri döndüğü yerde kullandım .

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

Editör boş bir ekranla açıldığında, aşağıdakileri kopyalayıp ekrana yapıştırın:

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

İki örneğini rickkendi kullanıcı kimliğinizle (ör UTF-8. Vb.) Değiştirmeniz gerekir .

Bu kullanıcı adı otomatik olarak bir bash değişkenine ayarlanmış daha profesyonel olabileceğini biliyorum ama henüz bu kadar yetenekli değilim :( Her neyse, dosyayı kaydedin ve çıkın gedit.

2. Adım: udev kuralları oluşturun

udev, HDMI monitörünüzü takıp çıkarırken çalışırken takma olaylarını izler. Yeni bir kural oluşturmak için aşağıdakileri yazın.

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

NOT: Dosya 70-persistent-net.rulesdizininizde yoksa, oraya başka bir dosya kopyalayın. Dosya içeriğine ihtiyacımız yok, sadece dosyalarımızın aynı olduğundan emin olmak için dosya izinlerine ihtiyacımız var.

Editör, bir grup alakasız metni gösterecek, vurgulayıp silecektir. Ardından aşağıdaki kodu vurgulayın ve düzenleyiciye yapıştırın:

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

Dosyayı kaydet ve çık.

Kuralı etkinleştirmek için (yeniden başlatmadan) udev'i yeniden yüklememiz gerekir:

sudo udevadm control --reload-rules

Artık HDMI monitörünüzü / TV'nizi ve ses düğmelerini uygun şekilde takıp çıkarabilirsiniz.

Uyarı

Sistemimde, HDMI takılı değilken ses otomatik olarak Dizüstü bilgisayar hoparlörlerine döner. Sisteminizde olmadı. HDMI takılı değilken ses dizüstü hoparlörlerinize gitmezse kodda daha fazla iyileştirme yapılması gerekebilir. Lütfen işlerin nasıl çalıştığını / çalışmadığını aşağıda yorum yoluyla yanıtlayın.

CLI'de hızlı test

Terminali kullanarak kodu hızlı bir şekilde test edebilirsiniz:

    export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
  • HDMI / TV'ye geç:

        sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
  • Dahili hoparlörlere geri dönün:

        sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
  • rickKullanıcı adınızla değiştirmeyi unutmayın .

  • İlk exportsatır muhtemelen gerekli değildir, ancak sadece güvenli olmak için dahil ettim.
  • Birden fazla ses kartınız varsa veya hdmi-stereobetiğinizi yazmadan önce doğru parametreleri bulmak için ince ayarlardan başka bir şey gerekiyorsa.

PulseAudio içinde cihaz adınızın şifresini çözme

Aşağıdaki kod aynı komutu iki kez kullanır. Bir kez ses harici HDMI TV'ye ayarlandığında. Ses dizüstü bilgisayarın yerleşik hoparlörlerine ayarlandığında ikinci kez. PulseAudio adını her gördüğünüzde:

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

Birden fazla ses kartınız olduğunda

aplay -l0'dan büyük kartlarınız olup olmadığını görmek için komutu kullanın. Eğer öyleyse, komut dosyalarınızda uygun kart numarasını kullanmanız gerekecektir. Örneğin:

$ 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

Yukarıdaki örnekte, farklı çıkış kaynaklarına sahip tüm kart numaraları 0'dır. USB hoparlörleriniz varsa 0'dan farklı bir kart numarasına sahip olabilirler.

Düzenle 2 Aralık 2016

Bilinmeyen bir nedenden dolayı senaryo bugün kırıldı. Yukarıdaki kod okumak için kullanılan: "$ (cat / sys / class / drm / card0-HDMI-A-1 / status" ama değiştirmek card0zorunda kaldı card1ve yukarıdaki kod böyle revize edildi. Ne değiştiğini açıklayamıyorum 26 Kasım 2016'dan bu yana düzenli Ubuntu güncellemeleri dışında benim sistemimde.

Düzenle 14 Aralık 2016

Geri tekrar açık olması için gerekli kod Yukarıda: "$ (cat / sys / class / DRM / card0-HDMI-A-1 / durum" Yerine arasındaki kod revize card0ve card1referansına, revize programı açılışta bağlı card*iki senaryoyu yakalamak için .


Kopyalayamıyorum 70-persistent-net.rulesçünkü mevcut değil. /etc/udev/rules.dyalnızca adlı tek bir dosya içerir 39-smfp_samsung.rules.
UTF-8

Oh 30-smfp_samsung.rules kopyalayın, sadece yeni dosyamız için doğru izinlere sahip olduğumuzdan emin olmak için dosya içeriğine ihtiyacımız yok. Varolan bir dosyayı kopyalamak en kolay yoldur (zaten benim için).
WinEunuuchs2Unix

1
Benim sistemimde çalışmıyor. @ Bu yanıtı daha önce onaylamış olan kişi: | İlk olarak yeniden başlatmadan denedim ama işe yaramadı. Yeniden başlattıktan sonra da çalışmıyor. Yeniden başlatmadan önce HDMI bağlantısını kestim ve sesi dahili hoparlörlere ayarladım. Yeniden başlattıktan sonra biraz müzik çaldım ve HDMI kabloyu bağladım. Müzik (yalnızca) yerleşik hoparlörlerden çıktı. Kullanıcı adının 2 tekrarından başka bir şey değiştirmek zorunda mısınız? cat /sys/class/drm/card0-HDMI-A-1/statusdoğru durumu gösterir (birkaç kez denedim).
UTF-8

@ UTF-8 Komut satırında anahtarlamayı test edebileceğiniz yeni bir bölüm ekledim. Bunu çalıştırıp hataların ortaya çıkıp çıkmadığını görebilir misiniz?
WinEunuuchs2Unix

Hayır gibi görünüyor output:analog-stereo: pastebin.com/n5bHyhCm Bu daha da garip hale geliyor, çünkü o zaman sesin her zaman HDMI üzerinden çalınmasını beklerdim. HDMI bağlandığında ve HDMI bağlanmadığında ses ayarlarımın ekran görüntüleri . Düzenleme: Bunu zaten denedim ama ekran görüntüsünü yüklemek zorunda kaldım çünkü bu yorumu göndermek için birkaç dakika daha aldı.
UTF-8
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.