1つのアプリケーションでのみオーディオを許可します。

1つのアプリケーションでのみオーディオを許可します。

特定のアプリケーションでのみオーディオを許可したいです。つまり、新しいプログラムでは基本的にオーディオがオフになるようにしたいのです。

私は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

おすすめ記事