Vous testez si des périphériques audio / cartes son sont en cours de lecture?


9

Existe-t-il un programme par défaut où je peux vérifier si mes périphériques audio sont silencieux?

Edit: Par silence, je veux dire que s'il y a quelque chose à jouer là-dessus (pas seulement activé ou ouvert)

Quelque chose comme ça:

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

Edit 2: Ce que j'essaie de réaliser est un script qui joue la radio et peut continuer à jouer lorsque le joueur échoue, par exemple si la connexion Internet tombe en panne et que le joueur ne récupère pas, je vais tuer le joueur et recommencer


Voulez-vous dire un outil pour vérifier le niveau de volume?
Eddy_Em

non, vérifiez s'il y a quelque chose à jouer ou non
RSFalcon7

1
alors la seule chose que je suppose est de vérifier "Mix" dans alsamixer et d'essayer d'enregistrer un peu à partir de la carte son, puis d'analyser le volume dans le fichier enregistré. S'il est supérieur à un seuil, vous pouvez signifier qu'il n'y a rien à jouer. Essayez par exemple sox. Dans les autres cas, vous pouvez essayer lsof|grep snd. S'il n'y a rien, vous pouvez allumer la radio.
Eddy_Em

En outre demandé sur Superuser
glenn JACKMAN

Réponses:


4

Si vous utilisez PulseAudio (les distributions Linux basées sur Gnome ont tendance à utiliser PulseAudio, vous pouvez vérifier si l'une est en cours d'exécution avec ps -C pulseaudio) et vous voulez savoir si certaines applications envoient des données à un "récepteur", vous pouvez faire:

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

Toujours avec PulseAudio, si vous voulez vérifier si votre sortie audio est en sourdine, il pourrait être plus simple mais vous pouvez obtenir le statut "muet" du "récepteur" par défaut en utilisant:

pacmd dump | awk '
  $1 == "set-sink-mute" {m[$2] = $3}
  $1 == "set-default-sink" {s = $2}
  END {print m[s]}'

Je ne suis pas sûr de ce que j'utilise, mais ce script n'a pas fonctionné pour moi. (Il "revient" nodans n'importe quelle situation, qu'il joue ou non)
RSFalcon7

Désolé, j'avais raté cette partie. Je ne pense toujours pas que cela fasse ce qui est demandé: si une application a le périphérique ouvert mais ne lui fournit aucune donnée, cela ne donnerait-il pas un faux positif?
Gilles 'SO- arrête d'être méchant'

1
@Gilles, dans mes tests (pause mplayer), il donne State: CORKEDau lieu de State: RUNNINGdans ce cas donc ça marcherait toujours. Si l'application alimente des données de silence (joue du silence), je suppose que cela s'afficherait toujours RUNNING, mais dans ce cas, je ne vois pas d'autre alternative que d'utiliser pamon sur le périphérique de moniteur de tous les puits et vérifier le silence.
Stéphane Chazelas

J'ai testé et ça marche. Merci @Stephane, je vous donnerais tous mes votes positifs si je le pouvais!
RSFalcon7

3

Si je vous comprends bien, voici un exemple:

Silence:

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

J'allume audacieux:

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

Pour OSS chande /dev/snd/timerto /dev/dsp.

Il s'agit d'une méthode très dépendante.


D'après mes devoirs ici ( linux.amazingdev.com/blog/archives/000909.html ), il semble possible qu'un processus tienne l'appareil mais ne joue réellement rien. Est-ce vrai? (Si c'est le cas, ce n'est pas utile)
RSFalcon7

Oui c'est vrai. Si vous appuyez sur "pause" ou "muet", il en sera ainsi. Mais dans ce cas, vous ne pouvez pas être absolument sûr qu'après quelques secondes, le joueur ne jouera plus. Ou vous pouvez combiner cette méthode et écrire à partir de la carte son.
Eddy_Em

Dans ce cas, je cherche un moyen de surmonter les échecs des joueurs, donc malheureusement cela ne fonctionnera pas
RSFalcon7

1

En supposant que vous utilisez le mélangeur ALSA pour votre son, vous pouvez utiliser amixerpour interroger des informations sur les périphériques audio. Un périphérique audio possède généralement plusieurs canaux audio - ou commandes - chacun pouvant être mis en sourdine ou non. Par exemple, pour vérifier si le Mastercontrôle est mis en sourdine, vous feriez quelque chose comme:

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

Utilisez l' setoption pour effectuer des opérations sur les commandes. Voir man amixerpour plus d'aide.


Il y avait peut-être une petite ambiguïté sur la question, j'ai édité. Malheureusement, cela amixern'a pas fonctionné, j'ai testé pendant 15 minutes sans aucun lecteur ouvert, et il rapporte toujours "non muet"
RSFalcon7

Ceci vérifie si le canal audio est coupé, et non s'il y a quelque chose à jouer.
Gilles 'SO- arrête d'être méchant'

1

La réponse de htor fonctionnera probablement, mais il est tout à fait possible que "off" apparaisse ailleurs dans la sortie, provoquant un résultat incorrect. Voici une vérification plus stricte en utilisant GNU awk:

if amixer get Master | gawk 'END{ if ( $NF != "[off]" ) { exit 1 } }'; then
    # muted
else
    # unmuted
fi

amixerLa dernière ligne de My n'a pas $6: «Mono: Lecture [on]». ( amixerversion 1.0.26) Ce $NFserait peut -être plus portable.
manatwork le

@manatwork Merci pour la note, la sortie avait l'air portable, mais je suppose que je suis facilement dirigée ;-)
Chris Down

Ceci vérifie si le canal audio est coupé, et non s'il y a quelque chose à jouer.
Gilles 'SO- arrête d'être méchant'

@Gilles - Lorsque j'ai posté cette réponse, la question ne décrivait pas ce problème.
Chris Down
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.