接続/切断時にHDMIサウンド出力を自動的に設定する


20

HDMI接続ディスプレイを使用して、ラップトップでデュアルスクリーンをセットアップしています(12.04 LTSを使用)。すべてが正常に機能しますが、ケーブルを接続/切断するたびに、サウンド設定に移動し、サウンド出力デバイスを手動で変更する必要があります。

ケーブルの接続/切断時に音声出力デバイスを変更する方法はありますか?ディスプレイを接続すると、音声出力がHDMIに設定され、切断すると音声がラップトップスピーカーに戻りますか?


ここで同じ問題。
チアゴポンテ

これについての助けを求めてここに来たのは初めてです...私は12.10に同じ船に乗っています。気に障る。私の経験では10.10以降、このようになっています。これを処理できる設定がどこかになければなりません。編集:voices.canonical.com/david.henningsson/2012/04/14/…意図的にそのように設定されています。それは恐ろしいことです。
user138216

私の答えがうまくいくかどうかを確認してください。
セーラム

回答:


11

この質問に出くわした人々の利益のために-セーラムのソリューションは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を使用していました


1
| uniqUSER_NAMEコマンドに追加する必要があることに注意してください。また、Ubuntuのサウンド設定はだまされやすいことに注意してください。サウンド設定パネルの変更は表示されませんでしたが、何かを再生すると、オーディオがスムーズに前後に切り替わります。また、HDMIのプラグインとアンプラグを数回行った後、スクリプトの実行が停止したことにも気付きました。 udevの一種のバグ)。
FuegoFro 14

1
| sort -u追加オプションelemer elemer ---私のユーザー名を言っていたので、ユーザー名に追加しました。一日の終わりにFuegoFroのソリューションと同じ。
elemer82 14年

| grep -v ptsは実際に「root」ユーザーも取得しました。これは、ルートターミナルが開いているkateを介してスクリプトを編集していたためです。
-Auspex

pactlの実行中に、「接続の失敗:接続が拒否されましたpa_context_connect()が失敗しました:接続が拒否されました」を取得し続けます。:\
トミスラフ・ナキク・アルファレビッチ

7

やっとこの作品を使ってやった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ルールの名前は変更できますが、完全なパスを使用する必要があります。


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 elemer--my usernameで3回返されたためです。

次に、それを実行可能にします chmod 0755 /usr/local/bin/hdmi_sound_toggle

udevルールをリロードすることを忘れないでください: sudo udevadm control --reload-rules

重要このスクリプトは14.04向けに更新されています。その前は、どこでもUSER_IDではなくUSER_NAMEを使用していました

クレジット:セーラムダニエル


1

Ubuntu 16.04-17.04回答

これは、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ます。


どうもありがとうございます!Ubuntu 17.04でも動作しました!これは長い間私を悩ませてきましたが、それは簡単な解決策でした:)
ゲオルギKoemdzhiev

1
どういたしまして。17.04にも必要であることを確認するコメントをありがとう。
WinEunuuchs2Unix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.