コマンドラインからビデオカードのオーディオ出力を切り替えようとしています。画像に表示されているように、GUI設定を介してそれを行うことができます。 プログラムでこれを行うにはどうすればよいですか?
写真では、それぞれ2つの出力を持つ2つのオーディオデバイスが示されています。
(緑)デバイス1-内蔵オーディオ 2つの出力:
(赤)デバイス2-HDMIオーディオコントローラー NVidia GTX 660の。ビデオカードには2つのモニターが接続されています。
最初のモニターはLG TVで、HDMI-に接続されています。
2番目のモニターはLG ULTRAWIDEで、DVI-I-1に接続されています。
そこで、コマンドラインを使用して、red出力(2つのモニター)を切り替えます。私の研究で見つけたのは、オーディオデバイス(サウンドカード)を切り替える方法です。これらの質問として、私はすでにいくつかのトピックを読みました。
最初のモニターLG TV | HDMI-は音声出力として使用されます:
$ pactl list sinks short
8 alsa_output.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
16 alsa_output.pci-0000_03_00.1.hdmi-stereo module-alsa-card.c s16le 2ch 44100Hz RUNNING
$ pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
name: <alsa_output.pci-0000_03_00.1.hdmi-stereo>
2番目のモニターLG ULTRAWIDE | DVI-I-1は音声出力として使用されます:
$ pactl list sinks short
8 alsa_output.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
17 alsa_output.pci-0000_03_00.1.hdmi-stereo-extra1 module-alsa-card.c s16le 2ch 44100Hz RUNNING
$ pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
name: <alsa_output.pci-0000_03_00.1.hdmi-stereo-extra1>
pacmd list-cards
およびpactl list cards
の出力が提供されます here 。
(この特定のケースで)sink 16
とsink 17
を切り替える方法を探していることがわかります。ただし、sink 16
がpactl list sinks
で表示される場合、sink 17
は表示されず、その逆も同様です。 GUI設定からのみ切り替えることができます。ここでコマンドライン経由でそれを行う方法はありますか?
@ Thomas との議論のおかげで、適切なサーム(キーワード)はprofileとcard。質問に関してはprofilesはinputsとoutputs。 カードはオーディオデバイスです。そして、sink番号はそれほど重要ではありませんが、必要です。
同じ情報を出力するコマンドpacmd list-cards
またはpactl list cards
を使用して、各カード名で使用可能なすべてのプロファイルを見つけることができます。
$ pactl list cards
Card #0
Name: alsa_card.pci-0000_00_1b.0
...
Profiles:
input:analog-stereo: Analog Stereo Input (sinks: 0, sources: 1, priority: 60, available: yes)
output:analog-stereo: Analog Stereo Output (sinks: 1, sources: 0, priority: 6000, available: yes)
output:analog-stereo+input:analog-stereo: Analog Stereo Duplex (sinks: 1, sources: 1, priority: 6060, available: yes)
output:analog-surround-21: Analog Surround 2.1 Output (sinks: 1, sources: 0, priority: 800, available: yes)
...
Active Profile: output:iec958-stereo+input:analog-stereo
...
Card #1
Name: alsa_card.pci-0000_03_00.1
...
Profiles:
output:hdmi-stereo: Digital Stereo (HDMI) Output (sinks: 1, sources: 0, priority: 5400, available: yes)
output:hdmi-stereo-extra1: Digital Stereo (HDMI 2) Output (sinks: 1, sources: 0, priority: 5200, available: yes)
output:hdmi-surround-extra1: Digital Surround 5.1 (HDMI 2) Output (sinks: 1, sources: 0, priority: 100, available: yes)
output:hdmi-surround71-extra1: Digital Surround 7.1 (HDMI 2) Output (sinks: 1, sources: 0, priority: 100, available: yes)
...
Active Profile: output:hdmi-stereo
...
特定のプロファイルは、次のような形式のコマンドで設定できます。
pactl set-card-profile output:hdmi-stereo <card name|number> <profile name>
上記の4つの出力の質問によると、コマンドは次のとおりです。
pactl set-card-profile alsa_card.pci-0000_03_00.1 output:hdmi-stereo # LG ULTRAWIDE
pactl set-card-profile alsa_card.pci-0000_03_00.1 output:hdmi-stereo-extra1 # LG TV
pactl set-card-profile alsa_card.pci-0000_00_1b.0 output:iec958-stereo # Digital Output
pactl set-card-profile alsa_card.pci-0000_00_1b.0 output:analog-stereo # Headphones
this answer に示されているように、新しいプロファイルが設定されると、次に行うことは次のとおりです。
pacmd set-default-sink <sink number of the target profile>
pacmd move-sink-input "$i" <sink number of the target profile>
# where $i is the index number of any active input: pacmd list-sink-inputs
質問で説明されている私のニーズに応じて、次のスクリプトを作成しました。
#!/bin/bash
# Name: /usr/local/bin/audioswitch
# Usage: audioswitch; audioswitch 1; audioswitch 2; audioswitch 3; audioswitch 4
CARD_1="pci-0000_03_00.1" ### HDMI Audio Controller of NVidia GTX 660
CARD_1_PROFILE_1="hdmi-stereo" # LG ULTRAWIDE
CARD_1_PROFILE_2="hdmi-stereo-extra1" # LG TV
CARD_0="pci-0000_00_1b.0" ### Built-in Audio
CARD_0_PROFILE_1="iec958-stereo" # Digital Output
CARD_0_PROFILE_2="analog-stereo" # Headphones
# Read the user's input
CHOICE="${@}"
choice() {
if [ "$CHOICE" == 1 ]; then CARD="$CARD_1"; PROF="$CARD_1_PROFILE_1" # LG ULTRAWIDE
Elif [ "$CHOICE" == 2 ]; then CARD="$CARD_1"; PROF="$CARD_1_PROFILE_2" # LG TV
Elif [ "$CHOICE" == 3 ]; then CARD="$CARD_0"; PROF="$CARD_0_PROFILE_1" # Digital Output
Elif [ "$CHOICE" == 4 ]; then CARD="$CARD_0"; PROF="$CARD_0_PROFILE_2" # Headphones
else
echo -e "\nYou should choice between:"
echo -e "\n\t[1] LG ULTRAWIDE\n\t[2] LG TV\n\t[3] Digital Output\n\t[4] Headphones\n"
echo -n "Your choice: "; read CHOICE; echo; choice; # call the function again
fi
}; choice # call the function
# Set the choosen card profile as sink
pactl set-card-profile "alsa_card.${CARD}" "output:${PROF}";
# Set the default sink to the new one
pacmd set-default-sink "alsa_output.${CARD}.${PROF}" &> /dev/null
# Redirect the existing inputs to the new sink
for i in $(pacmd list-sink-inputs | grep index | awk '{print $2}'); do
pacmd move-sink-input "$i" "alsa_output.${CARD}.${PROF}" &> /dev/null
done
このスクリプトは、最初の定位置パラメーターの値(1
-4
)を処理できるため、 カスタムキーボードショートカット で使用する準備ができています。追加のパラネットなしで呼び出されると、選択を求められます。
$ audioswitch
You should choice between:
[1] LG ULTRAWIDE
[2] LG TV
[3] Digital Output
[4] Headphones
Your choice: 1