HDMI ses çıkışını otomatik olarak bağla / kes


20

HDMI bağlantılı bir ekran kullanarak dizüstü bilgisayarımda (12.04 LTS kullanarak) çift ekranlı bir kurulum var. Her şey iyi çalışıyor, ancak kabloyu her takıp / çıkardığımda Ses tercihlerine gitmem ve ses çıkış cihazını manuel olarak değiştirmem gerekiyor.

Kablonun bağlanması / çıkarılması sırasında ses çıkış cihazını değiştirmenin herhangi bir yolu var mı, bu yüzden ekranımı bağladığımda ses çıkışı HDMI olarak ayarlandığında ve bağlantısını kestiğimde ses dizüstü hoparlörlere geri dönüyor mu?


Burada da aynı problem.
ThiagoPonte

Buraya ilk kez yardım için geldim ... 12.10'da aynı gemideyim. Bu sinir bozucu. Deneyimlerime göre 10.10'dan beri bu şekilde oldu. Bir yerde bunu halledebilecek bir yapılandırma olmalı. EDIT: voices.canonical.com/david.henningsson/2012/04/14/… Bu şekilde tasarlanmıştır. Bu korkunç.
user138216

Cevabımın sizinle çalışıp çalışmadığını kontrol edin.
Salem

Yanıtlar:


11

Bu soruya rastlayan insanların yararı için - Salem'in çözümü 13.04'te neredeyse benim için çalıştı, sonunda web'in her yerinden bitler ve parçalar topladım, sanırım benim için anlaşma kırıcısı PULSE_SERVER ortam değişkeninin eksikliği

İşte Salem'in çözümünü birkaç eksik parça ile tekrarlayan tam çözümüm. Ben de (Python sevgime rağmen) bir kabuk komut dosyası olarak redid çünkü ilk başta benim Python komut dosyası alma yolu sorunları çalışıyor korkuyorlardı:


(Salem'in cevabı ile aynı) /etc/udev/rules.d/hdmi_sound.rulesİçeriğe sahip root olarak bir dosya oluşturun :

SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/hdmi_sound_toggle"

/usr/local/bin/hdmi_sound_toggleİçeriği ile kök olarak bir dosya oluşturun :

#!/bin/sh
USER_NAME=`who | grep "(:0)" | cut -f 1 -d ' '`
USER_ID=`id -u $USER_NAME`
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`

export PULSE_SERVER="unix:/run/user/"$USER_ID"/pulse/native"

if [ $HDMI_STATUS = "connected" ]
then
    sudo -u $USER_NAME pactl --server $PULSE_SERVER set-card-profile 0 output:hdmi-stereo+input:analog-stereo
else
    sudo -u $USER_NAME pactl --server $PULSE_SERVER set-card-profile 0 output:analog-stereo+input:analog-stereo
fi

Sonra ile çalıştırılabilir yapın chmod 0755 /usr/local/bin/hdmi_sound_toggle

Bu komut dosyasını olabildiğince genel yapmaya çalıştım, ancak yine de HDMI_STATUS dosya yolu veya kullanılan profiller gibi bazı satırları değiştirmeniz gerekebilir. pactl list cardsProfiller altında çalışıp bakarak profillerin bir listesini görebilirsiniz .

PULSE_SERVER ayarlarken "export" anahtar kelimesini kaldırdığımda komut dosyası benim için başarısız oldu, pactl env değişkenini arıyor düşünüyorum

Udev kurallarınızı yeniden yüklemeyi unutmayın: sudo udevadm control --reload-rules

Güncelleme Bu komut 14.04 güncellenir. Bundan önce, her yerde USER_ID yerine USER_NAME kullanırsınız


1
| uniqUSER_NAME komutuna eklemem gerektiğini unutmayın . Ayrıca Ubuntu'daki ses ayarlarının aldatıcı olabileceğini unutmayın. Ses ayarları panelindeki değişiklikleri görmüyordum, ancak bir şey çaldığımda ses düzgün bir şekilde ileri ve geri dönecekti. udev tür hata).
FuegoFro

1
Ben ekledi | sort -uekstra seçeneği ELEMER ELEMER --- Benim kullanıcı adı diyordu çünkü kullanıcı adına. Günün sonunda FuegoFro'nun çözümü ile aynı.
elemer82

Ben kullandım | grep -v pts, çünkü aslında ben de bir "kök" kullanıcı var - ben bir kök terminali açık olan kate yoluyla komut dosyası düzenlemekti gerçeği nedeniyle.
Auspex

Pakt çalıştırılırken "Bağlantı hatası: Bağlantı reddedildi pa_context_connect () başarısız oldu: Bağlantı reddedildi" ifadesini almaya devam edin. : \
Tomislav Nakic-Alfirevic

7

Sonunda bu işi kullanarak yapmayı başardım udev. Birisi burada aynı davranışı istiyorsa adımlar şunlardır:

İlk /etc/udev/rules.d/hdmi_sound.rulesönce aşağıdaki içeriğe sahip bir dosya oluşturmamız gerekiyor :

    SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/hdmi_sound_toggle"

Bu hale getirecek udevkomut dizisini yürütmek hdmi_sound_toggleHDMI bağlantısı bir değişiklik olduğunda her zaman. Bu komut dosyasının yürütme izni olmalıdır ve içeriği aşağıdaki gibidir:

#!/usr/bin/env python

import subprocess
from syslog import syslog

def output(cmd):
    return subprocess.check_output(cmd, shell=True)

# the following variables may need some modification.
user = "my_username"
card = "/sys/class/drm/card0"
dev_speaker = "output:analog-stereo+input:analog-stereo"
dev_hdmi = "output:hdmi-stereo+input:analog-stereo"
#

interfaces = output("ls {0}".format(card), ).split("\n")

vga = filter(lambda x: "VGA" in x, interfaces)[0]
hdmi = filter(lambda x: "HDMI" in x, interfaces)[0]

syslog("HDMI connection was changed!")

hdmi_connected = output("cat {0}/{1}/status".format(card,hdmi)).startswith("connected")
title = "HDMI was {0}".format("connected" if hdmi_connected else "disconnected")
message = "Audio output has changed to {opt}.".format(opt = "HDMI" if hdmi_connected else "built-in speakers")

cmd = "sudo -u " + user + " /usr/bin/pactl set-card-profile 0 " + (dev_hdmi if hdmi_connected else dev_speaker)

syslog("HDMI was connected." if hdmi_connected else "HDMI was disconnected.")
try:
    a = output(cmd)
    output("sudo -u {0} notify-send \"{1}\" \"{2}\"".format(user, title, message))
    syslog("Audio output changed.")
except Exception as ex:
    syslog("Error changing output device: " + str(ex))

Muhtemelen bu bash'da kolayca yapılabilir, ancak ana dilim python olarak kullandım. Bildirim dışında her şey çalışıyor: görünmüyor, gerçekten nedenini bilmiyorum. Birisi nasıl düzeltileceğini biliyorsa lütfen bir şey söyleyin.

Not: script / udev kuralının adları değiştirilebilir, ancak tam yolu kullanmanız gerekir.


3

Dayanarak Salem 'ın cevabı ve daniel adlı cevabı

Salem'in cevabını ve daniel'in cevabını aldım ve bazı gerekli değişiklikleri yaptım, çözümleri benim için kutudan çıkmadı:

(Salem'in cevabı gibi).

/etc/udev/rules.d/hdmi_sound.rulesİçeriği ile kök olarak bir dosya oluşturun :

SUBSYSTEM=="drm", RUN+="/usr/local/bin/hdmi_sound_toggle"

Not ACTION=="change", eksik!

/usr/local/bin/hdmi_sound_toggleİçeriği ile kök olarak bir dosya oluşturun :

#!/bin/sh
USER_NAME=`who | grep "(:0)" | cut -f 1 -d ' '| sort -u`
USER_ID=`id -u $USER_NAME`
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`

export PULSE_SERVER="unix:/run/user/"$USER_ID"/pulse/native"

if [ $HDMI_STATUS = "connected" ]
then
    sudo -u $USER_NAME pactl --server $PULSE_SERVER set-card-profile 0 output:hdmi-stereo+input:analog-stereo
else
    sudo -u $USER_NAME pactl --server $PULSE_SERVER set-card-profile 0 output:analog-stereo+input:analog-stereo
fi

Not USER_NAME =who | grep "(:0)" | cut -f 1 -d ' '| sort -u ekledim| sort -uaksi takdirde geri geldi çünküelemer elemer elemer--my kullanıcı adı 3 kez.

Sonra ile çalıştırılabilir yapın chmod 0755 /usr/local/bin/hdmi_sound_toggle

Udev kurallarınızı yeniden yüklemeyi unutmayın: sudo udevadm control --reload-rules

Önemli Bu komut dosyası 14.04 için güncellenmiştir. Bundan önce, her yerde USER_ID yerine USER_NAME kullanırsınız

Kredi: Salem ve daniel .


1

Ubuntu 16.04 - 17.04 Yanıt

Bu, Pulse Audio 8 ile ilgili bir hata getiren Ubuntu 16.04 - 17.04 için geçerlidir. Dosyayı oluşturun hotplugtv(veya hotplug-hdmiisterseniz) ve aşağıdaki satırlara kopyalayın:

#!/bin/bash

# NAME: hotplugtv
# PATH: /home/$USER/bin
# DESC: Update pulseaudio output device when HDMI TV plugged / unplugged
# CALL: called from /etc/udev/rules.d/99-hotplugtv.rules 
#       and /home/$USER/bin/lock-screen-timer
# 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.
#       Dec 21, 2016 - Relocated to /home/$USER/bin for calling by lock-screen-timer
#       Aug 06, 2017 - Convert from home grown log-file to universal logger command.

if [[ $(cat /sys/class/drm/card*-HDMI-A-1/status | grep -Ec "^connected") -eq 1 ]]; then
        logger -t /home/rick/bin/log-hotplugtv "HDMI TV connected"
        /bin/sleep 2;
        export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
        sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
else
        logger -t /home/rick/bin/log-hotplugtv "HDMI TV disconnected"
        export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
        sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
fi

exit 0

ÖNEMLİ: "rick" kullanıcı adını kullanıcı adınızla değiştirin.

udevHot-plug olayları sırasında bu komut dosyasını çağırmak için aşağıdakileri /etc/udev/rules.d/99-hotplugtv.rulesiçeren dosyayı oluşturun:

ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/home/rick/bin/hotplugtv"

Komut dosyasını /home/rick/bin/yerleştirdiğiniz yolla değiştirin hotplugtv.


Çok teşekkür ederim! Ubuntu 17.04 üzerinde de çalıştı! Bu uzun zamandır beni rahatsız ediyor ve bu basit bir çözümdü :)
Georgi Koemdzhiev

1
Rica ederim. 17.04 için de gerekli olduğunu onaylayan yorum için teşekkür ederiz.
WinEunuuchs2Unix
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.