पृष्ठभूमि
सस्पेंड / रिज्यूमे के दौरान मुझे ऐसी ही समस्या थी जब एचडीएमआई टीवी से लैपटॉप स्पीकर में ध्वनि स्विच होती थी। फिर से शुरू होने पर ध्वनि लैपटॉप वक्ताओं पर रहेगी और मुझे आउटपुट डिवाइस को टीवी में 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*
दोनों परिदृश्यों को कैप्चर करने के लिए संदर्भ के लिए कार्यक्रम को संशोधित करें। ।