Тестирование, если аудиоустройства / звуковые карты в настоящее время играют?

9

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

Редактировать: молча, я имею в виду, что если что-то играет на этом (не только активирован или открыт)

Что-то вроде этого:

if [[ device0 is silent ]] ; then
    radio $RANDOM
fi

Редактировать 2: я пытаюсь добиться сценария, который воспроизводит радио и может продолжать воспроизводиться при сбое проигрывателя, например, если интернет-соединение обрывается, а проигрыватель не восстанавливается, я убью игрока и начну все сначала

RSFalcon7
источник
Вы имеете в виду инструмент для проверки уровня громкости?
Eddy_Em
нет, проверьте, играет ли что-то или нет
RSFalcon7
1
тогда единственный вариант, который я предполагаю, это проверить «Mix» в alsamixer и попытаться немного записать со звуковой карты, а затем проанализировать громкость в записанном файле. Если он больше, чем порог, вы можете иметь в виду, что ничего не играет. Попробуйте, например sox. В другом случае вы можете попробовать lsof|grep snd. Если нет ничего, вы можете включить радио.
Eddy_Em
Также спросил на Superuser
Гленн Джекман

Ответы:

4

Если вы используете PulseAudio (дистрибутивы Linux на основе Gnome обычно используют PulseAudio, вы можете проверить, работает ли он с ним ps -C pulseaudio) и хотите узнать, отправляют ли некоторые приложения какие-либо данные в какой-либо «приемник», вы можете сделать следующее:

pacmd list-sink-inputs | grep -c 'state: RUNNING'

Тем не менее, при использовании PulseAudio, если вы хотите проверить, не отключен ли звук на выходе, это может быть проще, но вы можете получить состояние «mute» для «потребителя» по умолчанию, используя:

pacmd dump | awk '
  $1 == "set-sink-mute" {m[$2] = $3}
  $1 == "set-default-sink" {s = $2}
  END {print m[s]}'
Стефан Шазелас
источник
Я не уверен, что я использую, но этот скрипт не работал для меня. («Возвращается» noв любой ситуации, играет или нет)
RSFalcon7
Извините, я пропустил эту часть. Я до сих пор не думаю, что это делает то, что запрашивается: если приложение имеет открытое устройство, но не передает ему какие-либо данные, разве это не даст ложный положительный результат?
Жиль "ТАК - перестань быть злым"
1
@ Жиль, в моих тестах (пауза mplayer) он дает State: CORKEDвместо того, чтобы State: RUNNINGв этом случае он все еще работал. Если приложение подает данные молчания (играют молчание), то я полагаю , что все еще будет RUNNING, но в этом случае, я не вижу никакой другой альтернативы , кроме использования pamon на монитор устройстве всех моек и проверить молчание.
Стефан Шазелас
Я проверил, и это работает. Спасибо @Stephane, я бы отдал тебе все свои голоса, если бы мог!
RSFalcon7
3

Если я вас правильно понял, вот пример:

Silence:

fuser /dev/snd/timer && echo "Something is playing" || echo "There's silence"
There's silence

Я включаю дерзкий

fuser /dev/snd/timer && echo "Something is playing" || echo "There's silence"
/dev/snd/timer:      47663
Something is playing

Для OSS chande /dev/snd/timerto /dev/dsp.

Это очень зависимый метод.

Eddy_Em
источник
Из моей домашней работы ( linux.amazingdev.com/blog/archives/000909.html ) кажется возможным, что процесс удерживает устройство, но фактически ничего не воспроизводит. Это правда? (Если так, то это бесполезно)
RSFalcon7
Да, это правда. Если вы нажмете «пауза» или «без звука», это будет так. Но в этом случае вы не можете быть абсолютно уверены, что через пару секунд игрок больше не будет играть. Или вы можете комбинировать этот метод и писать с звуковой карты.
Eddy_Em
В этом случае я ищу способ преодоления сбоев плеера, поэтому, к сожалению, это не сработает
RSFalcon7
1

Предполагая, что вы используете микшер ALSA для своего звука, вы можете использовать его amixerдля запроса информации об аудиоустройствах. Звуковое устройство обычно имеет несколько аудиоканалов - или элементов управления - каждый из которых может быть приглушен и включен. Например, чтобы проверить, Masterне отключен ли элемент управления, вы должны сделать что-то вроде:

if amixer get Master | grep -q off; then
    # action
fi

Используйте setопцию, чтобы выполнить вещи на элементах управления. Смотрите man amixerдля получения дополнительной помощи.


источник
Возможно, в этом вопросе была небольшая неопределенность, которую я отредактировал. К сожалению, amixerэто не сработало, я тестировал в течение 15 минут, при этом ни один игрок не был открыт, и он по-прежнему сообщает о включении звука
RSFalcon7
Это проверяет, отключен ли звуковой канал, а не воспроизводится ли что-то.
Жиль "ТАК - перестань быть злым"
1

Ответ htor, вероятно, сработает, но вполне возможно, что «off» появится где-то еще в выводе, что приведет к неверному результату. Вот более строгая проверка с использованием GNU awk:

if amixer get Master | gawk 'END{ if ( $NF != "[off]" ) { exit 1 } }'; then
    # muted
else
    # unmuted
fi
Крис Даун
источник
Моя amixerпоследняя строка не имеет $6: «Mono: Playback [on]». ( amixerверсия 1.0.26) Возможно $NF, будет более переносимым.
manatwork
@manatwork Спасибо за примечание, вывод выглядел переносимым, но я предполагаю, что меня легко вести ;-)
Крис Даун
Это проверяет, отключен ли звуковой канал, а не воспроизводится ли что-то.
Жиль "ТАК - перестань быть злым"
@ Жиль - Когда я отправил этот ответ, вопрос не описал эту проблему.
Крис Даун