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


38

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

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

これを変更したい:

...この:

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

これをスクリプト化する方法はありますか?


3
man pactlPulseAudioのコマンドラインオプションをご覧ください。
テレサeジュニア

トピック外:それらのスクリーンショットにあるGUIアプリケーションは何ですか?
WhyNotHugo

小学校のシステム設定です。
ナフトゥリケイ

回答:


53

@ 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 :(

代わりに、最近ストリームが移動されたシンクに新しいストリームが接続されているようです。

したがって、現在再生中のすべてのストリームをsinkに移動するように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

OK、2つのストリーム(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イベントまたはキーショートカットに添付できます。


1
素晴らしいです、ありがとう!これをPythonスクリプトに変換しました。これにより、作業が簡単になりますこちらから入手できます
ナフトゥリケイ


1
@NaftuliTzviKay:あなたのスクリプトはもう利用できません。それでもまだある場合は、[GitHub Gist](gist.github.com)への投稿を検討してください。
デニルソンサマイア14

そしてどうしたら0 sink input(s) available.?しかし、そのくだらないフラッシュプレーヤーはまだオーディオを再生していますか?そして、私はフラッシュプレーヤーを参照client(s) logged inのセクションpacmd list
Zhigalin

1
$ pacmd set-default-sink INDEX私のスクリプトにはまだ必要です。そうでなければ、ボリュームを変更するためのキーボードコマンドは引き続き古いシンクソースを使用します。
myol

9

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(数字が小さいほど音量が低い)

これらは、私がwiki&manページから抜粋したほんの一部です。詳細については、これを参照てください。または、コマンド--helpまたはmanページを表示できます。

また、この目的に役立つコマンドラインツールも既にあります。名前はponymixです。PulseAudioのコマンドラインミキサーです。提供されるリンクは、プロジェクトgithubへのものです。友人であり仲間のArch Linux Trusted User / Developerによって開発されています。あなたがアーチを実行していない場合は、単に使用してソースからコンパイルできmakesudo 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

ねえ、この答えをありがとう!これに関連する問題で私はたくさん助けてくれました。
KlaymenDK

5

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出力のどこかにあります。


この情報は、受け入れられた回答によってすでに提供されています。追加するものがない限り、他のユーザーの回答をコピーしないでください。これはもう一方の答えを再生成し、新しいものや有用なものは何も提供しませんでした!
slm

5
set-card-profile以前は言及されていませんでしたが、それがこの回答に関する最も重要な情報です。
スパイダーマン

0

@cinelliが受け入れた答えを拡張して、次のようなスクリプトを作成しました。

  • スクリプトで定義する必要がある正確に2つのシンク/出力デバイスを切り替えます。
  • ストリームとデフォルトのシンクを切り替えるため、キーボードのメディアキーが機能し、
  • エコーキャンセルモジュールは変更されません。

必要に応じて変更してください!

#!/bin/bash

# Small script to switch between two hardcoded sound output devices

# Set patterns for devices to be toggled. Have to match to second column
# in output of "pactl list short sinks".
# (Could also hardcode the full names, but this might be a little more robust)
TOGGLE1="Jabra_EVOLVE"
TOGGLE2="Generic_ThinkPad_Dock_USB"

# Discover which sink (output device) is active, and set up toggles
while read -r stream; do
  echo "$stream"
  if echo "$stream" | grep -q "RUNNING"; then
    currentSink=$(echo "$stream" | cut -f2)
  fi
  if echo "$stream" | grep -q "$TOGGLE1"; then
    toggle1Sink=$(echo "$stream" | cut -f2)
  fi
  if echo "$stream" | grep -q "$TOGGLE2"; then
    toggle2Sink=$(echo "$stream" | cut -f2)
  fi
done < <(pactl list short sinks)

# Set up where to switch to
if [ "$currentSink" = "$toggle1Sink" ]; then
  newSink=$toggle2Sink
else
  newSink=$toggle1Sink
fi

# Switch streams AND default sink
pactl list short sink-inputs|while read -r stream; do
    streamId=$(echo "$stream"|cut '-d ' -f1)
    # exclude echo cancellation module, but switch all other streams
    # You can, but don't have to remove if condition if no such module present
    if [ "$streamId" != "0" ]; then
      echo "moving stream $streamId"
      pactl move-sink-input "$streamId" "$newSink"
    fi;
    # Also switch default sink, so media control keys work correctly
    pactl set-default-sink "$newSink"
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.