¿Leyó el volumen del pulsoaudio desde la command-line? (Quiero: "pactl GET-sink-volume")

Quiero leer el nivel de volumen que puedo establecer con

pactl set-sink-volume $SINK $VOLUME 

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

 pactl get-sink-volume $SINK 

?

(¿Qué estoy tratando de hacer? Uso 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 baja), así que estoy pensando en escribir un pequeño guión que lo haga no superar el 100%. Leerlo. ¿Sobre un umbral? Establecer al 100%. A continuación? Agregar un 1%. Si hay otra manera de hacerlo, genial, ¡dígame! La solución más limpia probablemente sería decirle al pulso que se detenga al 100%. Pero la pregunta original permanece, debe haber alguna manera ..)

Estoy en Debian si eso hace alguna diferencia.

 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 es limpio, pero fue suficiente para mi uso. No pude encontrar la manera de hacerlo. El pactl simplemente no parece tener ningún medio para get el listdo para un solo receptor, pero se imprimen en order ascendente. Entonces eso selecciona la enésima línea usando tail y head . Observe que la línea de volumen puede tener volúmenes separados para los canales derecho e izquierdo y que el sustituto sed solo selecciona el primero, porque necesitaba eso.

Para el logging, uso la pactl list short para get mi número de sumidero activo:

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

EDITAR 05/05/2017: Tuve que ajustar un poco debido a los cambios en el sonido de audio. 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,' ) 

Tengo MOD configurado en +10 o -10 y realizo algunas comprobaciones de límites y finalmente:

 pactl set-sink-volume $SINK ${MOD}% 

para get un volumen, estoy intentando este:

 echo `(pactl list sinks | grep "Volume: 0:")| awk '{print $3}'` 

Tenga en count que la respuesta de Tommi Kyntola depende de que el fregadero esté en uso para que pueda get el número del fregadero.

También tenga en count que se basa en índices de sumidero con nombre para ser el mismo que el índice contado . Digamos, por ejemplo, tenemos 3 sumideros 1, 2 y 3 y que 3 es nuestro fregadero 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:" pactl list sinks | grep "^[[:space:]]Volume:" solo generará 2 campos de Volumen, por lo tanto, conectar a la línea / queue para get la línea $SINK + 1 'no funcionará. (He experimentado esto irl, estoy no solo curioseando)

Mi solución funciona en base a la suposition de que pacmd siempre listrá los sumideros en un order específico. Si desea una solución más confiable, necesita 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 son diferentes, el mío se ve así (de pacmd list-sinks ):

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

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


EDITAR:

pacmd stat bien, probablemente quieras get el nombre pnetworkingeterminado del receptor de pacmd stat para una solución less intrincada:

 #/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 } 

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

Puede usar amixer para leer el volumen del pulso de audio usando la opción del 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 grep o sed o perl .

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

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

Puedes get el volumen con:

 $ pamixer --get-volume 

Como todavía no puedo comentar (me inscribí específicamente para mejorar la respuesta de @ jgr), en el caso de que tu receptor pnetworkingeterminado sea un complemento (como cualquier cantidad de complementos de ladspa) su solución de edición devolverá XX%, (fíjate en 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 para mantenerlo, y si devolvemos solo el número, podemos usarlo en matemáticas. También solucionó 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 }