仅允许来自一个应用程序的音频

仅允许来自一个应用程序的音频

我想只允许来自某个应用程序的音频。也就是说,我希望默认情况下关闭新节目的音频。

我知道在 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

相关内容