我想只允许来自某个应用程序的音频。也就是说,我希望默认情况下关闭新节目的音频。
我知道在 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