Pergunta

Eu gostaria de ler o volume do áudio jogado no momento para os vários clientes de pulsosaudio.

O problema que eu gosto de resolver é o seguinte: Estou ouvindo música em xmms, então eu coloquei em pausa, para ouvir uma música que um amigo me enviou no YouTube. Depois de uma hora, de repente eu descobri que não estou ouvindo nenhuma música!

a solução (muito básica) eu estava pensando é um bash scripts que apenas verifica o volume de todos os aplicativos que não sejam XMMs a cada segundo, se qualquer aplicativo estiver fazendo som, o XMMS é pausado, se não houver som e xmms é silencioso, o XMMS está ativado. (Eu quero ser capaz de fazer este app-sábio, por exemplo, o pidgin deve ser ignorado)

Eu só poderia encontrar ferramentas gráficas para ler o volume, como o PavUControl, que o exibe bem. Eu realmente não gostaria de codificar todos os tipos de programas C para fazer uma coisa tão simples, então:

    .
  1. Estou pensando na direção certa, ou há uma solução mais simples
  2. Se não houver, como eu leio o nível atual do volume para os aplicativos separados
Foi útil?

Solução

Perhaps you can record one sample of audio from the output stream and see if it is (close to) 0. This pipeline gives you a single sample, in the form of a number between -32768 and 32767 (inclusive):

parec --raw --channels=1 --latency=2 2>/dev/null | od -N2 -td2 | head -n1 | cut -d' ' -f2- | tr -d ' '

You'll need to adjust the parec arguments, and possibly the PulseAudio configuration, to tap into the output stream and record from that.

Outras dicas

pactl list dumps a list of... well, it seems pretty much everything. With a running mplayer -ao pulse instance, I get the following among the output:

Sink Input #2
        Driver: protocol-native.c
        Owner Module: 8
        Client: 10
        Sink: 0
        Sample Specification: s16le 2ch 44100Hz
        Channel Map: front-left,front-right
        Mute: no
        Volume: 0: 100% 1: 100%
                0: 0.00 dB 1: 0.00 dB
                balance 0.00
        ...
        Properties:
                media.name = "audio stream"
                application.name = "MPlayer"
                native-protocol.peer = "UNIX socket client"
                ....
                application.process.binary = "mplayer"
                ...

It doesn't give you the current monitor levels (volume of currently playing audio), though, but maybe it's sufficient?

I wouldn't even bother reading the volumes. I'd write a module which contains a sink which detects the volume of apps connected to it and can perform actions based on that as well as a virtual application that you can direct to an existing sink for eventual audio output.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top