回答:
コマンドラインからデフォルトのオーディオ出力デバイスを変更するには、pacmd
Pulse Audioコマンドラインユーティリティを使用できます。
今日も同様に行う必要があり、ヘッドフォンとスピーカーを切り替えて、両方を別々のオーディオカードに接続する必要がありました。これを行うために書いたシェルスクリプトを次に示します。
#!/usr/bin/env bash
sinks=($(pacmd list-sinks | grep index | \
awk '{ if ($1 == "*") print "1",$3; else print "0",$2 }'))
inputs=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
[[ ${sinks[0]} = 0 ]] && swap=${sinks[1]} || swap=${sinks[3]}
pacmd set-default-sink $swap &> /dev/null
for i in ${inputs[*]}; do pacmd move-sink-input $i $swap &> /dev/null; done
ノート:
pacmd
ユーティリティがリストする最初の2つのオーディオ出力デバイスが交換されます。3つ以上のオーディオデバイスがあり、別のオーディオデバイスに交換する場合は、7行目のロジックをいくつかの条件に置き換える必要があります。質問はかなり古いですが、私の答えはまだGNOME 2ユーザーにとって有用かもしれません。ここで説明する正確な問題には、PulseAudioミキサーアプレットを使用しました。入力および出力デバイスは、パネルメニューで直接変更できます。私が見つけた最も便利な方法です。
もちろん、アプレットを使用したデバイスの切り替えも正常に機能しています。しかし、スクリプトを書くことの素晴らしい点は、それが超高速であることです。たとえば、キーボードショートカットのalt + sに配置します。したがって、ヘッドフォンからスピーカーに切り替えたいときは、Alt + sを押すだけです。
とにかく。アンドリューは言った:
3つ以上のオーディオデバイスがあり、別のオーディオデバイスに交換する場合は、7行目のロジックをいくつかの条件に置き換える必要があります。
それが私がしたことです。誰かが問題を抱えている場合に備えて、私はそれを共有します:
#!/usr/bin/env bash
#sinks=($(pacmd list-sinks | grep index | \
# awk '{ if ($1 == "*") print "1",$3; else print "0",$2 }'))
sinks=($(pacmd list-sinks | grep index | \
awk '{ if ($1 == "*") print "1"; else print "0" }'))
inputs=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
#find active sink
active=0
for i in ${sinks[*]}
do
if [ $i -eq 0 ]
then active=$((active+1))
else break
fi
done
#switch to next sink
swap=$(((active+1)%${#sinks[@]}))
pacmd set-default-sink $swap &> /dev/null
for i in ${inputs[*]}; do pacmd move-sink-input $i $swap &> /dev/null; done
私が異なってやったことは、a)forループでアクティブなシンクを見つけることです。b)インデックスを1増やして次のシンクに切り替えます。その後、結果をシンクの数でモジュロします。これにより、たとえば3つのシンクがある場合、(2 + 1)%3 = 0になります。したがって、シンクインデックス2からシンクインデックス0に切り替えます。
このようにして、スイッチは使用可能なシンクを上に移動できます。
スクリプトをありがとう!誰かが使用したい場合のために、入力用の部分(マイク)も追加しました。
while read line ; do
case $line in
*\*\ index*) x=1 ;;
index*) x=0 ;;
name*)
source=$(echo $line | sed -e "s/.*<//;s/>.*//")
if [[ $x = "0" ]] ; then
pacmd set-default-source $source &> /dev/null
fi ;;
esac
done < <(pacmd list-sources | grep -e alsa_input -e index)
サウンドデバイスのリストを循環するには、次のスクリプトを使用します。
#!/bin/bash
declare -i sinks=(`pacmd list-sinks | sed -n -e 's/\**[[:space:]]index:[[:space:]]\([[:digit:]]\)/\1/p'`)
declare -i sinks_count=${#sinks[*]}
declare -i active_sink_index=`pacmd list-sinks | sed -n -e 's/\*[[:space:]]index:[[:space:]]\([[:digit:]]\)/\1/p'`
declare -i next_sink_index=${sinks[0]}
#find the next sink (not always the next index number)
declare -i ord=0
while [ $ord -lt $sinks_count ];
do
echo ${sinks[$ord]}
if [ ${sinks[$ord]} -gt $active_sink_index ] ; then
next_sink_index=${sinks[$ord]}
break
fi
let ord++
done
#change the default sink
pacmd "set-default-sink ${next_sink_index}"
#move all inputs to the new sink
for app in $(pacmd list-sink-inputs | sed -n -e 's/index:[[:space:]]\([[:digit:]]\)/\1/p');
do
pacmd "move-sink-input $app $next_sink_index"
done
#display notification
declare -i ndx=0
pacmd list-sinks | sed -n -e 's/device.description[[:space:]]=[[:space:]]"\(.*\)"/\1/p' | while read line;
do
if [ $(( $ord % $sinks_count )) -eq $ndx ] ; then
notify-send -i notification-audio-volume-high --hint=string:x-canonical-private- synchronous: "Sound output switched to" "$line"
exit
fi
let ndx++
done;
すべてのクレジットはUbuntuフォーラムからtsvetanに送られます。
ラップトップの内蔵スピーカーと、ステレオに接続されているアップルの空港ベースステーションを切り替える方法を探していました。スイッチにホットキーを割り当てることにしました。スイッチを視覚的に確認するためにオーディオ設定ウィンドウを1秒間ポップアップさせ、その後wmctrlを使用してウィンドウを閉じました。
(ラップトップのこれらのキーのFn機能は音量を増減するため、ctrl + F8およびctrl + F9をホットキーとして使用したため、ctrl機能でオーディオ出力を変更することは明らかでした。)
次の2つの(ほぼ同一の)スクリプトを使用しました。
#! /bin/bash
gnome-volume-control -p output &
sleep .7
pacmd set-default-sink 1
sleep .8
wmctrl -c "Sound Preferences"
exit
#! /bin/bash
gnome-volume-control -p output &
sleep .7
pacmd set-default-sink 0
sleep .8
wmctrl -c "Sound Preferences"
exit
最初はAppleベースステーション(ctrl + F9に割り当てた)に変更し、2番目は内部スピーカー(ctrl + F8)に切り替えます。これは、これらがインストールされている唯一の2つの出力デバイスであると想定しています。
Andrewsスクリプトに基づいて作成し、notify-osdを使用して実行内容をアナウンスしました。必要に応じて、名前の付いた行を編集します。
#!/usr/bin/env bash
sinks=($(pacmd list-sinks | grep index | \
awk '{ if ($1 == "*") print "1",$3; else print "0",$2 }'))
inputs=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
[[ ${sinks[0]} = 0 ]] && swap=${sinks[1]} || swap=${sinks[3]}
pacmd set-default-sink $swap
for i in ${inputs[*]}; do pacmd move-sink-input $i $swap &> /dev/null; done
if [ "$swap" = "0" ]; then
notify-send -u normal -i audio-volume-medium-symbolic "Sound output changed. Now using: Corsair 2.1 Speakers!"
else
notify-send -u normal -i audio-volume-medium-symbolic "Sound output changed. Now using: Logitech G930 Headset!"
fi
私は同じ問題を抱えており、Ubuntu Unityデスクトップ用の小さなインジケーターアプレットを作成しました。
以下は、現在フォーカスされているウィンドウのオーディオシンクを循環させる小さなスクリプトです。https://gist.github.com/rif/01ffb5e3eb45d2e4e6ebb4652b3b19ce
pacmdとxdotoolが必要です