Você pode usar pactl list sinks
para obter informações sobre o estado atual de seus sumidouros. Isso retorna muitas informações, incluindo o volume. Então, para obter apenas o volume do sink 1, você pode usar:
pactl list sinks | perl -000ne 'if(/#1/){/(Volume:.*)/; print "\n"}'
Isso retornará algo como:
Volume: 0: 50% 1: 50%
O comando perl
acima irá imprimir os detalhes de sink 1
. Para usar um coletor diferente, altere o #1
para outro número, por exemplo, #0
.
Não sei ao certo o que significam os dois 50%
, presumo que sejam os volumes dos altifalantes esquerdo e direito. Assim, para verificar se estão acima ou abaixo de um valor específico (supondo que o saldo esteja definido como "center", que ambos os volumes, left e right, sejam idênticos, então somente um precisa ser verificado), você pode fazer: / p>
pactl list sinks | perl -000lne 'if(/#1/){/Volume:.*?(\d+)%/; >= 50 ? (print "y\n") : (print "n\n")}'
O texto acima imprimirá um y
se o volume for maior ou igual a 50 e um n
caso contrário. Isso tudo está ficando um pouco complexo, então eu simplificaria criando um script:
#!/usr/bin/env perl
## The sink we are interested in should be given as the
## 1st argument to the script.
die("Need a sink number as the first argument\n") if @ARGV < 1;
my $sink=$ARGV[0];
## If the script has been run with a second argument,
## that argument will be the volume threshold we are checking
my $volume_limit=$ARGV[1]||undef;
## Run the pactl command and save the output in
## ther filehandle $fh
open(my $fh, '-|', 'pactl list sinks');
## Set the record separator to consecutive newlines (same as -000)
## this means we read the info for each sink as a single "line".
$/="\n\n";
## Go through the pactl output
while (<$fh>) {
## If this is the sink we are interested in
if (/#$sink/) {
## Extract the current colume of this sink
/Volume:.*?(\d+)%/;
my $volume=;
## If the script has been run with a second argument,
## check whether the volume is above or below that
if ($volume_limit) {
## If the volume os greater than or equal to the
## value passed, print "y"
if ($volume >= $volume_limit) {
print "y\n";
exit 0;
}
else {
print "n\n";
exit 1;
}
}
## Else, if the script has been run with just one argument,
## print the current volume.
else {
print "$volume%\n";
}
}
}
Salve o script acima como check_volume.pl
em um diretório em $PATH
(por exemplo, /usr/local/bin
), torne-o executável, chmod +x check_volume.pl
e, em seguida, execute-o fornecendo o coletor de seu interesse como primeiro argumento:
$ check_volume.pl 1
50%
Para verificar se o volume está acima de um determinado limite, forneça o limite como um segundo argumento:
$ check_volume.pl 1 50
y
$ check_volume.pl 1 70
n
Observe que isso pressupõe que seu idioma do sistema seja o inglês. Se não for executado o script com uma localidade alterada:
LC_ALL=C check_volume.pl 1 50