कनेक्ट / डिस्कनेक्ट पर स्वचालित रूप से एचडीएमआई ध्वनि आउटपुट सेट करें


20

एचडीएमआई कनेक्टेड डिस्प्ले का उपयोग करके मेरे लैपटॉप पर (12.04 एलटीएस का उपयोग करके) एक दोहरी स्क्रीन सेटअप है। सब कुछ ठीक काम करता है, लेकिन हर बार जब मैं केबल को कनेक्ट / डिस्कनेक्ट करता हूं तो मुझे ध्वनि वरीयताओं पर जाना पड़ता है और ध्वनि आउटपुट डिवाइस को मैन्युअल रूप से बदलना पड़ता है।

क्या केबल के कनेक्ट / डिस्कनेक्ट पर ध्वनि आउटपुट डिवाइस को बदलने का कोई तरीका है, इसलिए जब मैं अपने डिस्प्ले को कनेक्ट करता हूं तो साउंड आउटपुट एचडीएमआई पर सेट होता है और जब मैं इसे डिस्कनेक्ट करता हूं तो ध्वनि लैपटॉप वक्ताओं में वापस चली जाती है?


यहां भी यही समस्या।
थियागोपॉनेट

यह पहली बार है जब मैं इस पर किसी भी मदद के लिए आया हूं ... मैं 12.10 पर एक ही नाव में हूं। यह खीझ दिलाने वाला है। यह मेरे अनुभव में 10.10 के बाद से है। कहीं न कहीं एक विन्यास होना चाहिए जो इसे संभाल सके। EDIT: voices.canonical.com/david.henningsson/2012/04/14/… यह इस तरह से उद्देश्य पर सेट है। यह खराब है।
user138216

जांचें कि क्या मेरा उत्तर आपके साथ काम करता है।
सलेम

जवाबों:


11

इस प्रश्न पर ठोकर खाने वाले लोगों के लाभ के लिए - सलेम के समाधान ने लगभग 13.04 में मेरे लिए काम किया, मैंने वेब के चारों ओर से बिट्स और टुकड़ों को इकट्ठा किया, मुझे लगता है कि मेरे लिए डील ब्रेकर पर्यावरण चर PULSE_SVERVER की कमी थी

यहाँ मेरा पूरा समाधान है, जो मूल रूप से कुछ गायब टुकड़ों के साथ सलेम के समाधान को दोहरा रहा है। मैंने इसे एक शेल स्क्रिप्ट (पायथन के लिए अपने प्यार के बावजूद) के रूप में भी भुनाया क्योंकि मुझे पहले से डर था कि मेरी पायथन स्क्रिप्ट आयात पथ मुद्दों में चल रही है:


(सलेम के जवाब के समान) /etc/udev/rules.d/hdmi_sound.rulesसामग्री के साथ मूल के रूप में एक फ़ाइल बनाएँ :

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

/usr/local/bin/hdmi_sound_toggleसामग्री के साथ रूट के रूप में एक फ़ाइल बनाएँ :

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

फिर इसके साथ निष्पादन योग्य बनाएं chmod 0755 /usr/local/bin/hdmi_sound_toggle

मैंने इस स्क्रिप्ट को यथासंभव सामान्य बनाने की कोशिश की, लेकिन आपको अभी भी कुछ लाइनों को बदलने की आवश्यकता हो सकती है, जैसे कि HDMI_STATUS फ़ाइल पथ या उपयोग की गई प्रोफ़ाइल। आप प्रोफ़ाइल की सूची को चलाकर pactl list cardsऔर देख कर देख सकते हैं ।

ध्यान दें कि PULSE_SERVER सेट करते समय कीवर्ड "निर्यात" हटा देने पर स्क्रिप्ट मेरे लिए विफल हो गई, मुझे लगता है कि pactl env वैरिएबल की तलाश में है

अपने udv नियमों को पुनः लोड करना न भूलें: sudo udevadm control --reload-rules

अद्यतन इस स्क्रिप्ट 14.04 के लिए अद्यतन किया जाता है। इससे पहले, आप हर जगह USER_ID के बजाय USER_NAME का उपयोग करेंगे


1
ध्यान दें कि मुझे | uniqUSER_NAME कमांड में संलग्न होना चाहिए। यह भी ध्यान दें कि उबंटू में ध्वनियां सेटिंग धोखा दे सकती हैं। मुझे साउंड सेटिंग पैनल में बदलाव नहीं दिख रहे थे, लेकिन एक बार जब मैं कुछ खेल रहा था तो ऑडियो आसानी से आगे और पीछे चला जाएगा। मैंने यह भी देखा कि एचडीएमआई को प्लग-इन और अनप्लग करने के कुछ समय बाद, स्क्रिप्ट चलना बंद हो गई (शायद कुछ udv में बग की तरह)।
FuegoFro

1
मैंने | sort -uउपयोगकर्ता नाम में जोड़ा क्योंकि यह अतिरिक्त विकल्प कह रहा था। दिन के अंत में FuegoFro के समाधान के रूप में भी।
हाथी 82२

मैंने इस्तेमाल किया | grep -v pts, coz मुझे वास्तव में एक "रूट" उपयोगकर्ता मिला, वह भी - इस तथ्य के कारण कि मैं केट के माध्यम से स्क्रिप्ट को संपादित कर रहा था, जिसमें एक रूट टर्मिनल खुला था।
शुभ अंक

"कनेक्शन विफलता" प्राप्त करते रहें: कनेक्शन ने p_context_connect को अस्वीकार कर दिया () विफल: कनेक्शन ने जब "पैक्टल" चलाया। : \
टॉमिस्लाव नैक-अल्फ़ेविक 26

7

मैं आखिरकार इस काम का उपयोग करने में कामयाब रहा udev। इसलिए अगर कोई चाहता है कि यहाँ भी वैसा ही व्यवहार हो:

पहले हमें /etc/udev/rules.d/hdmi_sound.rulesनिम्नलिखित सामग्री के साथ एक फ़ाइल बनाने की आवश्यकता है:

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

यह एचडीएमआई कनेक्शन में बदलाव होने पर हर बार udevस्क्रिप्ट निष्पादित करेगा hdmi_sound_toggle। उस स्क्रिप्ट में निष्पादन की अनुमति होनी चाहिए और सामग्री इस प्रकार है:

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

संभवतः यह आसानी से बाश में बनाया जा सकता है, लेकिन जैसा कि मेरी मुख्य भाषा अजगर है मैंने इसका इस्तेमाल किया। अधिसूचना को छोड़कर सब कुछ काम करता है: यह दिखाई नहीं देता है, मैं वास्तव में नहीं जानता कि क्यों। अगर किसी को पता है कि इसे कैसे ठीक करना है तो कृपया कुछ कहें।

नोट: स्क्रिप्ट / udv नियम के नाम बदले जा सकते हैं, लेकिन आपको पूर्ण पथ का उपयोग करने की आवश्यकता है।


3

के आधार पर सलेम के जवाब और डैनियल के जवाब

मैंने सलेम का जवाब लिया और डैनियल का जवाब लिया और कुछ आवश्यक बदलाव किए, उनके समाधान ने मेरे लिए काम नहीं किया:

(सलेम के जवाब के समान)।

/etc/udev/rules.d/hdmi_sound.rulesसामग्री के साथ रूट के रूप में एक फ़ाइल बनाएँ :

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

नोट ACTION=="change", गायब है!

/usr/local/bin/hdmi_sound_toggleसामग्री के साथ रूट के रूप में एक फ़ाइल बनाएँ :

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

नोट USER_NAME =who | grep "(:0)" | cut -f 1 -d ' '| sort -u मैंने जोड़ा| sort -uक्योंकि अन्यथा यहelemer elemer elemer3 बार - उपयोगकर्ता नाम केसाथ वापस आया।

फिर इसके साथ निष्पादन योग्य बनाएं chmod 0755 /usr/local/bin/hdmi_sound_toggle

अपने udv नियमों को पुनः लोड करना न भूलें: sudo udevadm control --reload-rules

महत्वपूर्ण यह स्क्रिप्ट 14.04 के लिए अपडेट की गई है। इससे पहले, आप हर जगह USER_ID के बजाय USER_NAME का उपयोग करेंगे

क्रेडिट: सलेम और डेनियल


1

उबंटू 16.04 - 17.04 उत्तर

यह उबंटू 16.04 - 17.04 के लिए काम करता है जिसने पल्स ऑडियो के साथ एक बग पेश किया। 8. फ़ाइल बनाएं hotplugtv(या hotplug-hdmiयदि आप चाहें) और निम्न पंक्तियों में कॉपी करें:

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

महत्वपूर्ण: उपयोगकर्ता नाम "रिक" को अपने उपयोगकर्ता नाम में बदलें।

udevहॉट-प्लग ईवेंट के दौरान इस स्क्रिप्ट को कॉल करने के लिए फ़ाइल /etc/udev/rules.d/99-hotplugtv.rulesयुक्त बनाएँ :

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

/home/rick/bin/उस पथ में बदलें जहाँ आपने hotplugtvस्क्रिप्ट रखी थी।


आपको बहुत - बहुत धन्यवाद! यह Ubuntu 17.04 पर भी काम किया! यह मुझे एक लंबे समय के लिए
परेशान कर रहा है

1
आपका बहुत स्वागत है। टिप्पणी के लिए धन्यवाद, इसकी पुष्टि 17.04 के लिए भी आवश्यक है।
विनयुनुच्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.