Testando se os dispositivos de áudio / placas de som estão sendo reproduzidos atualmente?

8

Existe um programa padrão onde posso verificar se meus dispositivos de áudio estão em silêncio?

Edit: Por silêncio, quero dizer que se há algo jogando nisso (não apenas ativado ou aberto)

Algo parecido com isto:

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

Editar 2: O que estou tentando alcançar é um script que reproduz rádio e pode continuar sendo reproduzido quando o player falha, por exemplo, se a conexão com a internet cair e o jogador não recuperar, eu matarei o jogador e começarei de novo

    
por RSFalcon7 15.01.2013 / 12:49

4 respostas

4

Se você estiver usando o PulseAudio (as distribuições Linux baseadas no Gnome tendem a usar o PulseAudio, você pode verificar se está executando com ps -C pulseaudio ) e deseja saber se alguns aplicativos estão enviando dados para qualquer "coletor", você poderia fazer:

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

Ainda com o PulseAudio, se você quiser verificar se a saída de som está sem áudio, pode ser mais simples, mas você pode obter o status "mudo" do "coletor" padrão usando:

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

Se eu entendi bem, aqui está um exemplo:

Silêncio:

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

Eu me torno audacioso:

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

Para o OSS chande /dev/snd/timer to /dev/dsp .

Este é um método muito dependente.

    
por 15.01.2013 / 15:05
1

Supondo que você esteja usando o mixer ALSA para o seu som, você pode usar amixer para consultar informações sobre dispositivos de áudio. Um dispositivo de áudio normalmente tem vários canais de áudio - ou controles - cada qual pode ser silenciado e sem áudio. Por exemplo, para verificar se o controle Master está mudo, você faria algo como:

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

Use a opção set para executar coisas nos controles. Veja man amixer para mais ajuda.

    
por 15.01.2013 / 13:15
1
A resposta de

htor provavelmente funcionará, mas é inteiramente possível que "off" apareça em algum outro lugar na saída, causando um resultado incorreto. Aqui está uma verificação mais rigorosa usando o GNU awk:

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