Audio

從 Shell 更改 PulseAudio 輸入/輸出?

  • March 16, 2022

除了我的揚聲器和普通麥克風外,我還經常使用一套不錯的無線耳機。

我想編寫一個腳本來在一個輸入和輸出源和另一個之間切換,本質上是我的耳機和我的揚聲器+麥克風之間的切換。

我想在這之間進行更改:

…還有這個:

有沒有辦法讓我編寫兩個輸入和輸出之間的傳輸?基本上我正在尋找這樣的東西:

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 事件或快捷鍵。

引用自:https://unix.stackexchange.com/questions/65246