Lire le volume pulseaudio depuis la ligne de commande? (Je veux: "pactl GET-sink-volume")

25

Je veux lire le niveau de volume que je peux régler avec

pactl set-sink-volume $SINK $VOLUME

Existe-t-il un moyen facile de le faire? Aussi simple que l'hypothétique

pactl get-sink-volume $SINK

?

(Ce que j'essaie de faire? J'utilise pactl pour régler le volume et cela me permet de régler le volume à plus de 100%, ce qui est une mauvaise idée (la qualité sonore diminue), donc je pense à écrire un petit script qui ne dépasse pas 100%. Lisez-le. Au-dessus d'un certain seuil? Réglez à 100%. En dessous? ajoutez 1%. S'il y a une autre façon de le faire, très bien, dites-moi! La solution la plus propre serait probablement de dire au pouls de s'arrêter à 100%. Mais la question d'origine reste, il doit y avoir un moyen ..)

Je suis sur Debian si cela fait une différence.

Higemaru
la source
pactl list sinksvous donne le volume, mais pas dans un format simple et agréable comme set-sink-volume.
derobert
2
Il y a une question sur Ask Ubuntu avec une réponse donnant un joli perl-oneliner pour analyser le volume de cela.
Andreas Wiese
@derobert Merci, je vais simplement le saluer et / ou le retirer de là!
Higemaru
@AndreasWiese Merci, je n'ai pas vu ça. J'ai jeté un rapide coup d'œil au code Perl mais je suppose que je vais juste écrire mon propre petit script sale. ;-)
Higemaru

Réponses:

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

Voilà ce que j'ai. Ce n'est pas soigné, mais c'était suffisant pour mon usage. Je n'ai pas trouvé le moyen de le faire. Le pactljuste ne semble pas avoir de moyen d'obtenir la liste d'un seul évier, mais ils sont imprimés par ordre croissant. Donc, cela sélectionne la nième ligne en utilisant tailet head. Notez que la ligne de volume peut avoir des volumes séparés pour les canaux droit et gauche et que le sedsubstitut ne choisit que le premier, car j'avais besoin de cela.

Pour mémoire, j'utilise le pactl list sinks shortpour obtenir mon numéro de récepteur actif:

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

EDIT 2017-10-05: J'ai dû les modifier un peu à cause des changements dans pulseaudio. Voici ce que j'ai maintenant:

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

J'ai MODmis à +10 ou -10 et je fais quelques vérifications de limites et enfin:

pactl set-sink-volume $SINK ${MOD}%
Tommi Kyntola
la source
1
Merci! Pour obtenir le numéro de puits actif, je devais utiliser pactl list sinks short | grep RUNNING | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,'- Ajouté sinksentre pactl listetshort
koushik
Pour plus de robustesse, je suggère LC_ALL=C pactl list sinks | grepque le texte "Volume:" puisse être localisé dans la langue de l'utilisateur.
Marius Gedminas
Comme je n'ai qu'un seul évier, cela a fonctionné pour moi dans un script Bash:volume=$(pactl list sinks | grep Volume | head -n1 | awk '{print $5}')
Matthias Braun
11

Si vous n'avez pas de restriction pour utiliser un autre programme, il y a le pamixer.

Vous pouvez obtenir le volume avec:

$ pamixer --get-volume
yudi-matsuzake
la source
4
Dans Debian, vous pouvez utiliser le pulsemixerpaquet. Cela ressemble à peu près.
Josef Kufner
8

Notez que la réponse de Tommi Kyntola repose sur l'évier à utiliser afin que vous puissiez réellement obtenir le numéro de l'évier.

Notez également qu'il s'appuie sur des index récepteurs nommés pour être identiques à l' index compté . Disons, par exemple, que nous avons 3 éviers 1, 2 et 3 et que 3 est notre évier sélectionné, nous déconnectons ensuite le numéro 2, nous laissant avec 1 et 3. Maintenant, vous ne pouvez pas compter pour couler 3 avec la solution de Tommi Kyntola parce que pactl list sinks | grep "^[[:space:]]Volume:"ne produira que 2 champs de volume, donc la tuyauterie vers la tête / la queue pour obtenir la $SINK + 1'e ligne ne fonctionnera pas.

Ma solution fonctionne sur la base de l'hypothèse que pacmd listera toujours les puits dans un ordre spécifique. Si vous souhaitez une solution plus fiable, vous devez analyser la sortie.

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

Remarque: je ne sais pas si les champs de volume diffèrent, le mien ressemble à ceci (de pacmd list-sinks):

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

De plus, je ne reçois que le volume de la première chaîne (avant gauche) en format pourcentage (c'est-à-dire le champ 5), vos chaînes peuvent être à différents niveaux.


MODIFIER:

Après réflexion, vous voulez probablement obtenir le nom du récepteur par défaut pacmd statpour une solution moins compliquée:

#/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
la source
Merci! Votre deuxième solution fonctionne très bien. Cependant, je pense que setdefaulsinkvol () doit êtrepactl set-sink-volume $(getdefaultsinkname) "$1"
MountainX pour Monica Cellio
4

pour obtenir un volume, j'essaie celui-ci:

echo `(pactl list sinks | grep "Volume: 0:")| awk '{print $3}'`
kairo
la source
3
Remarque: le «volume» est traduit en langue maternelle, il ne fonctionnerait donc que pour les systèmes anglais.
3
Si vous avez plusieurs puits, cela donnera plusieurs lignes de sortie.
tremby
4

Variante multilingue:

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

Testé sur pactl 5.0

Peter
la source
Pouvez-vous ajouter une explication?
Code Bling
4

Comme je ne peux pas encore commenter (signé spécifiquement pour améliorer la réponse de @ jgr), dans le cas où votre récepteur par défaut est un plugin (comme n'importe quel nombre de plugins ladspa), sa solution d'édition retournera XX%, (notez la virgule de fin ), donc cela fonctionne un peu mieux que ça. Désolé, mon awk-fu est très basique, je suis sûr qu'il y a une meilleure façon de le faire.

La solution modifiée omet également le '%' car je ne vois pas l'intérêt de le garder, et si nous retournons juste le nombre, nous pouvons l'utiliser en mathématiques. Correction également du cas setvol, qui nécessite des instructions spécifiques dans mon cas.

#/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
la source
2

Vous pouvez utiliser amixerpour lire le volume pulseaudio en utilisant l'option de mixage comme celle-ci.

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

Maintenant, nous pouvons l'analyser en utilisant grepou sedou perl.

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