特定のアプリケーションでのみオーディオを許可したいです。つまり、新しいプログラムでは基本的にオーディオがオフになるようにしたいのです。
私はPulseAudioでプログラムをミュートできることを知っていますが、問題は(私にとって)新しいプログラムが常に最初に自分でミュートを解除することです。
答え1
残念ながら、このオプションは使用できません...しかし、アプリケーションを起動する前に次のコマンドを実行できます。
for i in $(pactl list sink-inputs short | awk '{print $1}'); do
pactl set-sink-input-mute $i 1
done
すべてのアクティブストリームをミュートします。ただし、新しいストリームはミュートなしで引き続き開きます。これを行うには、新しいストリームを検出して起動時にミュートする別のループを追加できます。
old_list=$(pactl list sink-inputs short)
while true; do
new_list=$(pactl list sink-inputs short)
if [[ "$old_list" != "$new_list" ]]; then
for i in $(pactl list sink-inputs short | awk '{print $1}'); do
pactl set-sink-input-mute $i 1
done
fi
done
今問題は、アプリがミュートになるということです。スクリプト名を指定pa_solo_mode
し、次pa_solo_mode mycommand -with --any --option
のように使用すると想像してください。
pa_solo_mode vlc -v
これでプロセス名を検出し、コマンドが異なる場合にのみサイレントします。
function get_stream_pid_list {
pactl list sink-inputs | awk '
/application.process.id/ {
gsub("\"", "", $3)
print $3
}'
}
function get_stream_index_from_pid {
pid=$1
pactl list sink-inputs | awk '
/^Sink Input #[0-9]+$/ {
sub("#", "", $3)
x=$3
}
/application.process.id = "'$pid'"/ {
print x
}'
}
function daemon_mute_except {
except_pid=$1
echo "Muting all streams except $except_pid!"
while true; do
for pid in $(get_stream_pid_list); do
if [[ "$except_pid" != "$pid" ]]; then
index=$(get_stream_index_from_pid $pid)
pactl set-sink-input-mute $index 1
fi
done
sleep 0.25
done
}
# run our command and take its PID
$@ &
except_pid=$!
# start the daemon: continuously mute streams
daemon_mute_except $except_pid