HDMI সাউন্ড আউটপুট স্বয়ংক্রিয়ভাবে সংযুক্ত / সংযোগ বিচ্ছিন্ন করুন


20

আমার ল্যাপটপে একটি ডুয়াল স্ক্রিন সেটআপ আছে (12.04 এলটিএস ব্যবহার করে) এইচডিএমআই সংযুক্ত ডিসপ্লে ব্যবহার করে। সবকিছু ঠিকঠাক কাজ করে, তবে প্রতিবারই আমি কেবলটি সংযুক্ত / সংযোগ বিচ্ছিন্ন করতে হয় আমাকে সাউন্ড পছন্দগুলিতে যেতে হবে এবং নিজেই সাউন্ড আউটপুট ডিভাইসটি পরিবর্তন করতে হবে।

ক্যাবলের সংযোগ / সংযোগ বিচ্ছিন্ন করার জন্য সাউন্ড আউটপুট ডিভাইসটি পরিবর্তন করার কোনও উপায় আছে, তাই যখন আমি আমার প্রদর্শনটি সংযোগ করি তখন শব্দ আউটপুট HDMI তে সেট করা থাকে এবং আমি এটি সংযোগ বিচ্ছিন্ন করার পরে শব্দটি ল্যাপটপ স্পিকারগুলিতে ফিরে যায়?


এখানেও একই সমস্যা।
থিয়াগোপন্টে

এই প্রথম আমি এখানে কোনও সাহায্যের জন্য এখানে এসেছি ... আমি 12.10 তে একই নৌকায় আছি। এটা বিরক্তিকর. আমার অভিজ্ঞতার ১০.১০ সাল থেকে এটি এভাবেই। কোথাও একটি কনফিগার থাকতে হবে যা এটি পরিচালনা করতে পারে। সম্পাদনা: ভয়েসস.ক্যানোনিকাল.ডেভিড.হেনিংসন / ২০১৪ / ২০১৪ / ১৪ / ২২ এটি সেই উদ্দেশ্যে সেট করেছে। এটা কি সাংঘাতিক.
ব্যবহারকারী 138216

আমার উত্তরটি আপনার সাথে কাজ করে কিনা তা পরীক্ষা করে দেখুন।
সালেম

উত্তর:


11

এই প্রশ্নটিতে হোঁচট খায় এমন লোকের সুবিধার্থে - ১৩.০৪ সালে সালেমের সমাধান আমার পক্ষে প্রায় কাজ করেছিল, আমি ওয়েবের চারপাশের বিট এবং টুকরোগুলি সংগ্রহ করেছি, আমার মনে হয় আমার জন্য ডিল ব্রেকার পরিবেশের পরিবর্তনশীল PULSE_SERVER এর অভাব ছিল

এখানে আমার সম্পূর্ণ সমাধানটি দেওয়া হয়েছে, যা মূলত কয়েকটি হারিয়ে যাওয়া টুকরোগুলি দিয়ে সালমের সমাধান পুনরাবৃত্তি করছে। আমি এটিকে শেল স্ক্রিপ্ট হিসাবে (পাইথনের প্রতি আমার ভালবাসা সত্ত্বেও) হিসাবে আবারও পাঠিয়েছি কারণ আমার প্রথমে ভয় ছিল যে আমার পাইথন লিপিটি আমদানির পথে ইস্যুতে চলেছে:


(সালেমের উত্তরের মতো) /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

তারপরে এটি কার্যকর করতে সক্ষম করুন make chmod 0755 /usr/local/bin/hdmi_sound_toggle

আমি এই স্ক্রিপ্টটিকে যতটা সম্ভব জেনেরিক করার চেষ্টা করেছি, তবে আপনাকে এখনও কিছু লাইন যেমন HDMI_STATUS ফাইল পাথ বা ব্যবহৃত প্রোফাইলগুলি পরিবর্তন করতে হবে। আপনি pactl list cardsপ্রোফাইলের অধীনে এবং অনুসন্ধান করে প্রোফাইলগুলির একটি তালিকা দেখতে পাচ্ছেন ।

নোট করুন যে স্ক্রিপ্টটি আমার জন্য ব্যর্থ হয়েছিল যখন আমি যখন PULSE_SERVER সেট করার সময় "এক্সপোর্ট" শব্দটি মুছে ফেলতাম, আমার মনে হয় প্যাকটেল এনভেরি ভেরিয়েবলের সন্ধান করছে

আপনার উদেব নিয়মগুলি পুনরায় লোড করতে ভুলবেন না: sudo udevadm control --reload-rules

আপডেট করুন এই স্ক্রিপ্টের 14.04 জন্য আপডেট করা হয়। এর আগে, আপনি সর্বত্র USER_ID এর পরিবর্তে USER_NAME ব্যবহার করবেন


1
নোট করুন যে | uniqUSER_NAME কমান্ডে আমার যুক্ত হওয়া দরকার । এছাড়াও লক্ষ করুন যে উবুন্টুতে শব্দগুলির সেটিংস প্রতারণামূলক হতে পারে। আমি সাউন্ড সেটিংস প্যানেলে পরিবর্তনগুলি দেখছিলাম না, তবে আমি যখন কিছু খেলছিলাম তখন অডিওটি পিছনে পিছনে স্বাচ্ছন্দ্যে ফিরে আসবে আমি আরও লক্ষ্য করেছিলাম যে এইচডিএমআই প্লাগিং এবং আনপ্লাগ করার কয়েকবার পরে, স্ক্রিপ্টটি চালানো বন্ধ হয়ে গেছে (সম্ভবত কিছু udev মধ্যে বাগ ধরণের)।
ফুয়েগোফ্রো

1
আমি | sort -uব্যবহারকারীর নামটিতে যুক্ত করেছি কারণ এটি অতিরিক্ত বিকল্পটি এলেমারের একাদশ বলছিল --- আমার ব্যবহারকারীর নাম। দিনের শেষে ফুয়েগোফ্রো এর সমাধান হিসাবে একই।
elemer82

আমি ব্যবহার করেছি | grep -v pts, কোজ আমি আসলে একটি "রুট" ব্যবহারকারী পেয়েছি, খুব - এই কারণে যে আমি স্ক্রিপ্টটি কেটের মাধ্যমে সম্পাদনা করছিলাম, যার একটি রুট টার্মিনাল খোলা ছিল।
অ্যাসপেক্স

"সংযোগ ব্যর্থতা পেতে থাকুন: সংযোগ pa_context_connect () ব্যর্থ হয়েছে: সংযোগ অস্বীকার করা হয়েছে" প্যাকটেল চলাকালীন। : \
টমিস্লাভ নাকিক-আলফায়ারভিক

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

সম্ভবত এটি সহজে ব্যাশে তৈরি করা যেতে পারে তবে আমার মূল ভাষাটি পাইথন হওয়ায় এটি ব্যবহার করেছি। বিজ্ঞপ্তি ব্যতীত সবকিছুই কাজ করে: এটি প্রদর্শিত হবে না, আমি কেন জানি না। কেউ যদি এটি ঠিক করতে জানেন তবে দয়া করে কিছু বলুন।

দ্রষ্টব্য: স্ক্রিপ্ট / udev নিয়মের নাম পরিবর্তন করা যেতে পারে তবে আপনার পুরো পথটি ব্যবহার করা দরকার।


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 বার - আমার ব্যবহারকারীরসাথে ফিরে আসে।

তারপরে এটি কার্যকর করতে সক্ষম করুন make chmod 0755 /usr/local/bin/hdmi_sound_toggle

আপনার উদেব নিয়মগুলি পুনরায় লোড করতে ভুলবেন না: 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স্ক্রিপ্ট রেখেছেন সেই পথে পরিবর্তন করুন ।


তোমাকে অনেক ধন্যবাদ! এটি উবুন্টুতেও কাজ করেছে 17.04! এটি দীর্ঘদিন ধরে আমাকে
বাগিয়ে দিচ্ছে

1
তোমাকেও স্বাগতম. 17.04 এর পাশাপাশি এটিরও প্রয়োজনীয় মন্তব্যটি নিশ্চিত করার জন্য আপনাকে ধন্যবাদ।
WinEunuuchs2 ইউনিক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.