Testen, ob gerade Audiogeräte / Soundkarten abgespielt werden?


9

Gibt es ein Standardprogramm, mit dem ich überprüfen kann, ob meine Audiogeräte stumm geschaltet sind?

Bearbeiten: Mit Schweigen meine ich, wenn etwas darauf spielt (nicht nur aktiviert oder geöffnet)

Etwas wie das:

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

Bearbeiten 2: Was ich erreichen möchte, ist ein Skript, das Radio spielt und weiter spielen kann, wenn der Player ausfällt. Wenn beispielsweise die Internetverbindung unterbrochen wird und der Player nicht wiederhergestellt wurde, werde ich den Player töten und von vorne beginnen


Meinen Sie ein Tool zur Überprüfung der Lautstärke?
Eddy_Em

Nein, prüfen Sie, ob etwas spielt oder nicht
RSFalcon7

1
dann ist das einzige, was ich denke, das "Mix" in alsamixer zu überprüfen und zu versuchen, ein wenig von der Soundkarte aufzunehmen und dann die Lautstärke in der aufgenommenen Datei zu analysieren. Wenn es größer als eine Schwelle ist, können Sie bedeuten, dass nichts spielt. Versuchen Sie es zum Beispiel sox. In anderen Fällen können Sie es versuchen lsof|grep snd. Wenn es nichts gibt, können Sie das Radio einschalten.
Eddy_Em

Auch gefragt auf Superuser
Glenn Jackman

Antworten:


4

Wenn Sie PulseAudio verwenden (Gnome-basierte Linux-Distributionen verwenden in der Regel PulseAudio, können Sie überprüfen, ob eine ausgeführt wird ps -C pulseaudio) und Sie möchten wissen, ob einige Anwendungen Daten an eine "Senke" senden, können Sie Folgendes tun:

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

Wenn Sie bei PulseAudio überprüfen möchten, ob Ihre Tonausgabe stummgeschaltet ist, ist dies möglicherweise einfacher, aber Sie können den Status "Stummschalten" der Standard-Senke mithilfe von:

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

Ich bin nicht sicher, was ich verwende, aber dieses Skript hat bei mir nicht funktioniert. (Es "kehrt" noin jeder Situation zurück,
ob

Entschuldigung, ich hatte diesen Teil verpasst. Ich glaube immer noch nicht, dass dies das tut, was angefordert wird: Wenn eine Anwendung das Gerät geöffnet hat, aber keine Daten zuführt, würde es dann kein falsches Positiv ergeben?
Gilles 'SO - hör auf böse zu sein'

1
@ Gilles, in meinen Tests (Pause mplayer) gibt es State: CORKEDstatt State: RUNNINGin diesem Fall, so dass es immer noch funktionieren würde. Wenn die Anwendung RUNNINGStummschaltungsdaten speist (Stummschaltung abspielt ), wird dies vermutlich weiterhin angezeigt. In diesem Fall sehe ich jedoch keine andere Alternative als die Verwendung von Pamon auf dem Überwachungsgerät aller Waschbecken und die Überprüfung auf Stille.
Stéphane Chazelas

Ich habe getestet und es funktioniert. Danke @Stephane, ich würde dir alle meine Upvotes geben, wenn ich könnte!
RSFalcon7

3

Wenn ich Sie richtig verstehe, hier ein Beispiel:

Stille:

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

Ich schalte kühn ein:

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

Für OSS chande /dev/snd/timerzu /dev/dsp.

Dies ist eine sehr abhängige Methode.


Aus meinen Hausaufgaben hier ( linux.amazingdev.com/blog/archives/000909.html ) geht hervor, dass ein Prozess das Gerät hält, aber eigentlich nichts spielt. Ist das wahr? (Wenn ja, ist es nicht nützlich)
RSFalcon7

Ja, es ist wahr. Wenn Sie "Pause" oder "Stumm" drücken, ist dies der Fall. In diesem Fall können Sie jedoch nicht sicher sein, dass der Spieler nach einigen Sekunden nicht mehr spielt. Oder Sie können diese Methode kombinieren und von der Soundkarte schreiben.
Eddy_Em

In diesem Fall suche ich nach einer Möglichkeit, die Spielerfehler zu überwinden, daher funktioniert dies leider nicht
RSFalcon7

1

Angenommen, Sie verwenden ALSA-Mixer für Ihren Sound, können Sie amixerInformationen zu Audiogeräten abfragen. Ein Audiogerät verfügt normalerweise über mehrere Audiokanäle - oder Steuerelemente -, die jeweils stummgeschaltet und nicht stummgeschaltet werden können. Um beispielsweise zu überprüfen, ob das MasterSteuerelement stummgeschaltet ist, gehen Sie wie folgt vor:

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

Verwenden Sie die setOption, um Dinge an den Steuerelementen auszuführen. Sehen Sie man amixerfür weitere Hilfe.


Vielleicht gab es ein wenig Unklarheit in der Frage, die ich bearbeitet habe. Leider amixerhat es nicht funktioniert, ich habe über 15 Minuten getestet, ohne dass ein Spieler geöffnet war, und es wird immer noch "nicht stummgeschaltet"
gemeldet

Dies prüft, ob der Soundkanal stummgeschaltet ist und nicht, ob etwas abgespielt wird.
Gilles 'SO - hör auf böse zu sein'

1

Die Antwort von htor wird wahrscheinlich funktionieren, aber es ist durchaus möglich, dass "off" irgendwo anders in der Ausgabe erscheint und ein falsches Ergebnis verursacht. Hier ist eine strengere Überprüfung mit GNU awk:

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

In meiner amixerletzten Zeile steht nein $6: "Mono: Wiedergabe [ein]". ( amixerVersion 1.0.26) Vielleicht $NFwäre portabler.
Manatwork

@ Manatwork Danke für den Hinweis, die Ausgabe sah tragbar aus, aber ich denke, ich bin leicht zu führen ;-)
Chris Down

Dies prüft, ob der Soundkanal stummgeschaltet ist und nicht, ob etwas abgespielt wird.
Gilles 'SO - hör auf böse zu sein'

@ Gilles - Als ich diese Antwort gepostet habe, hat die Frage dieses Problem nicht beschrieben.
Chris Down
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.