하나의 애플리케이션에서만 오디오를 허용합니다.

하나의 애플리케이션에서만 오디오를 허용합니다.

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

저는 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

관련 정보