HDMIをラップトップに接続したときにHDMIオーディオに切り替える(14.04)


12

私はラップトップがプラグインされたときにオーディオをHDMIに切り替え、取り外されたときに標準のアナログに戻すようにしようとしています。

切り替えを実行するスクリプトをトリガーするudevルールを設定しましたが、動作させるのに問題があります:

  • サウンド設定でHDMIオーディオ出力を選択するまで、利用可能なシンクとして認識されず、HDMIオーディオ出力を選択すると、アナログ出力は表示されなくなります。

以下を参照してください。

# HDMI plugged in, not selected in Sound settings.
$ pactl list short sinks 
5   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
kingamajick@kingamajick-laptop: ~

# HDMI selected in sound settings    
$ pactl list short sinks 
7   alsa_output.pci-0000_00_1b.0.hdmi-stereo    module-alsa-card.c  s16le 2ch 48000Hz   SUSPENDED
kingamajick@kingamajick-laptop: ~

# HDMI removed
$ pactl list short sinks 
9   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 48000Hz   SUSPENDED

出力を切り替えるトグルを使用しているスクリプトは次のとおりです。

#!/bin/bash
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))

if [ $HDMI_STATUS = "connected" ]
then
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done-server $PULSE_SERVER set-card-profile 0 output:analog-stereo+input:analog-stereo
fi

スクリプトは、サウンド設定でHDMIを選択する前にトリガーすると、そのようなシンクがないというエラーを出します。


回答:


9
  1. 利用可能なカードとプロファイルを確認する

    pactl list cards
    
  2. デフォルトのシンクと移動ストリームを設定する前に、次のコマンドをスクリプトに追加してプロファイルを変更します

    pactl [options] set-card-profile  CARD PROFILE
    

(したがって、サウンド設定から手動で切り替える必要はありません)

参照:

pactl -hman pactl


9

このリンクとこのリンクに基づいて...私はテストし、WORKS FINE ubuntu 14.04

ルールを作成する必要があります /etc/udev/rules.d/100-hdmi_sound.rules

このコンテンツで

SUBSYSTEM=="drm", ACTION=="change", RUN+="/lib/udev/hdmi_sound_toggle.sh"

次に作成する

sudo -H gedit /lib/udev/hdmi_sound_toggle.sh

あなたのコンテンツ

#!/bin/bash

HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
if [ $HDMI_STATUS = "connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi

私はスペイン語を話した私の英語を申し訳ありません。


4

これに続いて少し苦労しました。元のスクリプトをコピーし、提案どおりに変更しましたが、現在は動作します。

他の人が使いやすくするためにここに含めています。

#!/bin/bash
## From: /ubuntu/458194/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04
## Script needs to be triggered by a udev rule
## Works manually now

##source ${HOME}/bin/bash_trace
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))

if [ $HDMI_STATUS = "connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi

今、私はちょうどudevでそれをトリガーしたいのですが、それを行う方法についてはわかりません。


1
これは16.04では機能しません。私は再びそれに取り組んでいます。
ジョー

3

提供されたスクリプトは、Ubuntu 14.04ですぐにudevで機能しなかったため、追加する必要がありました。

export DISPLAY=:0

最初に2つのpacmdコマンドをpactlに変換し、最後にudevルールからsudo -s -u(ユーザー)を使用してスクリプトを実行します。

#!/bin/bash
## From: /ubuntu/458194/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04
## Script needs to be triggered by a udev rule
## Works manually now

export DISPLAY=:0

##source ${HOME}/bin/bash_trace
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pactl list sink-inputs | grep Input | awk '{print $3}' | sed -r 's/^.{1}//')

if [ $HDMI_STATUS = "connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pactl move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pactl move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi

2

さて、提供されたすべてのスクリプトは私にとってはうまくいきませんでした(Ubuntu 16.04)が、ワンクリックでサウンド出力を変更できるこのアプリインジケーターを見つけました

https://github.com/lkettenb/sound-output-switcher

(注:あなたが最初appindicatorパッケージをインストールする必要があります。sudo apt-get install python-appindicator

代替ソリューションであるにもかかわらず、私と同じ状況にある可能性のある他の人のためにこれをここに残すと思っただけですが...


0

前回のではなく、適切な使用して動作しますいくつかの改良に基づいて、再び別の溶液(16.04での作業テスト)pactl(自動的にカードやプロファイルの名前を取得するために改善することができる、を参照してください右のサーバーへのポインティングのpactl listか、pactl info今のところ)。

#!/bin/bash

USER_NAME=$(who | grep tty$(sudo fgconsole) | cut -f1 -d' ')
USER_ID=$(id -u "$USER_NAME")
HDMI_STATUS=$(</sys/class/drm/card0/*HDMI*/status)

HDMI_CARD="pci-0000_00_03.0"
HDMI_PROFILE="hdmi-stereo-extra1"

INTERNAL_CARD="pci-0000_00_1b.0"
INTERNAL_PROFILE="analog-stereo"

export LANG=C
export PULSE_SERVER="unix:/run/user/$USER_ID/pulse/native"

function pactl_cmd() {
  sudo -u $USER_NAME pactl --server $PULSE_SERVER $*
}

if [ "$HDMI_STATUS" = "connected" ]; then
  CARD=$HDMI_CARD
  OUTPUT=$HDMI_PROFILE
else
  CARD=$INTERNAL_CARD
  OUTPUT=$INTERNAL_PROFILE
fi

pactl_cmd set-default-sink alsa_output.$CARD.$OUTPUT
pactl_cmd set-card-profile alsa_card.$CARD output:$OUTPUT

INPUTS=($(pactl_cmd list sink-inputs | grep "^Sink Input #"|cut -d# -f2))
for i in ${INPUTS[*]}; do
  pactl_cmd move-sink-input $i alsa_output.$CARD.$OUTPUT
done

関連要点はこちらです。


を使用して動作する同様のスクリプトがありましたcard0が、ある日に切り替えられたcard1ため、スクリプトを変更し、翌日に変更しましたcard0。結局、コードをに変更しましたcard*が、それ以降はすべて順調です。似たようなことがあなたに起こったら、ただ頭を上げてください。
WinEunuuchs2Unix

0

Udevスクリプトはrootとして実行されますが、使用しているディスプレイマネージャーを知る必要もあります。このスクリプトは機能するはずですが、そのためにはディスプレイマネージャーを認証する必要があります。

使用しているDMを見つけます。

pgrep -a Xorg

-authオプションを参照してください。ディスプレイマネージャーが表示されます。最新のUbuntuリリースでは、sddmまたはlightdmである可能性があります。

この行は、次のようにXAUTHORITY変数としてエクスポートする必要があります。

ls /car/run/sddm*

たとえば、これは有効な出力である可能性があります。

/var/lib/mdm/:0.Xauth(これはスクリプトで使用されます)

スクリプトは次のように見える必要があります。

#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=`ls /var/run/sddm*`
HDMI_STATUS="$(cat /sys/class/drm/card0-HDMI-A-1/status)"
USER=`whoami`
export XAUTHORITY=/home/$USER/.Xauthority
export DISPLAY=:0

if [ "$HDMI_STATUS" = connected ];
then
    sudo -u $USER pactl set-card-profile 0 output:hdmi-stereo+input:analog-stereo
else
    sudo -u $USER pactl set-card-profile 0 output:analog-stereo+input:analog-stereo
fi
exit 0

これにより、ディスプレイマネージャーがHDMI出力を変更できるようになります。手順に従って、udevルールファイルを作成し、スクリプトを実行可能にします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.