Audio
從 Shell 更改 PulseAudio 輸入/輸出?
除了我的揚聲器和普通麥克風外,我還經常使用一套不錯的無線耳機。
我想編寫一個腳本來在一個輸入和輸出源和另一個之間切換,本質上是我的耳機和我的揚聲器+麥克風之間的切換。
我想在這之間進行更改:
…還有這個:
有沒有辦法讓我編寫兩個輸入和輸出之間的傳輸?基本上我正在尋找這樣的東西:
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
有沒有辦法編寫這個腳本?
正如@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 設置預設接收器,但它似乎對我的 PC 沒有任何影響:
$ pacmd set-default-sink 0 #doesn't work on my PC :(
相反,新的流似乎連接到最近有流移動到它的接收器。
所以讓我們告訴 pactl 將所有目前正在播放的流移動到 sink
0
。我們首先需要列出它們:$ pactl list short sink-inputs 290 1 176 protocol-native.c float32le 2ch 44100Hz 295 1 195 protocol-native.c float32le 2ch 44100Hz
好的,我們有兩個流(ID 290 和 295)都附加到 sink
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 事件或快捷鍵。