Verifica se dispositivi audio / schede audio sono attualmente in riproduzione?


9

Esiste un programma predefinito in cui posso verificare se i miei dispositivi audio sono in silenzio?

Modifica: Per silenzio, intendo che se c'è qualcosa che suona (non solo attivato o aperto)

Qualcosa come questo:

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

Modifica 2: Quello che sto cercando di ottenere è uno script che riproduce la radio e può continuare a giocare quando il lettore fallisce, ad esempio se la connessione a Internet si interrompe e il giocatore non si è ripreso, ucciderò il lettore e ricomincio da capo


Intendi uno strumento per controllare il livello del volume?
Eddy_Em,

no, controlla se c'è qualcosa che sta suonando o no
RSFalcon7,

1
quindi l'unica cosa che immagino sia controllare "Mix" in alsamixer e provare a registrare un po 'dalla scheda audio, quindi analizzare il volume nel file registrato. Se è più grande di una treshold, puoi dire che non c'è niente da suonare. Prova ad esempio sox. In altri casi puoi provare lsof|grep snd. Se non c'è niente, puoi accendere la radio.
Eddy_Em,

Anche chiesto a Superuser
glenn jackman,

Risposte:


4

Se stai usando PulseAudio (le distribuzioni Linux basate su Gnome tendono ad usare PulseAudio, puoi verificare se ne sta funzionando uno ps -C pulseaudio) e vuoi sapere se alcune applicazioni stanno inviando dati a qualsiasi "sink", potresti fare:

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

Sempre con PulseAudio, se si desidera verificare se l'uscita audio è disattivata, potrebbe essere più semplice ma è possibile ottenere lo stato "muto" del "sink" predefinito utilizzando:

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

Non sono sicuro di cosa sto usando, ma questo script non ha funzionato per me. ("Ritorna" noin ogni situazione, giocando o no)
RSFalcon7,

Scusa, mi ero perso quella parte. Continuo a non pensare che stia facendo ciò che è richiesto: se un'applicazione ha il dispositivo aperto ma non fornisce dati, non darebbe un falso positivo?
Gilles 'SO- smetti di essere malvagio' il

1
@Gilles, nei miei test (pausa mplayer), dà State: CORKEDinvece State: RUNNINGche in quel caso, quindi funzionerebbe ancora. Se l'applicazione fornisce dati sul silenzio (sta riproducendo il silenzio), suppongo che mostrerebbe ancora RUNNING, ma in tal caso, non vedo altra alternativa che utilizzare Pamon sul dispositivo di monitoraggio di tutti i lavandini e verificare la presenza di silenzio.
Stéphane Chazelas,

Ho provato e funziona. Grazie @Stephane ti darei tutti i miei voti se potessi!
RSFalcon7,

3

Se ti capisco bene, ecco un esempio:

Silenzio:

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

Accendo audace:

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

Per OSS chande /dev/snd/timera /dev/dsp.

Questo è un metodo molto dipendente.


Dai miei compiti qui ( linux.amazingdev.com/blog/archives/000909.html ) sembra possibile che un processo stia trattenendo il dispositivo ma in realtà non riproduca nulla. È vero? (Se è così, non è utile)
RSFalcon7,

Si è vero. Se premi "pausa" o "muto" sarà così. Ma in questo caso non puoi essere assolutamente sicuro che dopo un paio di secondi il giocatore non giocherà più. Oppure puoi combinare questo metodo e scrivere dalla scheda audio.
Eddy_Em,

In questo caso sto cercando un modo per superare i fallimenti del giocatore, quindi sfortunatamente non funzionerà
RSFalcon7,

1

Supponendo che si stia utilizzando il mixer ALSA per l'audio, è possibile utilizzare amixerper richiedere informazioni sui dispositivi audio. Un dispositivo audio in genere ha diversi canali audio - o controlli - ognuno dei quali può essere disattivato e disattivato. Ad esempio, per verificare se il Mastercontrollo è disattivato, dovresti fare qualcosa del tipo:

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

Utilizzare l' setopzione per eseguire operazioni sui controlli. Vedere man amixerper ulteriore aiuto.


Forse c'era un po 'di ambiguità sulla domanda, ho modificato. Sfortunatamente amixernon ha funzionato, ho provato più di 15 minuti senza nessun giocatore aperto e riporta ancora "senza audio"
RSFalcon7

Questo controlla se il canale audio è disattivato, non se c'è qualcosa in riproduzione.
Gilles 'SO- smetti di essere malvagio' il

1

La risposta di htor probabilmente funzionerà, ma è del tutto possibile che "off" appaia da qualche altra parte nell'output, causando un risultato errato. Ecco un controllo più rigoroso usando GNU awk:

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

L' amixerultima riga del mio non ha $6: "Mono: Playback [on]". ( amixerversione 1.0.26) Forse $NFsarebbe più portatile.
arte

@manatwork Grazie per la nota, l'output sembrava portatile, ma immagino di essere facilmente guidato ;-)
Chris Down

Questo controlla se il canale audio è disattivato, non se c'è qualcosa in riproduzione.
Gilles 'SO- smetti di essere malvagio' il

@Gilles - Quando ho pubblicato questa risposta, la domanda non descriveva quel problema.
Chris Down,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.