Lê o volume pulseaudio da linha de comando? (Eu quero: "pactl GET-sink-volume")

20

Eu quero ler o nível de volume que posso definir com

pactl set-sink-volume $SINK $VOLUME

Existe uma maneira fácil de fazer isso? Tão fácil quanto o hipotético

pactl get-sink-volume $SINK

?

(O que estou tentando fazer? Eu uso o pactl para definir o volume e isso me permite configurar o volume acima de 100%, o que é uma má idéia (a qualidade do som cai), então estou pensando em escrever um pequeno roteiro que não vai passar de 100% Leia-o Mais de um limiar definido em 100% Abaixo, adicione 1% Se houver outra maneira de fazer isso, ótimo, me diga A solução mais limpa provavelmente diria o pulso para apenas parar em 100%. Mas a questão original permanece, deve haver alguma maneira ..)

Eu estou no Debian se isso faz alguma diferença.

    
por Higemaru 27.05.2014 / 17:44

7 respostas

15

pactl list sinks | grep '^[[:space:]]Volume:' | \
    head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \([0-9][0-9]*\)%.*,,'

É isso que tenho. Não é legal, mas foi o suficiente para o meu uso. Não consegui encontrar o caminho para o fazer. O pactl simplesmente não parece ter nenhum meio de listar apenas um coletor, mas eles são impressos em ordem crescente. Assim, seleciona a enésima linha usando tail e head . Observe que a linha de volume pode ter volumes separados para os canais direito e esquerdo e que sed substituto apenas escolhe o primeiro, porque eu precisava disso.

Para o registro, eu uso o pactl list sinks short para obter meu número de afundamento ativo:

pactl list short | grep RUNNING | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,,'

EDIT 2017-10-05: Eu tive que ajustar um pouco devido a mudanças no pulseaudio. Aqui está o que eu tenho agora:

SINK=$( pactl list short sinks | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,,' | head -n 1 )
NOW=$( pactl list sinks | grep '^[[:space:]]Volume:' | head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \([0-9][0-9]*\)%.*,,' )

Eu tenho MOD definido como +10 ou -10 e faço algumas verificações de limite e finalmente:

pactl set-sink-volume $SINK ${MOD}%
    
por 18.09.2015 / 14:53
6

Observe que a resposta de Tommi Kyntola depende do uso da pia para que você possa obter o número da pia.

Observe também que ele se baseia nos índices nomeados de coletores para serem os mesmos que o índice contado . Digamos, por exemplo, que temos 3 pias 1, 2 e 3 e que 3 é nossa pia selecionada, depois desconectamos o número 2, deixando-nos com 1 e 3. Agora você não pode contar para afundar 3 com a solução de Tommi Kyntola porque pactl list sinks | grep "^[[:space:]]Volume:" só produzirá 2 campos de Volume, assim canalizando para cabeça / cauda para obter que a linha $SINK + 1 'th não funcionará (eu experimentei este irl, eu não estou apenas criticando)

Minha solução funciona com base na suposição de que o pacmd sempre listará os coletores em uma ordem específica. Se você quiser uma solução mais confiável, precisará analisar a saída.

#!/bin/sh

# Get the index of the selected sink:
getsink() {
    pacmd list-sinks |
        awk '/index:/{i++} /* index:/{print i; exit}'
}

# Get the selected sink volume
getvolume() {
    pacmd list-sinks |
        awk '/^\svolume:/{i++} i=='$(getsink)'{print $5; exit}'
}

getvolume

Nota: não sei se os campos de volume diferem, o meu é assim (de pacmd list-sinks ):

volume: front-left: 42706 /  65% / -11.16 dB,   front-right: 42706 /  65% / -11.16 dB

Além disso, estou obtendo apenas o volume do primeiro canal (frente-esquerda) em formato de porcentagem (ou seja, campo 5). Seus canais podem estar em níveis diferentes.

EDITAR:

Pensando bem, você provavelmente deseja obter o nome do coletor padrão de pacmd stat para uma solução menos complicada:

#/bin/sh
getdefaultsinkname() {
    pacmd stat | awk -F": " '/^Default sink name: /{print $2}'
}

getdefaultsinkvol() {
    pacmd list-sinks |
        awk '/^\s+name: /{indefault = $2 == "<'$(getdefaultsinkname)'>"}
            /^\s+volume: / && indefault {print $5; exit}'

}

setdefaulsinkvol() {
    pactl $(getdefaultsinkname) $1
}
    
por 28.12.2015 / 14:33
5

Se você não tem uma restrição para usar outro programa, existe o pamixer .

Você pode obter o volume com:

$ pamixer --get-volume
    
por 10.01.2017 / 08:29
4

para obter um volume Estou tentando este:

echo '(pactl list sinks | grep "Volume: 0:")| awk '{print $3}''
    
por 29.10.2014 / 04:46
4

Variante multilíngue:

pactl list sink-inputs | \
grep -A15 -P "(\#|№)$SINK" | \
grep -P "\d+\s*\/\s*\d+\%" | \
head -1 | \
awk "{print \}"

Testado no pactl 5.0

    
por 28.10.2015 / 11:40
2

Como ainda não posso comentar (inscrevi-me especificamente para melhorar a resposta do @jgr), no caso em que seu coletor padrão é um plugin (como qualquer número de plugins do ladspa), sua solução de edição retornará XX%. a vírgula à direita), então isso funciona um pouco melhor do que isso. Desculpe, meu awk-fu é muito básico, tenho certeza que há uma maneira melhor de fazer isso.

A solução modificada também omite o '%', pois não vejo sentido em mantê-lo, e se retornarmos apenas o número, podemos usá-lo em matemática. Também consertei o caso setvol, que precisa de instruções específicas no meu caso.

#/bin/sh
getdefaultsinkname() {
    pacmd stat | awk -F": " '/^Default sink name: /{print $2}'
}

getdefaultsinkvol() {
    pacmd list-sinks |
        awk '/^\s+name: /{indefault = $2 == "<'$(getdefaultsinkname)'>"}
            /^\s+volume: / && indefault {print $5; exit}' |
        awk -F"%" '{print $1}'
}

setdefaultsinkvol() {
    pactl -- set-sink-volume $(getdefaultsinkname) $1
}
    
por 07.04.2016 / 09:45
2

Você pode usar amixer para ler o volume pulseaudio usando a opção mixer como esta.

$ amixer -c $CARD -M -D $MIXER get $SCONTROL
# CARD is your sound card number, mixer is either alsa or pulse and scontrol is the alsa device name, Master if you want to use pulse.
$ amixer -c 1 -M -D pulse get Master

Simple mixer control 'Master',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 65536
  Mono:
  Front Left: Playback 27662 [42%] [on]
  Front Right: Playback 27662 [42%] [on]

Agora podemos analisá-lo usando grep ou sed ou perl .

$ amixer -c 1 -M -D pulse get Master | grep -o -E [[:digit:]]+%
    
por 05.05.2016 / 16:35