内蔵スピーカーとHDMIスピーカーを自動的に切り替える


18

ヘッドフォンをラップトップのAuxジャックに接続すると、内蔵スピーカーが自動的にミュートされ、ヘッドフォンから音が出ます。私はまさにHDMIにそれが欲しいです。

ビデオを見るために、内蔵スピーカー付きのモニターをラップトップに接続します。ビデオがモニター(デスクから3 m離れた場所)にあるときは非常に奇妙ですが、ラップトップの内蔵スピーカーから音が出ます(ラップトップはデスクに座っています)。

もちろん、サウンド設定に移動して、出力チャンネルをHDMIに切り替えることができます。しかし、その後、数時間前にHDMIケーブルを取り外して、まったく別の場所にあるかもしれませんが、サウンドサーバーはまだHDMI経由で再生しようとしていますが、何も接続されていないため、サウンドは再生されません。

HDMIを介してデバイスが接続されていないときに自動的に内部スピーカーに切り替えることはより重要ですが、デバイスが接続されているときにHDMIを介してサウンド出力に切り替えることは非常に便利です。

これは明らかに11.10では機能しましたが、16.04では機能しません。


ショートカットキーを使用してサウンドを切り替えることは、良い解決策かもしれません。このスレッドの2番目の答えは次のとおりです。askubuntu.com
41858

私はまだそれに対する解決策も探しています(16.04で、提案された解決策はどれも動作しません)。問題はミントフォーラムでも議論されています。
ヒロ主人公

@hiroprotagonistはい、私もです。ここでの答えはほとんどの場合に機能しますが、すべてではありません。
UTF-8

更新によって無効にされていない限り、実際にはUbuntu 14.04で自動的に切り替えが機能しました。
-BurninLeo

回答:


8

バックグラウンド

サスペンド/レジューム中に、音声がHDMI TVからラップトップスピーカーに切り替わるときに、同様の問題が発生しました。再開すると、音はラップトップスピーカーにとどまり、出力デバイスを手動でテレビ入力にリセットする必要がありますSystem Settings-> Sound

これは、Ubuntu 14.04から16.04へのアップグレードに関する最初の迷惑な経験の1つであり、ルートは16.04 LTSに付属するPulseAudio 8へのアップグレードでした

よく検索してから、というスクリプトを作成しましたTV-sound。私はあなた自身のようにテレビを抜き差しすることはしませんが、私はいくつかのグーグル検索を行い、あなたの状況で動作するスクリプトのバリエーションを作成しました。私はそれをテストしましたが、動作します。

手順1:接続されたデバイス間で音声を切り替えるスクリプトを作成する

hotplugtvwhich udevが呼び出すスクリプトを作成します。ただし、この同じスクリプトは多くの場所で呼び出すことができます。たとえば、テスト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

の2つの出現rickを自分のユーザーID に置き換える必要がありますUTF-8

ユーザー名が自動的にbash変数に設定されると、これはより専門的になることがわかりますが、私はまだそれほど熟練していません:(とにかく、ファイルを保存して終了しgeditます。

ステップ2:udevルールを作成する

udevは、HDMIモニターを接続したり取り外したりすると、ホットプラグイベントを監視します。次を入力して、新しいルールを作成します。

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"

ファイルを保存して終了します。

(再起動せずに)ルールを有効にするには、udevをリロードする必要があります。

sudo udevadm control --reload-rules

これで、HDMIモニター/テレビのプラグを抜き差しでき、サウンドが適切に切り替わります。

警告

私のシステムでは、HDMIが接続されていない場合、サウンドは自動的にラップトップスピーカーに戻ります。お使いのシステムではそうではありませんでした。HDMIが接続されていないときにラップトップスピーカーに音が出ない場合は、コードをさらに強化する必要があります。物事がどのように機能するか、またはうまくいかないかを以下のコメントで返信してください。

CLIでのクイックテスト

次を使用して、ターミナルでコードをすばやくテストできます。

    export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
  • HDMI / TVへの切り替え:

        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内でデバイス名を解読する

以下のコードは、同じコマンドを2回使用しています。サウンドが外部HDMI TVに設定されると1回。サウンドがラップトップの内蔵スピーカーに設定される2回目。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以外のカード番号を使用できます。

2016年12月2日編集

何らかの未知の理由で、スクリプトは今日壊れました。上記のコードは「$(cat / sys / class / drm / card0-HDMI-A-1 / status」と読みましたが、変更card0する必要がcard1あり、上記のコードはそのように改訂されました。変更内容については説明できません。 2016年11月26日以降の定期的なUbuntu更新以外の私のシステム

2016年12月14日編集

上記のコードは再び「$(cat / sys / class / drm / card0-HDMI-A-1 / status」に切り替える必要があります。ブート間card0およびcard1ブートに応じてコードを修正する代わりに、card*両方のシナリオをキャプチャするようにプログラムを修正します。


70-persistent-net.rules存在しないためコピーできません。/etc/udev/rules.dという単一のファイルのみが含まれています39-smfp_samsung.rules
UTF-8

まあ、30-smfp_samsung.rulesをコピーします。新しいファイルに適切な権限があることを確認するためだけにファイルの内容は必要ありません。既存のファイルをコピーするのが最も簡単な方法です(とにかく私にとって)。
WinEunuuchs2Unix

1
私のシステムでは動作しません。この答えをすでに支持している@人:それはあなたに効果がありますか?| 最初に再起動せずに試しましたが、うまくいきませんでした。再起動後も動作しません。再起動する前に、HDMIを切断し、サウンドを内蔵スピーカーに設定しました。再起動後、音楽を再生し、HDMIケーブルを接続しました。音楽はまだ(のみ)内蔵スピーカーから出てきました。ユーザー名の2回の出現以外を変更する必要がありますか?cat /sys/class/drm/card0-HDMI-A-1/status正しいステータスを表示します(何度か試しました)。
UTF-8

@ UTF-8コマンドラインで切り替えをテストできる新しいセクションを追加しました。これを実行して、エラーが発生するかどうかを確認してください。
WinEunuuchs2Unix

何があるように思わないoutput:analog-stereopastebin.com/n5bHyhCmその後、私は音が常にHDMI経由で再生されることを期待したいので、これはそれも奇妙ます。HDMIが接続されているときと接続されていないときのサウンド設定のスクリーンショット。編集:私はすでにこれを試しましたが、スクリーンショットをアップロードしなければならなかったため、このコメントを投稿するのにさらに数分かかりました。
UTF-8
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.