특정 애플리케이션에서만 오디오를 허용하고 싶습니다. 즉, 새 프로그램에서는 기본적으로 오디오가 꺼지도록 하고 싶습니다.
저는 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