Testando se dispositivos de áudio / placas de som estão em execução no momento?


9

Existe um programa padrão em que posso verificar se meus dispositivos de áudio estão silenciosos?

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

Algo assim:

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

Edit 2: O que estou tentando alcançar é um script que toca rádio e pode continuar tocando quando o player falha, por exemplo, se a conexão à Internet cair e o player não se recuperar, eu matarei o player e recomeço.


Você quer dizer uma ferramenta para verificar o nível do volume?
Eddy_Em 15/01

não, verificar se há algo jogar ou não
RSFalcon7

1
então o único item que acho interessante é checar "Mix" no alsamixer e tentar gravar um pouco da placa de som e depois analisar o volume no arquivo gravado. Se for maior que um limite, você pode significar que não há nada tocando. Tente por exemplo sox. Em outro caso, você pode tentar lsof|grep snd. Se não houver nada, você pode ligar o rádio.
Eddy_Em 15/01

Também perguntou no Superusuário
glenn jackman

Respostas:


4

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

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

Ainda com o PulseAudio, se você quiser verificar se sua saída de som está silenciada, 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]}'

Não tenho certeza do que estou usando, mas esse script não funcionou para mim. (It "retorna" noem qualquer situação, jogando ou não)
RSFalcon7

Desculpe, eu tinha perdido essa parte. Ainda acho que isso não está fazendo o que é solicitado: se um aplicativo tiver o dispositivo aberto, mas não fornecer dados, ele não forneceria um falso positivo?
Gilles 'SO- stop be evil'

1
@Gilles, nos meus testes (em pausa mplayer), ele fornece, em State: CORKEDvez de State: RUNNINGnesse caso, para que ainda funcionasse. Se o aplicativo alimenta dados de silêncio (está reproduzindo silêncio), acho que ainda assim seria exibido RUNNING, mas nesse caso, não vejo outra alternativa a não ser usar pamon no monitor de todas as pias e verificar se há silêncio.
Stéphane Chazelas

Eu testei e está funcionando. Obrigado @Stephane, eu daria a você todos os meus votos se pudesse!
precisa saber é o seguinte

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

Ativo audaciosamente:

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

Para OSS chande /dev/snd/timerpara /dev/dsp.

Este é um método muito dependente.


Do meu dever de casa aqui ( linux.amazingdev.com/blog/archives/000909.html ), parece possível que um processo esteja mantendo o dispositivo, mas na verdade não reproduza nada. Isso é verdade? (Se assim for, não é útil)
RSFalcon7

Sim, é verdade. Se você pressionar "pausar" ou "mudo", será assim. Mas, neste caso, você não pode ter certeza absoluta de que, após alguns segundos, o jogador não tocará novamente. Ou você pode combinar esse método e escrever na placa de som.
precisa saber é o seguinte

Neste caso, eu estou procurando uma maneira de superar as falhas do jogador, então, infelizmente, isso não vai funcionar
RSFalcon7

1

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

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

Use a setopção para executar tarefas nos controles. Veja man amixerpara mais ajuda.


Talvez houvesse um pouco de ambiguidade na questão, editei. Infelizmente amixernão funcionou, eu testado ao longo de 15 min com absolutamente nenhum jogador se abriu, e ele ainda está relatando "mudos"
RSFalcon7

Isso verifica se o canal de som está mudo, não se há algo tocando.
Gilles 'SO- stop be evil'

1

A resposta do htor provavelmente funcionará, mas é inteiramente possível que "off" apareça em 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

A amixerúltima linha da minha linha não possui $6: “Mono: reprodução [ativada]”. ( amixerversão 1.0.26) Talvez $NFfosse mais portátil.
precisa saber é

@manatwork Thanks for a nota, a saída parecia portátil, mas eu acho que eu sou facilmente levados ;-)
Chris Baixo

Isso verifica se o canal de som está mudo, não se há algo tocando.
Gilles 'SO- stop be evil'

@ Gilles - Quando publiquei esta resposta, a pergunta não descreveu esse problema.
Chris Baixo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.