¿Prueba si los dispositivos de audio / tarjetas de sonido se están reproduciendo actualmente?

9

¿Existe un programa predeterminado en el que pueda verificar si mis dispositivos de audio están en silencio?

Editar: Por silencio, quiero decir que si hay algo jugando en eso (no solo activado o abierto)

Algo como esto:

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

Edición 2: lo que estoy tratando de lograr es un script que reproduzca la radio y pueda seguir reproduciéndose cuando el reproductor falla, por ejemplo, si la conexión a Internet se cae y el reproductor no se recuperó, mataré al jugador y comenzaré de nuevo

RSFalcon7
fuente
¿Te refieres a una herramienta para verificar el nivel de volumen?
Eddy_Em
no, verifique si hay algo jugando o no
RSFalcon7
1
entonces el único wariant supongo que es marcar "Mix" en alsamixer e intentar grabar un poco desde la tarjeta de sonido, luego analizar el volumen en el archivo grabado. Si es más grande que un umbral, puede significar que no hay nada jugando. Prueba por ejemplo sox. En otro caso puedes intentarlo lsof|grep snd. Si no hay nada, puede encender la radio.
Eddy_Em
También preguntado en Superusuario
glenn jackman

Respuestas:

4

Si está utilizando PulseAudio (las distribuciones de Linux basadas en Gnome tienden a usar PulseAudio, puede verificar si se está ejecutando una ps -C pulseaudio) y desea saber si algunas aplicaciones están enviando datos a algún "sumidero", puede hacer lo siguiente:

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

Aún con PulseAudio, si desea verificar si su salida de sonido está silenciada, puede ser más simple, pero puede obtener el estado "silenciado" del "sumidero" predeterminado usando:

pacmd dump | awk '
  $1 == "set-sink-mute" {m[$2] = $3}
  $1 == "set-default-sink" {s = $2}
  END {print m[s]}'
Stéphane Chazelas
fuente
No estoy seguro de lo que estoy usando, pero este script no funcionó para mí. ("Regresa" noen cualquier situación, jugando o no)
RSFalcon7
Lo siento, me había perdido esa parte. Todavía no creo que esto esté haciendo lo que se solicita: si una aplicación tiene el dispositivo abierto pero no proporciona ningún dato, ¿no daría un falso positivo?
Gilles 'SO- deja de ser malvado'
1
@Gilles, en mis pruebas (pausa mplayer), da en State: CORKEDlugar de State: RUNNINGen ese caso, por lo que aún funcionaría. Si la aplicación alimenta datos de silencio (está reproduciendo silencio), supongo que todavía se mostraría RUNNING, pero en ese caso, no veo otra alternativa que usar pamon en el dispositivo monitor de todos los sumideros y verificar el silencio.
Stéphane Chazelas
Lo probé y está funcionando. ¡Gracias @Stephane, te daría todos mis votos positivos si pudiera!
RSFalcon7
3

Si te entiendo bien, aquí un ejemplo:

Silencio:

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

Me pongo audaz:

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

Para OSS cambiar /dev/snd/timera /dev/dsp.

Este es un método muy dependiente.

Eddy_Em
fuente
De mi tarea aquí ( linux.amazingdev.com/blog/archives/000909.html ) parece posible que un proceso contenga el dispositivo pero no reproduzca nada. ¿Es eso cierto? (Si es así, no es útil)
RSFalcon7
Sí, es verdad. Si presiona "pausa" o "silencio", será así. Pero en este caso no puedes estar absolutamente seguro de que después de un par de segundos el jugador no volverá a jugar. O puede combinar este método y escribir desde la tarjeta de sonido.
Eddy_Em
En este caso, estoy buscando una manera de superar las fallas de los jugadores, así que desafortunadamente esto no funcionará
RSFalcon7
1

Suponiendo que está utilizando el mezclador ALSA para su sonido, puede utilizarlo amixerpara consultar información sobre dispositivos de audio. Un dispositivo de audio generalmente tiene varios canales de audio, o controles, cada uno de los cuales puede silenciarse o no. Por ejemplo, para verificar si el Mastercontrol está silenciado, haría algo como:

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

Use la setopción para realizar cosas en los controles. Ver man amixerpara más ayuda.


fuente
Tal vez hubo una pequeña ambigüedad en la pregunta, edité. Desafortunadamente amixerno funcionó, probé durante 15 minutos sin ningún jugador abierto, y todavía informa "no silenciado"
RSFalcon7
Esto verifica si el canal de sonido está silenciado, no si hay algo sonando.
Gilles 'SO- deja de ser malvado'
1

La respuesta de htor probablemente funcionará, pero es muy posible que aparezca "off" en otra parte de la salida, lo que provocará un resultado incorrecto. Aquí hay una comprobación más estricta con GNU awk:

if amixer get Master | gawk 'END{ if ( $NF != "[off]" ) { exit 1 } }'; then
    # muted
else
    # unmuted
fi
Chris Down
fuente
Mi amixer'S última línea no tiene $6: ‘Mono: Reproducción [en]’. ( amixerversión 1.0.26) Quizás $NFsería más portátil.
manatwork
@manatwork Gracias por la nota, la salida parecía portátil, pero supongo que me conducen fácilmente ;-)
Chris Down
Esto verifica si el canal de sonido está silenciado, no si hay algo sonando.
Gilles 'SO- deja de ser malvado'
@Gilles: cuando publiqué esta respuesta, la pregunta no describía ese problema.
Chris Down