スピーカーと通常のマイクに加えて、時々使用する素晴らしいワイヤレスヘッドフォンセットがあります。
ある入力ソースと出力ソースを別のソースに切り替えるスクリプトを作成したいと思います。本質的にヘッドフォンとスピーカー+マイクを切り替えます。
私はこれを変えたい:
...これ:
2つの入力と出力間の転送をスクリプト化する方法はありますか?本質的に私は次のようなものを探しています:
CURRENT_INPUT="$(get-current-input-name)"
CURRENT_OUTPUT="$(get-current-output-name)"
if [ "$CURRENT_INPUT" == "Vengeance 2000" ]; then
set-current-input "HD Pro Webcam C920"
else
set-current-input "Vengeance 2000"
fi
if ["$CURRENT_OUTPUT" == "Vengeance 2000" ]; then
set-current-output "Built-in Audio"
else
set-current-output "Vengeance 2000"
fi
これをスクリプトで書く方法はありますか?
答え1
@Teresa-e-Juniorが指摘したように、pactl
使用するツールは次のとおりです。
まず、PA受信機のIDを取得する必要があります。私のシステムでは、次のような結果が得られます。
$ pactl list short sinks
0 alsa_output.pci-0000_01_00.1.hdmi-surround module-alsa-card.c s16le 6ch 44100Hz SUSPENDED
1 alsa_output.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 44100Hz RUNNING
受信機1は現在私のデフォルトの受信機です。
しかし、今では、現在と将来のすべてのストリームがHDMI(例:レシーバー0)を介して再生されるようになりました。
PulseAudioのデフォルトのリスナーを設定するコマンドがありますが、私のコンピュータには何の影響もありません。
$ pacmd set-default-sink 0 #doesn't work on my PC :(
代わりに、新しいストリームは、最近ストリームが移動したシンクに接続されているように見えます。
したがって、現在再生中のすべてのストリームをシンクに移動するようにpactlに指示します0
。まず、リストをリストする必要があります。
$ pactl list short sink-inputs
290 1 176 protocol-native.c float32le 2ch 44100Hz
295 1 195 protocol-native.c float32le 2ch 44100Hz
いいですね。 2つのストリーム(ID 290と295)があり、どちらもシンクに接続されています1
。
下に移動してみましょう0
。
$ pactl move-sink-input 290 0
$ pactl move-sink-input 295 0
だからこうする必要があります。これで私たちのために作業を行うスクリプトを書くだけです。
#!/bin/bash
if [ -z "$1" ]; then
echo "Usage: $0 <sinkId/sinkName>" >&2
echo "Valid sinks:" >&2
pactl list short sinks >&2
exit 1
fi
newSink="$1"
pactl list short sink-inputs|while read stream; do
streamId=$(echo $stream|cut '-d ' -f1)
echo "moving stream $streamId"
pactl move-sink-input "$streamId" "$newSink"
done
受信者IDまたは受信者名をパラメータとして呼び出すことができます(つまり0
、同様のもの)。alsa_output.pci-0000_01_00.1.hdmi-surround
これで、このスクリプトをudevイベントまたはショートカットにリンクできます。
答え2
PulseAudioサウンドサーバーを操作するには、次のコマンドを使用できます。
pacmd - Used to reconfigure a PulseAudio sound server during runtime.
pactl - Used to control a running PulseAudio sound server.
動作方法のいくつかの例は次のとおりです。
pacmd list-sinks
::リスト名またはインデックス番号可能な出会いの場
pacmd set-default-sink [sinkname]
::設定基本出力流し
pacmd set-default-source [sourcename]
::設定基本入力
pacmd set-sink-volume [index] [volume]
:: シンクの設置容量
pacmd set-source-volume index volume
::音量調整範囲0 - 65536(数値が小さいほど音量が小さくなる)
ウィキとマニュアルページから取り込んだ内容の一部です。引用するこれ詳しくはこちらをご覧ください。または、コマンドまたは--help
ページを表示できますman
。
この目的に使用できる既存のコマンドラインツールもあります。その名前はポニーミックス。 PulseAudio用のコマンドラインミキサーです。提供されたリンクはプロジェクトgithubを指します。友達で信頼できるArch Linuxユーザー/開発者が開発しました。 Archが実行されていない場合は、make
ソースで使用してコンパイルできますsudo make install
。
$ ponymix --help
usage: ponymix [options] <command>...
Options:
-h, --help display this help and exit
-c, --card CARD target card (index or name)
-d, --device DEVICE target device (index or name)
-t, --devtype TYPE device type
-N, --notify use libnotify to announce volume changes
--source alias to -t source
--input alais to -t source
--sink alias to -t sink
--output alias to -t sink
--sink-input alias to -t sink-input
--source-output alias to -t source-output
Device Commands:
help display this message
defaults list default devices (default command)
set-default set default device by ID
list list available devices
list-short list available devices (short form)
list-cards list available cards
list-cards-short list available cards (short form)
get-volume get volume for device
set-volume VALUE set volume for device
get-balance get balance for device
set-balance VALUE set balance for device
adj-balance VALUE increase or decrease balance for device
increase VALUE increase volume
decrease VALUE decrease volume
mute mute device
unmute unmute device
toggle toggle mute
is-muted check if muted
Application Commands:
move DEVICE move target device to DEVICE
kill DEVICE kill target DEVICE
Card Commands:
list-profiles list available profiles for a card
list-profiles-short list available profiles for a card(short form)
get-profile get active profile for card
set-profile PROFILE set profile for a card
答え3
Fedora 20を実行しているノートブックでは、HDMI出力は次のように表示されません。流し既定のプロフィールにありますが、別のプロフィールに輪郭それ自体。
私はこのようなシンクを1つだけ持っており、私のラップトップスピーカーで素晴らしい音楽を再生します。
$ pactl list short sinks
8 alsa_output.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 44100Hz RUNNING
実行している場合は、pactl set-card-profile 0 output:hdmi-stereo
HDMI経由で素晴らしい音楽が再生されます。私は得る:
$ pactl list short sinks
14 alsa_output.pci-0000_00_1b.0.hdmi-stereo module-alsa-card.c s16le 2ch 44100Hz RUNNING
デフォルト値を復元するには、を実行しますpactl set-card-profile 0 output:analog-stereo+input:analog-stereo
。どちらかを再起動すると、デフォルト値が再表示されます。
私のカードのプロフィールのリストはpactl list cards
出力のどこかにあります。
答え4
私は新しいアカウントなのでコメントできませんが、@mreithubの答えにいくつかのコードを追加し、オーディオ出力を自動的に繰り返すようにしました。
#!/bin/bash
BACKGROUND_RED="`tput setaf 1` "
$BACKGROUND_WHITE="`tput setaf 6` "
FORGROUND_BLACK="`tput setaf 0` "
DIM="`tput dim` "
INVERT="`tput smso`"
BOLD="`tput bold` "
RESET="`tput sgr0` "
CLEAR="`tput clear` "
echo -e "$CLEAR"
pactl list short sinks >&2
# ------------------------------------
if [ -z "$1" ]; then
echo -en "Usage: $0 <sinkId/sinkName>" >&2
echo -en "Valid sinks:" >&2
exit 1
fi
if [ "$1" == '-' ]; then
echo -en "$INVERT$BACKGROUND_WHITE Current sink : $RESET " >&2
currentSink=$(pactl list short sinks | grep RUNNING | awk '{print $1}' | head -1)
if [ -e $currentSink ];then
currentSink=$(pactl list short sinks | awk '{print $1}' | head -1)
fi
pactl list short sinks | grep "^$currentSink" | awk '{print $1,$2}' >&2
sinks=( $(pactl list short sinks | awk '{print $1}') )
for (( index=0; index <= (${#sinks[@]} * 2); index++ )); do
if [ "${sinks[$((index % ${#sinks[@]}))]}" == "$currentSink" ]; then
newSink="${sinks[$((++index % ${#sinks[@]}))]}"
break
fi
done
else
newSink="$1"
fi
echo "-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_"
echo -en "$INVERT$BACKGROUND_RED New sink : $RESET "
pactl list short sinks | grep --color "^$newSink" | awk '{print $1,$2}' >&2
pacmd set-default-sink "$newSink" >&2
pactl list short sink-inputs|while read stream; do
streamId=$(echo -en $stream|cut '-d ' -f1)
echo -e "$FORGROUND_BLACK$DIM moving stream $streamId $RESET" >&2
pactl move-sink-input "$streamId" "$newSink" >&2
done