स्वचालित रूप से आंतरिक और एचडीएमआई वक्ताओं के बीच स्विच करें


18

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

मैं कभी-कभी वीडियो देखने के लिए अपने लैपटॉप में अंतर्निहित स्पीकर के साथ एक मॉनिटर कनेक्ट करता हूं। यह बहुत अजीब है जब वीडियो मॉनिटर पर होता है (जो मेरे डेस्क से 3 मीटर दूर रखा गया है) लेकिन मेरे लैपटॉप के आंतरिक स्पीकर (लैपटॉप डेस्क पर बैठता है) से ध्वनि निकलती है।

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

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

यह स्पष्ट रूप से 11.10 के साथ काम करता था लेकिन यह 16.04 के साथ काम नहीं करता है।


ध्वनि को टॉगल करने के लिए शॉर्ट-कट कुंजी रखना आपके लिए एक अच्छा समाधान हो सकता है। इस सूत्र पर दूसरा उत्तर यह है कि: askubuntu.com/questions/41858/…
WinEunuuchs2Unix

मैं अभी भी एक समाधान के लिए देख रहा हूँ (16.04 पर, सुझाए गए समाधान कार्यों में से कोई भी नहीं)। समस्या टकसाल फोरम में भी चर्चा की गई है ।
हीरो नायक

@ हिरोप्रोपोलॉजिस्ट हाँ, मैं भी। ऐसा लगता है कि यहां जवाब ज्यादातर मामलों में काम करता है लेकिन सभी में नहीं।
UTF-8

वास्तव में स्वचालित रूप से स्विचिंग ने Ubuntu 14.04 में काम किया, जब तक कि इसे अपडेट द्वारा अक्षम नहीं किया गया था।
बर्निनलियो

जवाबों:


8

पृष्ठभूमि

सस्पेंड / रिज्यूमे के दौरान मुझे ऐसी ही समस्या थी जब एचडीएमआई टीवी से लैपटॉप स्पीकर में ध्वनि स्विच होती थी। फिर से शुरू होने पर ध्वनि लैपटॉप वक्ताओं पर रहेगी और मुझे आउटपुट डिवाइस को टीवी में System Settings-> से मैन्युअल रूप से रीसेट करना होगा Sound

यह Ubuntu 14.04 से 16.04 तक अपग्रेड के साथ मेरे पहले कष्टप्रद अनुभवों में से एक था और रूट PulseAudio 8 में अपग्रेड किया गया था जो 16.04 LTS के साथ आता है।

बहुत खोज के बाद मैंने एक स्क्रिप्ट बनाई जिसका नाम है TV-sound। हालाँकि मैं खुद की तरह टीवी को प्लग और अनप्लग नहीं करता, फिर भी मैंने कुछ गूगल सर्च किया और आपकी स्थिति में काम करने के लिए स्क्रिप्ट की विभिन्नता पैदा की। मैंने इसका परीक्षण किया है और यह काम करता है।

चरण 1: कनेक्टेड डिवाइस के बीच ऑडियो स्विच करने के लिए स्क्रिप्ट बनाएं

हम एक स्क्रिप्ट बनाएंगे hotplugtvजिसे udv कॉल किया जाएगा। यह एक ही स्क्रिप्ट कई स्थानों पर कहा जा सकता है। उदाहरण के लिए, परीक्षण के दौरान मैंने इसका उपयोग lock-screen-timerस्क्रीन लॉक के दौरान लैपटॉप पर वापस जाने पर ध्वनि में किया ।

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

जब संपादक रिक्त स्क्रीन के साथ खुलता है, तो उसमें निम्नलिखित को कॉपी और पेस्ट करें:

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

आपको rickअपनी उपयोगकर्ता आईडी UTF-8, आदि के साथ दो घटनाओं को प्रतिस्थापित करना होगा ।

मुझे पता है कि यह उपयोगकर्ता नाम के साथ स्वचालित रूप से एक bash वैरिएबल पर सेट किया जा सकता है, लेकिन मैं अभी तक कुशल नहीं हूं :( वैसे भी, फ़ाइल सहेजें और बाहर निकलें gedit

चरण 2: udev नियम बनाएं

जब आप प्लग इन करते हैं और अपने एचडीएमआई मॉनिटर को अनप्लग करते हैं, तो udv हॉटप्लग घटनाओं की निगरानी करता है। नया नियम बनाने के लिए निम्नलिखित टाइप करें।

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

ध्यान दें: यदि फ़ाइल 70-persistent-net.rulesआपकी निर्देशिका में मौजूद नहीं है तो वहां किसी अन्य फ़ाइल की प्रतिलिपि बनाएँ। हमें फ़ाइल सामग्री की आवश्यकता नहीं है, बस यह सुनिश्चित करने के लिए फ़ाइल अनुमतियाँ हमारे समान हैं।

संपादक अप्रासंगिक पाठ का एक गुच्छा दिखाएगा, इसे हाइलाइट करें और इसे हटा दें। फिर नीचे दिए गए कोड को हाइलाइट करें और इसे संपादक में पेस्ट करें:

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

फ़ाइल सहेजें और बाहर निकलें।

नियम (रिबूट किए बिना) को सक्षम करने के लिए हमें udv को फिर से लोड करना होगा:

sudo udevadm control --reload-rules

अब आप अपने एचडीएमआई मॉनिटर / टीवी को प्लग और अनप्लग कर सकते हैं और ध्वनि उचित रूप से स्विच कर सकते हैं।

चेतावनी

एचडीएम अनप्लग होने पर मेरे सिस्टम पर ध्वनि स्वचालित रूप से लैपटॉप स्पीकर पर निर्भर हो जाती है। आपके सिस्टम पर यह नहीं था। अगर एचडीएमआई अनप्लग्ड है तो साउंड आपके लैपटॉप स्पीकर्स में नहीं जाता है तो कोड में और इज़ाफ़ा आवश्यक हो सकता है। कृपया नीचे टिप्पणी के माध्यम से उत्तर दें कि चीजें कैसे काम करती हैं / काम नहीं करती हैं।

सीएलआई में त्वरित परीक्षण

आप जल्दी से टर्मिनल पर कोड का उपयोग करके परीक्षण कर सकते हैं:

    export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
  • एचडीएमआई / टीवी पर स्विच करें:

        sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
  • निर्मित स्पीकर में वापस स्विच करें:

        sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
  • rickअपने उपयोगकर्ता नाम के साथ बदलना याद रखें ।

  • प्रारंभिक exportपंक्ति शायद आवश्यक नहीं है, लेकिन मैंने इसे सिर्फ सुरक्षित होने के लिए शामिल किया है।
  • यदि आपके पास कई साउंड कार्ड हैं, या hdmi-stereoआपकी स्क्रिप्ट लिखने से पहले सही मापदंडों का पता लगाने के लिए स्पष्ट रूप से जुड़वाओं के अलावा कुछ और आवश्यक हैं।

पल्सएडियो के भीतर अपने डिवाइस का नाम तय करना

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

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

जब आपके पास कई साउंड कार्ड हैं

aplay -lयह देखने के लिए कमांड का उपयोग करें कि आपके पास नंबर 0. से अधिक के कार्ड हैं या नहीं, यदि आपको अपनी स्क्रिप्ट में उपयुक्त कार्ड नंबर का उपयोग करने की आवश्यकता है। उदाहरण के लिए:

$ 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

उपरोक्त उदाहरण में सभी कार्ड नंबर विभिन्न आउटपुट स्रोतों के साथ 0 हैं। यदि आपके पास USB स्पीकर हैं, तो उनके पास 0 से भिन्न कार्ड नंबर हो सकता है।

2 दिसंबर 2016 को संपादित करें

किसी अज्ञात कारण से आज स्क्रिप्ट टूट गई। "$ (बिल्ली / sys / कक्षा / DRM / card0-HDMI-ए -1 / स्थिति" लेकिन मैं बदलना पड़ा: कोड से ऊपर पढ़ने के लिए प्रयोग किया जाता है card0करने के लिए card1। इसके बाद के संस्करण के रूप में संशोधित किया गया है और कोड मैं व्याख्या नहीं कर सकते क्या बदला 26 नवंबर 2016 से नियमित उबंटू अपडेट के अलावा मेरे सिस्टम पर।

14 दिसंबर 2016 को संपादित करें

उपरोक्त कोड को फिर से स्विच करने की आवश्यकता है: "$ (बिल्ली / sys / वर्ग / ड्रम / card0-HDMI-A-1 / स्थिति"। बूट के बीच card0और card1उसके आधार पर कोड को संशोधित करने के बजाय , card*दोनों परिदृश्यों को कैप्चर करने के लिए संदर्भ के लिए कार्यक्रम को संशोधित करें। ।


मैं कॉपी नहीं कर सकता 70-persistent-net.rulesक्योंकि यह मौजूद नहीं है। /etc/udev/rules.dकेवल एक एकल फ़ाइल शामिल है 39-smfp_samsung.rules
UTF-8

ओह, 30-smfp_samsung.rules को अच्छी तरह से कॉपी करें, हमें केवल अपनी नई फ़ाइल के लिए सही अनुमतियाँ सुनिश्चित करने के लिए फ़ाइल सामग्री की आवश्यकता नहीं है। मौजूदा फ़ाइल को कॉपी करना मेरे लिए सबसे आसान तरीका है (वैसे भी)।
विनयुनुच्स 2 यूनिक्स 6

1
यह मेरे सिस्टम पर काम नहीं करता है। @ व्यक्ति जो पहले ही इस उत्तर को बदल चुका है: क्या यह आपके काम आता है? | मैंने पहली बार इसे रिबूट किए बिना किया था, लेकिन यह काम नहीं किया। यह या तो रिबूट करने के बाद कार्यकर्ता नहीं करता है। मैंने एचडीएमआई को डिस्कनेक्ट कर दिया था और रिबूट करने से पहले आंतरिक वक्ताओं को ध्वनि सेट किया था। रिबूट करने के बाद, मैंने कुछ संगीत बजाए और अपने एचडीएमआई केबल को कनेक्ट किया। संगीत अभी भी (केवल) अंतर्निहित वक्ताओं से बाहर आया था। क्या आपको उपयोगकर्ता नाम की 2 घटनाओं के अलावा कुछ भी बदलना है? cat /sys/class/drm/card0-HDMI-A-1/statusसही स्थिति दिखाता है (मैंने कई बार कोशिश की)।
UTF-8

@ UTF-8 मैंने एक नया खंड जोड़ा है जहां आप कमांड लाइन पर स्विचिंग का परीक्षण कर सकते हैं। क्या आप इसे चला सकते हैं और देख सकते हैं कि क्या त्रुटियां बाहर आती हैं?
WinEunuuchs2Unix

ऐसा प्रतीत होता है कि नहीं output:analog-stereo: pastebin.com/n5bHyhCm यह इसे अजीब भी बनाता है क्योंकि तब मुझे उम्मीद होगी कि साउंड हमेशा एचडीएमआई के माध्यम से खेला जाएगा। एचडीएमआई कनेक्ट होने पर और एचडीएमआई कनेक्ट नहीं होने पर मेरी ध्वनि सेटिंग्स के स्क्रीनशॉट । संपादित करें: मैंने पहले ही यह कोशिश की थी लेकिन मुझे इस टिप्पणी को पोस्ट करने में कुछ और मिनट लगे क्योंकि मुझे स्क्रीनशॉट अपलोड करना था।
UTF-8
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.