Leia o volume do pulseaudio na linha de comando? (Quero: "pactl GET-sink-volume")

25

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 ele permite definir um volume superior a 100%, o que é uma má ideia (a qualidade do som diminui). Por isso, estou pensando em escrever um pequeno script que acima de 100%. Leia-o. Acima de algum limite? Defina como 100%. Abaixo? adicione 1%. Se houver outra maneira de fazer isso, ótimo, diga-me! A solução mais limpa provavelmente diria ao pulso para parar em 100%. Mas a pergunta original permanece, deve haver alguma maneira ..)

Estou no Debian se isso faz alguma diferença.

Higemaru
fonte
pactl list sinksfornece o volume, mas não em um formato fácil e agradável, como set-sink-volume.
Derobert 27/05
2
Há uma pergunta no Ask Ubuntu com uma resposta que fornece um bom perl-oneliner para analisar o volume disso.
Andreas Wiese
@derobert Obrigado, eu vou apenas grep e / ou sed fora de lá!
Higemaru 28/05
@AndreasWiese Obrigado, não vi isso. Dei uma rápida olhada no código perl, mas acho que vou escrever meu próprio script sujo. ;-)
Higemaru 28/05

Respostas:

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

É o que eu tenho. Não é legal, mas foi o suficiente para o meu uso. Não consegui encontrar o caminho para fazê-lo. O pactljusto parece não ter meios de obter uma listagem apenas de um coletor, mas eles são impressos em ordem crescente. Então isso seleciona a enésima linha usando taile head. Observe que a linha de volume pode ter volumes separados para os canais direito e esquerdo e esse sedsubstituto escolhe apenas o primeiro, porque eu precisava disso.

Para o registro, eu uso o pactl list sinks shortpara obter meu número de coletor ativo:

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

EDIT 2017-10-05: Eu tive que ajustá-los um pouco devido a alterações no pulseaudio. Aqui está o que eu tenho agora:

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

Eu MODconfigurei para +10 ou -10 e faço algumas verificações de limite e, finalmente:

pactl set-sink-volume $SINK ${MOD}%
Tommi Kyntola
fonte
11
Obrigado! Para obter o número dissipador ativo, eu precisava usar pactl list sinks short | grep RUNNING | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,'- Adicionado sinksentre pactl listeshort
koushik
Por robustez, sugiro LC_ALL=C pactl list sinks | grepporque o texto "Volume:" pode estar localizado no idioma do usuário.
Marius Gedminas
Como eu tenho apenas um coletor, isso funcionou para mim em um script do Bash:volume=$(pactl list sinks | grep Volume | head -n1 | awk '{print $5}')
Matthias Braun
11

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

Você pode obter o volume com:

$ pamixer --get-volume
yudi-matsuzake
fonte
4
No Debian, você pode usar o pulsemixerpacote. Parece o mesmo.
Josef Kufner
8

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

Observe também que ele depende dos índices de coletor nomeados para serem os mesmos do índice contado . Digamos, por exemplo, que temos 3 pias 1, 2 e 3 e que 3 é o nosso coletor selecionado, então desconectamos o número 2, deixando-nos 1 e 3. Agora você não pode contar com o coletor 3 com a solução de Tommi Kyntola porque pactl list sinks | grep "^[[:space:]]Volume:"produzirá apenas 2 campos de volume, portanto, a tubulação para a cabeça / cauda para obter a $SINK + 1'linha th' não funcionará.

Minha solução funciona com base no pressuposto de que o pacmd sempre listará pias em uma ordem específica. Se você deseja uma solução mais confiável, precisa 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 se parece com este (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 percentual (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 pacmd statpara 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
}
jgr
fonte
Obrigado! Sua segunda solução funciona muito bem. No entanto, acho que setdefaulsinkvol () precisa serpactl set-sink-volume $(getdefaultsinkname) "$1"
MountainX para Monica Cellio 29/04
4

para obter um volume, estou tentando este:

echo `(pactl list sinks | grep "Volume: 0:")| awk '{print $3}'`
Kairo
fonte
3
Nota: o 'Volume' é traduzido no idioma nativo, portanto, funcionaria apenas para sistemas em inglês.
3
Se você tiver vários coletores, isso fornecerá várias linhas de saída.
tremby
4

Variante multilíngue:

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

Testado no pactl 5.0

Pedro
fonte
Você pode adicionar uma explicação?
Code Bling
4

Como ainda não posso comentar (inscrevi-me especificamente para melhorar a resposta de @ jgr), no caso de seu coletor padrão ser um plugin (como qualquer número de plugins ladspa), sua solução de edição retornará XX% (observe a vírgula à direita) ), então isso funciona um pouco melhor que isso. Desculpe, meu awk-fu é muito básico, tenho certeza de 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 foi corrigido 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
}
Ng Oon-Ee
fonte
2

Você pode usar amixerpara ler o volume do pulseaudio usando a opção do 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 grepor sedou perl.

$ amixer -c 1 -M -D pulse get Master | grep -o -E [[:digit:]]+%
Ashhar Hasan
fonte