Как определить, что звук в настоящее время воспроизводится в Linux?

Я использую ALSA. Я хочу, чтобы ПК не приостанавливался во время воспроизведения звука. Я использую этот bash код для запуска блокировки экрана и команды suspend:

# Run a screen locker.
#xautolock -time 5 -locker slimlock &

# Run suspend
#xautolock -time 6 -locker 'systemctl suspend' &

Я хочу обнаружить, что звук или видео воспроизводятся, и не позволяйте ПК приостанавливаться. Например, псевдокод:

if (video is not played)
{
     run a screen locker
}

if (sound is not played and video is not played)
{
     run suspend command
}

Как определить, что звук или видео воспроизводится с помощью утилиты командной строки?

Ответ 1

Проверьте, содержит ли какой-либо файл /proc/asound/card*/pcm*/sub*/status state: RUNNING.

Ответ 2

Я использую это:

pacmd list-sink-inputs

Ответ 3

Если вы используете xscreensaver, тогда эта команда сообщит вам, выключен ли экран:

xscreensaver-command -time | grep -q 'screen \(locked\|blanked\)'

Обычно видеоплееры останавливают активацию экранной заставки, поэтому, если она активирована, это, вероятно, означает, что нет воспроизведения видео.

Вы можете использовать его следующим образом:

if xscreensaver-command -time | grep -q 'screen \(locked\|blanked\)'; then
    echo Screen is off (screensaver active)
else
    echo Screen is on, video might be playing
fi

Ответ 4

Вы можете попробовать этот script (требуется установка xmacroplay):

#!/bin/bash
# Script to prevent screen blanking when audio is playing.
command -v xmacroplay > /dev/null 2>&1 || { echo "ERROR: must install xmacroplay"; exit -1; }
while true; do
    sleep 50
    if pacmd list-sink-inputs  | grep -w state | grep -q RUNNING ; then
       xmacroplay :0 >& /dev/null <<EOF
MotionNotify 90 90
MotionNotify 120 120
EOF
    fi
done

Ответ 5

Пока работает другой script, он перемещает мышь в фиксированное место. Он пытается переместить его только в том случае, если он не изменился и удерживает его рядом с текущим местоположением.

#!/bin/bash
# Script to prevent screen blanking when audio is playing.
if [ -z DISPLAY ]; then
   DISPLAY=:0
fi
while true; do
    sleep 50
    if pacmd list-sink-inputs  | grep -w state | grep -q RUNNING ; then
        xdotool mousemove_relative -- -1 -1
        sleep 1
        xdotool mousemove_relative -- 1 1 
    fi
done