PulseAudioの入力/出力をシェルから変更しますか?

PulseAudioの入力/出力をシェルから変更しますか?

スピーカーと通常のマイクに加えて、時々使用する素晴らしいワイヤレスヘッドフォンセットがあります。

ある入力ソースと出力ソースを別のソースに切り替えるスクリプトを作成したいと思います。本質的にヘッドフォンとスピーカー+マイクを切り替えます。

私はこれを変えたい:

...これ:

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-stereoHDMI経由で素晴らしい音楽が再生されます。私は得る:

$ 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

関連情報