एचडीएमआई को एक लैपटॉप में प्लग करने पर एचडीएमआई ऑडियो पर स्विच करना (14.04)


12

मैं अपने लैपटॉप को एचडीएमआई में स्विच करने के लिए ऑडियो प्राप्त करने की कोशिश कर रहा हूं जब इसे प्लग किया जाता है, और इसे हटाए जाने पर मानक एनालॉग पर वापस।

मैंने स्विच करने के लिए स्क्रिप्ट को ट्रिगर करने के लिए एक udv नियम स्थापित किया है, हालांकि मुझे काम करने में समस्या हो रही है:

  • ऐसा प्रतीत होता है कि जब तक मैं ध्वनि सेटिंग्स में एचडीएमआई ऑडियो आउटपुट का चयन नहीं करता हूं, तब तक यह उपलब्ध सिंक के रूप में मान्यता प्राप्त नहीं है, एचडीएमआई ऑडियो आउटपुट का चयन करने के बाद, एनालॉग आउटपुट अब सूचीबद्ध नहीं है।

नीचे देखें:

# 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

स्क्रिप्ट मैं आउटपुट टॉगल करने के लिए उपयोग कर रहा हूं:

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

स्क्रिप्ट ध्वनि सेटिंग्स में एचडीएमआई का चयन करने से पहले जब मैं इसे ट्रिगर करता हूं तो ऐसी कोई भी त्रुटि नहीं होती है।


2
कुछ समय पहले तक सिमिलर विषय था http://askubuntu.com/questions/317762/is-it-possible-to-automatically-switch-to-hdmi-sound-output-13-04 यहां चर्चा करने के लिए: http : //lists.freedesktop.org/archives/pulseaudio-discuss/2012-March/013009.html
PGR

जवाबों:


9
  1. उपलब्ध कार्ड और प्रोफाइल की जाँच करें

    pactl list cards
    
  2. डिफ़ॉल्ट सिंक और मूविंग स्ट्रीम सेट करने से पहले प्रोफ़ाइल को बदलने के लिए स्क्रिप्ट में निम्न कमांड जोड़ें

    pactl [options] set-card-profile  CARD PROFILE
    

(इसलिए इसे साउंड सेटिंग्स से मैन्युअल रूप से स्विच करने की आवश्यकता नहीं है)

संदर्भ:

pactl -h और man pactl


9

इस लिंक और इस लिंक के आधार पर ... मैंने परीक्षण किया और FINE ubuntu 14.04 को काम करता है

आपको एक नियम बनाना चाहिए /etc/udev/rules.d/100-hdmi_sound.rules

इस सामग्री को

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

तब बनाएँ

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

अपनी सामग्री पर विचार करें

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

मुझे आशा है कि मदद कर सकते हैं .. मेरे अंग्रेजी के लिए मैं स्पेनिश बात की थी


4

मुझे इसका अनुसरण करने में थोड़ी परेशानी हुई। मैंने मूल स्क्रिप्ट की प्रतिलिपि बनाई और इसे सुझाए अनुसार संशोधित किया और अब यह काम करता है।

मैं इसे यहाँ शामिल कर रहा हूँ ताकि किसी और को इसका उपयोग करने में आसानी हो।

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

अब, मैं इसे udv के साथ ट्रिगर करना चाहूंगा, लेकिन मैं यह जानना चाहता हूं कि ऐसा कैसे किया जाए।


1
यह 16.04 में काम नहीं करता है। मैं इस पर फिर से काम कर रहा हूं।
जो

3

प्रदान की गई स्क्रिप्ट मेरे लिए udv के साथ Ubuntu 14.04 के बॉक्स से बाहर काम नहीं करती, मुझे जोड़ना था:

export DISPLAY=:0

शुरुआत में, दो pacmd कमांड को pactl में कनवर्ट करें और अंत में udv नियम से sudo -s -u (उपयोगकर्ता) का उपयोग करके स्क्रिप्ट चलाएं।

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

ठीक है, सभी प्रदान की गई स्क्रिप्ट मेरे लिए काम नहीं करती थी (उबंटू 16.04), लेकिन मुझे यह ऐप संकेतक मिला , जो आपको सिर्फ एक क्लिक में ध्वनि आउटपुट बदलने की अनुमति देता है:

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

(ध्यान दें: आप पहली बार appindicator पैकेज स्थापित करने की जरूरत: sudo apt-get install python-appindicator)

बस मैंने सोचा कि मैं इसे दूसरों के लिए छोड़ दूंगा जो मेरे जैसे ही हो सकता है, भले ही यह एक वैकल्पिक समाधान है ... लेकिन यह इसे बहुत आसान बनाता है और यह असतत है ;-)


0

फिर से एक और समाधान (16.04 में काम किया गया परीक्षण) पिछले पर आधारित है, लेकिन कुछ सुधारों के साथ pactlजो सही सर्वर की ओर इशारा करते हुए काम करता है (यह स्वचालित रूप से कार्ड और प्रोफाइल के नाम प्राप्त करने के लिए, अभी pactl listया इसके 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

संबंधित gist यहाँ है


मेरे पास एक जैसी स्क्रिप्ट थी जो काम कर रही थी card0लेकिन एक दिन यह बदल गया card1इसलिए मैंने स्क्रिप्ट बदल दी और फिर अगले दिन यह वापस बदल गई card0। अंत में मैंने कोड को बदल दिया card*और तब से सब ठीक है। अगर आपके साथ भी कुछ ऐसा ही हो रहा है, तो बस सिर उठाइए।
विनयुनुच्स

0

Udev स्क्रिप्ट रूट के रूप में चलती है, लेकिन आपको यह भी जानना होगा कि आप किस डिस्प्ले मैनेजर का उपयोग कर रहे हैं। यह स्क्रिप्ट काम करना चाहिए, लेकिन आपको इसे करने के लिए ths डिस्प्ले मैनेजर को अधिकृत करना चाहिए।

उस DM का पता लगाएं जिसका आप उपयोग कर रहे हैं:

pgrep -a Xorg

-Auth विकल्प देखें, यह आपको डिस्प्ले मैनेजर दिखाएगा। यह नवीनतम उबंटू रिलीज में sddm ou lightdm हो सकता है।

इस लाइन को XAUTHORITY चर के रूप में निर्यात किया जाना चाहिए:

ls /car/run/sddm*

उदाहरण के लिए, यह एक मान्य आउटपुट हो सकता है:

/var/lib/mdm/ like.Xauth (यह स्क्रिप्ट द्वारा उपयोग किया जाएगा)

इस तरह आपकी स्क्रिप्ट दिखनी चाहिए:

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

यह आपके डिस्प्ले मैनेजर को एचडीएमआई आउटपुट बदलने की अनुमति देगा। Udev नियम फ़ाइलों को बनाने के लिए और स्क्रिप्ट को निष्पादन योग्य बनाने के लिए इनकाउंटरों का पालन करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.