¿Leer el volumen de pulseaudio desde la línea de comandos? (Quiero: "pactl GET-sink-volume")

25

Quiero leer el nivel de volumen que puedo configurar con

pactl set-sink-volume $SINK $VOLUME

¿Hay una manera fácil de hacer eso? Tan fácil como lo hipotético

pactl get-sink-volume $SINK

?

(¿Qué estoy tratando de hacer? Utilizo pactl para configurar el volumen y me permite configurar el volumen por encima del 100%, lo cual es una mala idea (la calidad del sonido disminuye), así que estoy pensando en escribir un pequeño script que no supere el 100%. Léalo. ¿Sobre algún umbral? Establezca el 100%. A continuación: agregue 1%. Si hay otra forma de hacerlo, ¡genial, dígame! La solución más limpia probablemente le dirá al pulso que simplemente pare al 100%. Pero la pregunta original permanece, debe haber alguna forma ...)

Estoy en Debian si eso hace alguna diferencia.

Higemaru
fuente
pactl list sinksle da el volumen, pero no en un formato sencillo y agradable como set-sink-volume.
derobert
2
Hay una pregunta en Ask Ubuntu con una respuesta que da un buen perl-oneliner para analizar el volumen de esto.
Andreas Wiese
@derobert Gracias, ¡solo lo haré y / o lo sacaré de allí!
Higemaru
@AndreasWiese Gracias, no vi eso. Eché un vistazo rápido al código de Perl, pero supongo que escribiré mi propio script pequeño y sucio. ;-)
Higemaru

Respuestas:

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

Eso es lo que tengo. No está bien, pero fue suficiente para mi uso. No pude encontrar la manera de hacerlo. El pactlsimplemente no parece tener ningún medio para obtener una lista para un solo sumidero, pero se imprimen en orden ascendente. Entonces eso selecciona la enésima línea usando taily head. Tenga en cuenta que la línea de volumen puede tener volúmenes separados para los canales derecho e izquierdo y ese sedsustituto solo elige el primero, porque solo necesitaba eso.

Para el registro, uso el pactl list sinks shortpara obtener mi número de sumidero activo:

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

EDITAR 2017-10-05: Tuve que modificarlos un poco debido a los cambios en pulseaudio. Esto es lo que tengo ahora:

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,' )

He MODestablecido en +10 o -10 y hago algunas verificaciones de límites y finalmente:

pactl set-sink-volume $SINK ${MOD}%
Tommi Kyntola
fuente
1
¡Gracias! Para obtener el número de receptor activo, necesitaba usar pactl list sinks short | grep RUNNING | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,'- Agregado sinksentre pactl listyshort
koushik
Para mayor robustez, sugeriría LC_ALL=C pactl list sinks | grepque el texto "Volumen:" puede estar localizado en el idioma del usuario.
Marius Gedminas
Como solo tengo un sumidero, esto funcionó para mí en un script Bash:volume=$(pactl list sinks | grep Volume | head -n1 | awk '{print $5}')
Matthias Braun
11

Si no tiene una restricción para usar otro programa, existe el pamixer.

Puedes obtener el volumen con:

$ pamixer --get-volume
yudi-matsuzake
fuente
44
En Debian, puede usar el pulsemixerpaquete. Se ve casi igual.
Josef Kufner el
8

Tenga en cuenta que la respuesta de Tommi Kyntola se basa en que el fregadero esté en uso para que pueda obtener el número del fregadero.

También tenga en cuenta que se basa en índices de sumidero nombrados para ser el mismo que el índice contado . Digamos, por ejemplo, que tenemos 3 sumideros 1, 2 y 3 y ese 3 es nuestro sumidero seleccionado, luego desconectamos el número 2, dejándonos con 1 y 3. Ahora no puede contar para hundir 3 con la solución de Tommi Kyntola porque pactl list sinks | grep "^[[:space:]]Volume:"solo generará 2 campos de volumen, por lo tanto, la tubería a la cabeza / cola para obtener la $SINK + 1'línea th no funcionará (he experimentado este irl, no solo estoy jugando)

Mi solución funciona basándose en el supuesto de que pacmd siempre listará los sumideros en un orden específico. Si desea una solución más confiable, debe analizar la salida.

#!/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: No sé si los campos de volumen difieren, el mío se ve así (desde pacmd list-sinks):

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

Además, solo obtengo el volumen del primer canal (frontal-izquierdo) en formato de porcentaje (es decir, campo 5), sus canales pueden estar en diferentes niveles.


EDITAR:

Pensándolo bien, probablemente quieras obtener el nombre de sumidero predeterminado pacmd statpara una solución 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
fuente
¡Gracias! Su segunda solución funciona muy bien. Sin embargo, creo que setdefaulsinkvol () debe serpactl set-sink-volume $(getdefaultsinkname) "$1"
MountainX para Monica Cellio
4

para obtener un volumen estoy probando este:

echo `(pactl list sinks | grep "Volume: 0:")| awk '{print $3}'`
kairo
fuente
3
Nota: el 'Volumen' está traducido al idioma nativo, por lo que funcionaría solo para sistemas en inglés.
3
Si tiene múltiples sumideros, esto dará múltiples líneas de salida.
temblorosa
4

Variante multilingüe:

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

Probado en pactl 5.0

Peter
fuente
¿Puedes agregar una explicación?
Código Bling
4

Como todavía no puedo comentar (me inscribí específicamente para mejorar la respuesta de @ jgr), en el caso de que su sumidero predeterminado sea un complemento (como cualquier cantidad de complementos de ladspa) su solución de edición devolverá XX%, (tenga en cuenta la coma final ), así que esto funciona un poco mejor que eso. Lo siento, mi awk-fu es muy básico, estoy seguro de que hay una mejor manera de hacerlo.

La solución modificada también omite el '%' ya que no veo el punto de mantenerlo, y si devolvemos solo el número, podemos usarlo en matemáticas. También arreglé el caso setvol, que necesita instrucciones específicas en mi 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
fuente
2

Puede usar amixerpara leer el volumen de pulseaudio usando la opción de mezclador 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]

Ahora podemos analizarlo usando grepo sedo perl.

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