Leggi il volume di pulseaudio dalla riga di comando? (Voglio: "pactl GET-sink-volume")


25

Voglio leggere il livello del volume con cui posso impostare

pactl set-sink-volume $SINK $VOLUME

C'è un modo semplice per farlo? Facile come l'ipotetico

pactl get-sink-volume $SINK

?

(Cosa sto cercando di fare? Uso Pactl per impostare il volume e mi consente di impostare un volume superiore al 100%, il che è una cattiva idea (la qualità del suono diminuisce), quindi sto pensando di scrivere un piccolo script che non andare oltre il 100%. Leggilo. Oltre un certo limite? Imposta al 100%. Sotto? aggiungi 1%. Se c'è un altro modo per farlo, ottimo, dimmelo! La soluzione più pulita probabilmente direbbe al polso di fermarsi al 100%. Ma la domanda originale rimane, ci deve essere un modo ..)

Sono su Debian se questo fa la differenza.


pactl list sinksti dà il volume, ma non in un formato semplice come set-sink-volume.
derobert,

2
C'è una domanda su Ask Ubuntu con una risposta che dà un buon perl-oneliner per analizzare il volume da questo.
Andreas Wiese,

@derobert Grazie, farò semplicemente grep e / o sederò da lì!
Higemaru,

@AndreasWiese Grazie, non l'ho visto. Ho dato una rapida occhiata al codice perl ma suppongo che scriverò solo il mio sporco copione. ;-)
Higemaru,

Risposte:


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

Questo è quello che ho. Non è pulito, ma è stato abbastanza per il mio uso. Non sono riuscito a trovare il modo di farlo. I pactljust non sembrano avere alcun mezzo per ottenere un elenco per un solo lavandino, ma sono stampati in ordine crescente. In modo che selezioni l'ennesima riga usando taile head. Si noti che la linea del volume può avere volumi separati per i canali destro e sinistro e che il sedsostituto sceglie solo il primo, perché ne avevo bisogno.

Per la cronaca, utilizzo il pactl list sinks shortper ottenere il mio numero di sink attivo:

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

EDIT 2017-10-05: Ho dovuto modificarli un po 'a causa dei cambiamenti in pulseaudio. Ecco quello che ho ora:

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

Ho MODimpostato su +10 o -10 e faccio alcuni controlli di confine e infine:

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

1
Grazie! Per ottenere il numero di sink attivo, dovevo utilizzare pactl list sinks short | grep RUNNING | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,'- Aggiunto sinkstra pactl listeshort
koushik il

Per solidità, suggerirei LC_ALL=C pactl list sinks | grepperché il testo "Volume:" potrebbe essere localizzato nella lingua dell'utente.
Marius Gedminas,

Dato che ho un solo lavandino, questo ha funzionato per me in una sceneggiatura di Bash:volume=$(pactl list sinks | grep Volume | head -n1 | awk '{print $5}')
Matthias Braun il

11

Se non hai una restrizione per usare un altro programma c'è il pamixer.

Puoi ottenere il volume con:

$ pamixer --get-volume

4
In Debian, puoi usare il pulsemixerpacchetto. Sembra più o meno lo stesso.
Josef Kufner,

8

Nota che la risposta di Tommi Kyntola si basa sul fatto che il lavandino sia in uso in modo da poter effettivamente ottenere il numero del lavandino.

Si noti inoltre che si basa sugli indici sink denominati per essere gli stessi dell'indice conteggiato . Diciamo, ad esempio, che abbiamo 3 lavandini 1, 2 e 3 e che 3 è il nostro lavandino selezionato, quindi disconnettiamo il numero 2, lasciandoci con 1 e 3. Ora non puoi contare per affondare 3 con la soluzione di Tommi Kyntola perché pactl list sinks | grep "^[[:space:]]Volume:"produrrà solo 2 campi Volume, quindi tubazioni in testa / coda per ottenere che la $SINK + 1riga non funzionerà.

La mia soluzione funziona basandosi sul presupposto che pacmd elencherà sempre i sink in un ordine specifico. Se si desidera una soluzione più affidabile, è necessario analizzare l'output.

#!/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: non so se i campi del volume differiscono, il mio assomiglia a questo (da pacmd list-sinks):

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

Inoltre sto solo ottenendo il volume del primo canale (anteriore sinistro) in formato percentuale (cioè, campo 5), i tuoi canali potrebbero essere a livelli diversi.


MODIFICARE:

A pensarci bene probabilmente vorrai effettivamente ottenere il nome del sink predefinito da pacmd statper una soluzione meno complicata:

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

Grazie! La tua seconda soluzione funziona alla grande. Tuttavia, penso che setdefaulsinkvol () debba esserepactl set-sink-volume $(getdefaultsinkname) "$1"
MountainX per Monica Cellio il

4

per ottenere un volume sto provando questo:

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

3
Nota: il 'Volume' è tradotto in madrelingua, quindi funzionerebbe solo per i sistemi inglesi.

3
Se si dispone di più sink, ciò fornirà più righe di output.
tremby,

4

Variante multilingue:

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

Testato su pactl 5.0


Puoi aggiungere una spiegazione?
Codice Bling

4

Dato che non posso ancora commentare (registrato in modo specifico per migliorare la risposta di @jgr), nel caso in cui il tuo sink predefinito sia un plug-in (come qualsiasi numero di plug-in ladspa), la sua soluzione di modifica restituirà il XX%, (nota la virgola finale ), quindi funziona un po 'meglio di così. Scusa, il mio awk-fu è molto semplice, sono sicuro che c'è un modo migliore per farlo.

La soluzione modificata omette anche '%' poiché non vedo il punto nel mantenerlo, e se restituiamo solo il numero possiamo usarlo in matematica. Risolto anche il caso setvol, che ha bisogno di istruzioni specifiche nel mio 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
}

2

Puoi usare amixerper leggere il volume di pulseaudio usando l'opzione mixer in questo modo.

$ 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]

Ora possiamo analizzarlo usando grepo sedo perl.

$ amixer -c 1 -M -D pulse get Master | grep -o -E [[:digit:]]+%
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.