HDMI bir dizüstü bilgisayara takıldığında HDMI Sese geçme (14.04)


12

Dizüstü bilgisayarımı, takılı olduğunda sesi HDMI'ya ve çıkarıldığında standart analog olarak değiştirmeye çalışıyorum.

Anahtarlama gerçekleştirmek için bir komut dosyası tetiklemek için bir udev kuralı ayarladım, ancak işe almakta sorun yaşıyorum:

  • Ses Ayarlarında HDMI Ses çıkışını seçinceye kadar kullanılabilir bir lavabo olarak tanınmaz, ayrıca HDMI Ses çıkışı seçildikten sonra analog çıkış artık listelenmez.

Aşağıya bakın:

# HDMI plugged in, not selected in Sound settings.
$ pactl list short sinks 
5   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
kingamajick@kingamajick-laptop: ~

# HDMI selected in sound settings    
$ pactl list short sinks 
7   alsa_output.pci-0000_00_1b.0.hdmi-stereo    module-alsa-card.c  s16le 2ch 48000Hz   SUSPENDED
kingamajick@kingamajick-laptop: ~

# HDMI removed
$ pactl list short sinks 
9   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 48000Hz   SUSPENDED

Toggle çıktısını kullandığım komut dosyası aşağıdaki gibidir:

#!/bin/bash
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))

if [ $HDMI_STATUS = "connected" ]
then
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done-server $PULSE_SERVER set-card-profile 0 output:analog-stereo+input:analog-stereo
fi

Komut dosyası, ses ayarlarında HDMI seçmeden önce tetiklediğimde böyle bir lavabo hakkında hata veriyor.


Yanıtlar:


9
  1. Kullanılabilir kartlar ve profilleri kontrol edin

    pactl list cards
    
  2. Varsayılan havuz ve hareketli akışları ayarlamadan önce profili değiştirmek için komut dosyasına aşağıdaki komutu ekleyin

    pactl [options] set-card-profile  CARD PROFILE
    

(Bu yüzden Ses Ayarlarından manuel olarak değiştirmenize gerek yoktur)

Referans:

pactl -h & man pactl


9

Bu bağlantı ve bu bağlantı dayanarak ... ben test ve İNCE İŞLER ubuntu 14.04

içinde bir kural oluşturmalısın /etc/udev/rules.d/100-hdmi_sound.rules

bu içerikle

SUBSYSTEM=="drm", ACTION=="change", RUN+="/lib/udev/hdmi_sound_toggle.sh"

sonra yarat

sudo -H gedit /lib/udev/hdmi_sound_toggle.sh

içeriğinizle

#!/bin/bash

HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
if [ $HDMI_STATUS = "connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi

Umarım yardımcı olabilirim .. ingilizce için üzgünüm ispanyolca konuştu


4

Bunu takiben biraz sorun yaşadım. Orijinal komut dosyasını kopyaladım ve önerildiği gibi değiştirdim ve şimdi çalışıyor.

Başkasının kullanımını kolaylaştırmak için buraya ekliyorum.

#!/bin/bash
## From: /ubuntu/458194/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04
## Script needs to be triggered by a udev rule
## Works manually now

##source ${HOME}/bin/bash_trace
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))

if [ $HDMI_STATUS = "connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi

Şimdi, sadece udev ile tetiklemek istiyorum, ama bunu nasıl yapacağım konusunda bilgim yok.


1
Bu 16.04'te çalışmaz. Tekrar üzerinde çalışıyorum.
Joe

3

Sağlanan komut dosyaları Ubuntu 14.04'teki kutudan udev ile benim için çalışmadı, eklemek zorunda kaldım:

export DISPLAY=:0

başlangıçta, iki pacmd komutunu pactl'e dönüştürün ve son olarak udev kuralından sudo -s -u (user) komutunu kullanarak komut dosyasını çalıştırın.

#!/bin/bash
## From: /ubuntu/458194/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04
## Script needs to be triggered by a udev rule
## Works manually now

export DISPLAY=:0

##source ${HOME}/bin/bash_trace
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pactl list sink-inputs | grep Input | awk '{print $3}' | sed -r 's/^.{1}//')

if [ $HDMI_STATUS = "connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pactl move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pactl move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi

2

Sağlanan tüm komut dosyaları benim için çalışmadı (Ubuntu 16.04), ancak tek bir tıklamayla ses çıkışını değiştirmenize izin veren bu uygulama göstergesini buldum :

https://github.com/lkettenb/sound-output-switcher

(not: öncelikle appindicator paketini yüklemeniz gerekir: sudo apt-get install python-appindicator)

Alternatif bir çözüm olsa da, bunu benimle aynı durumda olabilecek diğerleri için burada bırakacağımı düşündüm ... ama oldukça kolay ve ayrık ;-)


0

Yine öncekine dayanan ancak pactldoğru sunucuya doğru işaret kullanarak çalışan bazı iyileştirmelerle (16.04'te test edilmiş) başka bir çözüm ( kartların ve profillerin adlarını otomatik olarak almak için geliştirilebilir, şimdilik pactl listveya bakın pactl info).

#!/bin/bash

USER_NAME=$(who | grep tty$(sudo fgconsole) | cut -f1 -d' ')
USER_ID=$(id -u "$USER_NAME")
HDMI_STATUS=$(</sys/class/drm/card0/*HDMI*/status)

HDMI_CARD="pci-0000_00_03.0"
HDMI_PROFILE="hdmi-stereo-extra1"

INTERNAL_CARD="pci-0000_00_1b.0"
INTERNAL_PROFILE="analog-stereo"

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

function pactl_cmd() {
  sudo -u $USER_NAME pactl --server $PULSE_SERVER $*
}

if [ "$HDMI_STATUS" = "connected" ]; then
  CARD=$HDMI_CARD
  OUTPUT=$HDMI_PROFILE
else
  CARD=$INTERNAL_CARD
  OUTPUT=$INTERNAL_PROFILE
fi

pactl_cmd set-default-sink alsa_output.$CARD.$OUTPUT
pactl_cmd set-card-profile alsa_card.$CARD output:$OUTPUT

INPUTS=($(pactl_cmd list sink-inputs | grep "^Sink Input #"|cut -d# -f2))
for i in ${INPUTS[*]}; do
  pactl_cmd move-sink-input $i alsa_output.$CARD.$OUTPUT
done

İlgili öz, burada .


Ben de benzer bir komut dosyası kullanarak çalıştı card0ama bir gün bu card1yüzden komut dosyasını değiştirdikten sonra ertesi gün geri değişti card0. Sonunda kodu değiştirdim card*ve o zamandan beri her şey iyi. Sana benzer bir şey olursa sadece bir kafa.
WinEunuuchs2Unix

0

Udev komut dosyaları kök olarak çalışır, ancak hangi ekran yöneticisini kullandığınızı da bilmeniz gerekir. Bu komut dosyaları çalışmalıdır, ancak ekran yöneticisine bunu yapma yetkisi vermelisiniz.

Kullandığınız DM'yi bulun:

pgrep -a Xorg

-Auth seçeneğine bakın, size ekran yöneticisini gösterecektir. En son Ubuntu sürümlerinde lightdm olabilir.

Bu satır aşağıdaki gibi XAUTHORITY değişkeni olarak dışa aktarılmalıdır:

ls /car/run/sddm*

örneğin, bu geçerli bir çıktı olabilir:

/var/lib/mdm/:0.Xauth (Bu komut dosyası tarafından kullanılacaktır)

Senaryonun şöyle görünmesi gerekir:

#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=`ls /var/run/sddm*`
HDMI_STATUS="$(cat /sys/class/drm/card0-HDMI-A-1/status)"
USER=`whoami`
export XAUTHORITY=/home/$USER/.Xauthority
export DISPLAY=:0

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

Bu, ekran yöneticinizin HDMI çıkışını değiştirmesine izin verecektir. Udev kural dosyalarını oluşturmak ve komut dosyasını yürütülebilir yapmak için talimatları izleyin.

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.