Como ler o nível de volume de clientes de pulsosaudio no console
-
15-11-2019 - |
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:
- .
- Estou pensando na direção certa, ou há uma solução mais simples
- Se não houver, como eu leio o nível atual do volume para os aplicativos separados
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.