アナログステレオ出力とHDMIオーディオ出力を切り替えるショートカット


18

(モニターの)HDMIオーディオ出力に切り替えて、システムオーディオジャックから通常のオーディオ出力に戻すには(ヘッドフォンの場合、モニターにはオーディオ出力がないため)、サウンド設定を開いて、常に適切なチャンネルを選択します。頻繁に切り替えを行うため、パネルにトグルボタンを作成したり、トグルにショートカットキーを割り当てたりする方法はありますか。

:aplay -l 
**** List of PLAYBACK Hardware Devices ****
card 0: Intel [HDA Intel], device 0: STAC92xx Analog [STAC92xx Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 3: HDMI 0 [HDMI 0]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 7: STAC92xx Digital [STAC92xx Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

ここに画像の説明を入力してください


1
+1キーを1回押すだけで正しいHDMIディスプレイ出力モードとサウンドモードに切り替えることができたら最高です。
キットメンケ

さらに良いのは、このHDMI / Display Portオーディオチャネルを検出したときに自動的に切り替える場合です。これがドッキングの目的です。特定のハードウェアID(MAC)に基づいて構成を変更するドッキングコードを少し覚えているようです。誰がそれが再び呼ばれるのか知っていますか?
イライジャ・リン

回答:


10

pulseaudio私たちは、コマンドラインからの出力シンクを選択することができます:

pacmd set-default-sink "SINKNAME"

このコマンドは、ランチャー、スクリプトで使用したり、キーボードショートカットに割り当てたりして、さまざまなシンクをすばやく切り替えることができます。「SINKNAME」を目的のシンクの名前または番号に置き換えてください。関連する番号と名前を持つ既知のシンクのリストは、次のコマンドで提供されます。

pacmd list-sinks

注:コマンドラインインターフェイスを介した出力シンクの変更は、ストリームターゲットデバイスの読み取りが無効になっている場合にのみ有効になります。これを行うには、対応する行を次の/etc/pulse/default.paように編集します。

load-module module-stream-restore restore_device=false

または、pulseaudioを実行して、内部オーディオデバイスとhdmiデバイスに同時に音声を出力し、仮想出力デバイスを追加するオプションを指定してpaprefsを実行します。

パプリフ


2
pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.analog-stereo"そしてpacmd set-default-sink "alsa_output.pci-0000_00_1b.0.hdmi-stereo"サウンド設定で対応するプロファイルを選択した後にのみ機能します。HDMIを設定していて、アナログステレオのpacmdコマンドをSink alsa_output.pci-0000_00_1b.0.analog-stereo does not exist.実行するとエラーが発生しますが、Sound Preferences GUIからプロファイルを手動で選択して同じコマンドを実行すると、エラーは発生しません。そのため、切り替えるのに役立ちません。
iJeeves

@iJeeves:アップデートの編集をご覧ください。
タックカット

同様の問題。コマンドを実行すると、GUIで視覚的に変更されますが、サウンドはリダイレクトされません。GUIで手動で切り替える必要があります。何か案は?
イライジャリン

1
@ElijahLynn:ストリームを移動する必要がある場合もあります:askubuntu.com/questions/71863/…– Takkat 14
1

@Takkat:私はまだ試していませんでしたが、それは私が抱えていた正確な問題のようです。本当にありがとう!
イライジャリン14年

7

私はこれを非常に迷惑だと感じ、出力を切り替えるスクリプトを作成しました。

#!/bin/bash

CURRENT_PROFILE=$(pacmd list-cards | grep "active profile" | cut -d ' ' -f 3-)

if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo+input:analog-stereo>" ] ; then
        pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo"
else 
        pacmd set-card-profile 0 "output:hdmi-stereo+input:analog-stereo"        
fi

キーボードの未使用キーをバインドして実行します(カスタムコマンドをキーボードショートカットにバインドする方法を参照してください)。


18か月でサインオンしていませんが、これが最良の回答であることを知らせたいだけですIMO +1
WinEunuuchs2Unix

1つのカードの2つのプロファイルだけでなく、2つのカードを切り替える必要がある場合、どうすればよいですか?
-Oebele

2

さらに別のシンクスイッチャースクリプト

Ubuntu 16.04でテスト済み


ただし、これにより、必要なアプリケーションの音声のみを切り替えることができます。

使用法:シンクを変更するアプリケーションに焦点を合わせ、このスクリプトを実行します。それでおしまい!!!

このスクリプトは、フォーカスされているアプリケーションを検出し、そこから再生されているすべてのオーディオを見つけて、次に利用可能なシンクに切り替えます。

https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3

スクリプトの説明

フォーカスされているアプリケーションのPIDを見つける必要があります

しかし、最初にxidが必要です

xprop -root _NET_ACTIVE_WINDOW 

次に、ここ$xidに挿入して、アプリケーションのPIDを取得します

xprop -id $xid _NET_WM_PID

次に、そのPIDに関連するシンク入力を見つける必要があります

まず、コマンドの出力を線形化して、 pacmd list-sink-inputs各行に1つのシンク入力をリストし、同じ行にそのインデックス、シンク、およびpidを表示します。

pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2

段階的に分析してみましょう。

grep -E 'index:|sink:|process.idを含む行のみを保持するindex:sink:またはprocess.id

tr '\n' ' ' すべての行を結合します

tr -d '"'すべての"文字を削除します。引用符なしでpidを取得する必要があります

sed -e 's/index:/\n/g'すべてのindex:出現を改行文字で置き換えます\n

tail -n +2 空であるため、最初の行を削除します

結果は次のようになります。

  180 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 3521
  181 sink: 1 <alsa_output.pci-0000_00_01.0.analog-stereo> application.process.id = 2733
  182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

1行を分析して、その意味を理解しましょう。

  # 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

182シンク入力インデックス、0シンクインデックス、13752最後に属するアプリケーションのPID

次に、各行を繰り返します

... | while IFS= read -r line || [ -n "$line" ]; do
  sink_input_pid=$(echo $line | awk '{print $NF}')

そして最後に、フォーカスされたアプリのpidに一致するシンク入力のpidのみをフィルター処理します

  if [ $sink_input_pid = $app_pid ]; then

データの抽出

ではawk、私たちは私たちに必要な要素を取得することができます

sink_input_index=$(echo $sink_input | awk '{print $1}')
current_sink_index=$(echo $sink_input | awk '{print $3}')

シンクの回転を0から再開するタイミングを知るために、シンクの数を取得します。

sink_list_size=${#sink_list_array[@]}

次のシンクを見つけて、シンクのリストを反復処理し、どれがcurrent_sink_indexと一致するか、次のシンクのインデックスを知る必要があります。

i=0
for sink in "${sink_list_array[@]}"; do
  i=$((($i+1)%sink_list_size))  # i++ mod(#sinks)
  if [ $sink = $current_sink_index ]; then
    next_sink_index=${sink_list_array[i]}
    break
  fi
done

最後に、シンク入力を移動してnext_sink_indexで再生します

pacmd move-sink-input $sink_input_index $next_sink_index

Ubuntu 16.04に関する注意:

ショートカットキーを設定するとき、ubuntuのショートカットマネージャーで動作させることができませんでした。だから私はcompizconfig-settings-managerをインストールする必要がありました

sudo apt-get install compizconfig-settings-manager

+1すると、新規ユーザーとして最初の回答が得られます。元々の質問はUbuntu 11.04に関するものだったため、どのバージョンでテストされたかを指摘する必要があります。
WinEunuuchs2Unix

@ WinEunuuchs2Unixうわー!ありがとうございました :)。タイトルの下にUbuntuのバージョンを追加しました。
マダコル


1

スクリーンショットにはサウンドカードが1つしか表示されていないため、このサウンドカードの出力を切り替える必要があると思います。

例:統合されたサウンドカードを1つ搭載したノートブックがありますが、ドッキングするとデジタル出力(SPDIF)があります。

だから私がしたかったのは、pulseaudioでアクティブな出力または「プロファイル」を切り替えることです。

私はまさにそれを行うコマンドを見つけました:

pacmd set-card-profile 0 output:analog-stereo
pacmd set-card-profile 0 output:iec958-stereo+input:analog-stereo

目的の出力設定(ここではデジタル出力ですが、アナログ(マイクロ)入力)の正しい名前を取得するために行ったことは次のとおりです。

pacmd list | grep output

1

私もこの問題の解決策を見つけようとしています。Ubuntu 11.04の時点では、これは直接可能ではないようです。このガイドでは、HDMIとアナログの両方を個別の出力として追加するだけであるため、pacmdは3つのシンクを表示します。その後、上記のコマンドを使用してシンクを切り替えることができます。(参照

しかし、どうやらUbuntu 11.11には、ジャック検出システムを備えたPulseAudioが搭載されます。以下のWebサイトによると、David Henningssonはudevを介して検出をコーディングしているため、同じサウンドカードの異なるプロファイル間の切り替えを含む、パルスオーディオは自動的に最後に追加された出力に切り替えられます(セットアップの場合と同様)。(こちらをご覧ください

来週の金曜日に最終版を試すときに、これがうまくいくことを願っています。


1

以前の回答の多くに基づいて、再生シンクを使用可能なものと交互に設定するスクリプトを作成しました。

使用する最良の方法は、実行するキーボードショートカットを作成することです。そのため、そのキーの組み合わせを押すたびに、オーディオは次に利用可能なシンクにリダイレクトされます。

コードはこちらから入手できます:https : //gist.github.com/germank/7fa2fb07d45a838bf890addadd8bea8c


0

私の場合、リストにないアナログオプション。pavucontrolをインストールします。 sudo apt install pavucontrol

アプリケーションを起動して、問題を修正できます。

  1. 次をpavucontrol入力して、ターミナルからアプリを起動します:(enter)
  2. 「構成」タブに移動します。
  3. インターンサウンドでアナログステレオ出力プロファイルを選択する

ここに画像の説明を入力してください

ここで、さまざまなプロファイルを選択して選択できます(Linux Mintの下)。

ここに画像の説明を入力してください


0

サウンドスイッチャーインジケーター(PPAの追加が必要)の代わりに、コマンド(またはスクリプト)を作成し、ショートカットで呼び出します。

私の場合hdmi-stereo-extra1+input、プロファイルだったので、1行で次のようになります。

[[ $(pacmd list-cards | grep "active profile" | cut -d " " -f 3-) = "<output:hdmi-stereo-extra1+input:analog-stereo>" ]] && \
     pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo" || \
     pacmd set-card-profile 0 "output:hdmi-stereo-extra1+input:analog-stereo"

カスタムショートカットgnome-control-center keyboard)を使用して実行できbash -cます(他のショートカットと競合する場合は警告が表示されます)。

スクリーンショット

スクリーンショット

私が使う:

  • Super + Alt + o:ヘッドフォンとHDMIの間で出力を切り替えます。
  • Super + Alt + Up:ボリュームアップ
  • Super + Alt + Down:Vol Down

にを追加することもできaliasます.bashrc

Ubuntu 16.04および18.04でテスト済み


スクリプトの動作を上回らない場合は、@ user829996の回答に基づいていくつかの変更を行いました。

#!/bin/bash
set -euo pipefail # strict mode

activeProfile() { pacmd list-cards | grep "active profile" | cut -d " " -f 3-; }
CURRENT_PROFILE="$(eval activeProfile)"

# If it doesn't work run  pacmd list-cards  and try the other outputs from profile section
ANALOG_PROFILE="output:analog-stereo+input:analog-stereo"
HDMI_PROFILE="output:hdmi-stereo-extra1+input:analog-stereo"

if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo-extra1+input:analog-stereo>" ] ; then
  pacmd set-card-profile 0 "$ANALOG_PROFILE"
else
    pacmd set-card-profile 0 "$HDMI_PROFILE"
fi

activeProfile

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