バックグラウンド
サスペンド/レジューム中に、音声がHDMI TVからラップトップスピーカーに切り替わるときに、同様の問題が発生しました。再開すると、音はラップトップスピーカーにとどまり、出力デバイスを手動でテレビ入力にリセットする必要がありますSystem Settings
-> Sound
。
これは、Ubuntu 14.04から16.04へのアップグレードに関する最初の迷惑な経験の1つであり、ルートは16.04 LTSに付属するPulseAudio 8へのアップグレードでした
よく検索してから、というスクリプトを作成しましたTV-sound
。私はあなた自身のようにテレビを抜き差しすることはしませんが、私はいくつかのグーグル検索を行い、あなたの状況で動作するスクリプトのバリエーションを作成しました。私はそれをテストしましたが、動作します。
手順1:接続されたデバイス間で音声を切り替えるスクリプトを作成する
hotplugtv
which 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*
両方のシナリオをキャプチャするようにプログラムを修正します。