HDMI接続ディスプレイを使用して、ラップトップ(12.04 LTSを使用)でデュアルスクリーンをセットアップしています。すべて正常に動作しますが、ケーブルを接続/切断するたびに、[サウンド]環境設定に移動し、サウンド出力デバイスを手動で変更する必要があります。
ケーブルの接続/切断時に音声出力デバイスを変更する方法はありますか?ディスプレイを接続すると、音声出力がHDMIに設定され、切断すると音声がラップトップスピーカーに戻りますか?
私はついにudev
を使用してこの作業を行うことができました。だから誰かが同じ動作を望んでいる場合、ここに手順があります:
まず、次の内容のファイル/etc/udev/rules.d/hdmi_sound.rules
を作成する必要があります。
SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/hdmi_sound_toggle"
これにより、HDMI接続に変更があるたびに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))
おそらくこれはbashで簡単に作成できますが、私の主な言語はpythonなので使用しました。通知以外はすべて機能します。表示されないため、理由はわかりません。誰かがそれを修正する方法を知っているなら、何か言ってください。
注:script/udevルールの名前は変更できますが、完全なパスを使用する必要があります。
この質問に出くわした人々の利益のために-セーラムのソリューションは13.04に私のためにほとんど働いた、私はウェブ全体からビットとピースを収集することになりました、私にとっての契約ブレーカーは環境変数Pulse_SERVERの欠如だったと思います
ここに私の完全なソリューションがあります。これは基本的に、いくつかの不足している部分でセーラムのソリューションを繰り返しています。また、最初はPythonスクリプトがインポートパスの問題に直面しているのではないかと心配していたため、シェルスクリプトとしても再編集しました(Pythonが大好きでしたが)。
(Salemの回答と同じ)ファイル/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を設定するときにキーワード「export」を削除すると、スクリプトが失敗したことに注意してください。pactlはenv変数を探していると思います
Udevルールをリロードすることを忘れないでください:Sudo udevadm control --reload-rules
更新このスクリプトは14.04用に更新されています。その前は、どこでもUSER_IDではなくUSER_NAMEを使用していました
私は Salem の答えと daniel の答えを取り、いくつかの必要な変更を加えましたが、それらの解決策はすぐに機能しませんでした:
(セーラムの答えと同様)。
コンテンツを含むファイル/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 elemer
--myユーザー名で3回。
次に、chmod 0755 /usr/local/bin/hdmi_sound_toggle
で実行可能にします
Udevルールをリロードすることを忘れないでください:Sudo udevadm control --reload-rules
重要このスクリプトは14.04用に更新されています。その前は、どこでもUSER_IDではなくUSER_NAMEを使用していました
これは、Ubuntu 16.04-17.04で機能し、Pulse Audio 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
重要:ユーザー名「rick」をユーザー名に変更します。
ホットプラグイベント中にudev
からこのスクリプトを呼び出すには、次を含むファイル/etc/udev/rules.d/99-hotplugtv.rules
を作成します。
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/home/rick/bin/hotplugtv"
/home/rick/bin/
をhotplugtv
スクリプトを配置したパスに変更します。