Pulseaudio-Volume von der Kommandozeile auslesen? (Ich möchte: "pactl GET-sink-volume")

25

Ich möchte die Lautstärke auslesen, mit der ich einstellen kann

pactl set-sink-volume $SINK $VOLUME

Gibt es einen einfachen Weg, das zu tun? So einfach wie die Hypothese

pactl get-sink-volume $SINK

?

(Was ich versuche zu tun? Ich verwende pactl, um die Lautstärke einzustellen, und es lässt mich die Lautstärke höher als 100% einstellen, was eine schlechte Idee ist (die Klangqualität sinkt), also denke ich darüber nach, ein kleines Skript zu schreiben, das dies tut Nicht über 100% hinausgehen. Ablesen. Über einen bestimmten Schwellenwert hinausgehen. Auf 100% setzen. Unter 1% hinzufügen. Wenn es eine andere Möglichkeit gibt, großartig, sag es mir! Die sauberste Lösung wäre wahrscheinlich, Puls zu veranlassen, einfach anzuhalten bei 100%. Aber die ursprüngliche Frage bleibt, es muss einen Weg geben ..)

Ich bin auf Debian, wenn das einen Unterschied macht.

Higemaru
quelle
pactl list sinksgibt Ihnen die Lautstärke, aber nicht in einem schönen einfachen Format wie Set-Sink-Volume.
Derobert
2
Es gibt eine Frage auf Ask Ubuntu mit einer Antwort, die einen netten Perl-Oneliner gibt, um das Volumen daraus zu analysieren.
Andreas Wiese
@derobert Danke, ich grep und / oder lass es da raus!
Higemaru
@AndreasWiese Danke, hab das nicht gesehen. Ich warf einen kurzen Blick auf den Perl-Code, aber ich denke, ich schreibe einfach mein eigenes schmutziges kleines Skript. ;-)
Higemaru

Antworten:

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

Das habe ich. Es ist nicht ordentlich, aber es war genug für meinen Gebrauch. Ich konnte den Weg dazu nicht finden . Sie pactlscheinen keine Möglichkeit zu haben, eine Auflistung nur für eine Spüle zu erhalten, aber sie werden in aufsteigender Reihenfolge gedruckt. Damit wird die n-te Zeile mit tailund ausgewählt head. Beachten Sie, dass die Lautstärkelinie möglicherweise separate Lautstärken für den rechten und den linken Kanal hat und dass der sedErsatz nur den ersten auswählt, weil ich genau das brauchte.

Für die Aufzeichnung benutze ich die pactl list sinks short, um meine aktive Sink-Nummer zu erhalten:

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

EDIT 2017-10-05: Ich musste diese aufgrund von Änderungen in pulseaudio etwas anpassen. Folgendes habe ich jetzt:

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

Ich habe MODauf +10 oder -10 gesetzt und mache einige Grenzprüfungen und schließlich:

pactl set-sink-volume $SINK ${MOD}%
Tommi Kyntola
quelle
1
Vielen Dank! Um die Nummer der aktiven Spüle zu erhalten, musste ich pactl list sinks short | grep RUNNING | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,'- Added sinksbetween pactl listandshort
koushik
Aus Gründen der Robustheit würde ich vorschlagen, LC_ALL=C pactl list sinks | grepda der Text "Volume:" möglicherweise in der Sprache des Benutzers lokalisiert ist.
Marius Gedminas
Da ich nur ein Waschbecken habe, funktionierte dies für mich in einem Bash-Skript:volume=$(pactl list sinks | grep Volume | head -n1 | awk '{print $5}')
Matthias Braun
11

Wenn Sie keine Einschränkung haben, ein anderes Programm zu verwenden, gibt es das pamixer.

Sie erhalten die Lautstärke mit:

$ pamixer --get-volume
Yudi-Matsuzake
quelle
4
In Debian können Sie das pulsemixerPaket verwenden. Es sieht ungefähr genauso aus.
Josef Kufner
8

Beachten Sie, dass die Antwort von Tommi Kyntola davon abhängt, dass die Spüle verwendet wird, damit Sie die Spülen-Nummer tatsächlich erhalten.

Beachten Sie auch, dass benannte Senkenindizes mit dem gezählten Index identisch sind . Nehmen wir zum Beispiel an, wir haben 3 Waschbecken 1, 2 und 3 und dieses 3 ist unser ausgewähltes Waschbecken. Dann trennen wir die Verbindung zu Nummer 2 und hinterlassen 1 und 3. Jetzt können Sie nicht zählen, dass Sie mit Tommi Kyntolas Lösung 3 sinken, weil pactl list sinks | grep "^[[:space:]]Volume:"Es werden nur 2 Volume-Felder ausgegeben, daher $SINK + 1funktioniert das Weiterleiten an den Kopf / Schwanz, um die 'th-Zeile zu erhalten, nicht.

Meine Lösung basiert auf der Annahme, dass pacmd Senken immer in einer bestimmten Reihenfolge auflistet. Wenn Sie eine zuverlässigere Lösung wünschen, müssen Sie die Ausgabe analysieren.

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

Hinweis: Ich weiß nicht, ob sich die Volume-Felder unterscheiden. Meine sehen wie folgt aus pacmd list-sinks:

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

Außerdem erhalte ich nur die Lautstärke des ersten Kanals (vorne links) im Prozentformat (dh Feld 5). Ihre Kanäle können sich auf verschiedenen Ebenen befinden.


BEARBEITEN:

Auf den zweiten Blick möchten Sie wahrscheinlich den Standardnamen der Senke pacmd statfür eine weniger komplizierte Lösung erhalten:

#/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
quelle
Vielen Dank! Ihre zweite Lösung funktioniert hervorragend. Ich denke jedoch, dass setdefaulsinkvol () sein musspactl set-sink-volume $(getdefaultsinkname) "$1"
MountainX
4

Um ein Volume zu bekommen, versuche ich folgendes:

echo `(pactl list sinks | grep "Volume: 0:")| awk '{print $3}'`
Kairo
quelle
3
Hinweis: Das Volume ist in die Muttersprache übersetzt, sodass es nur für englische Systeme funktioniert.
3
Wenn Sie mehrere Senken haben, werden mehrere Zeilen ausgegeben.
Tremby
4

Mehrsprachige Variante:

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

Getestet auf Pakt 5.0

Peter
quelle
Können Sie eine Erklärung hinzufügen?
Code Bling
4

Da ich noch keinen Kommentar abgeben kann (speziell angemeldet, um die Antwort von @ jgr zu verbessern), gibt Ihre Bearbeitungslösung für den Fall, dass es sich bei Ihrem Standard-Sink um ein Plugin handelt (wie bei einer beliebigen Anzahl von Ladspa-Plugins), XX% zurück (beachten Sie das nachstehende Komma) ), das funktioniert also ein bisschen besser. Tut mir leid, mein awk-fu ist sehr einfach. Ich bin mir sicher, dass es einen besseren Weg gibt, dies zu tun.

In der geänderten Lösung wird auch das '%' weggelassen, da ich den Sinn nicht sehe, es beizubehalten, und wenn wir nur die Zahl zurückgeben, können wir es in Mathematik verwenden. Außerdem wurde der Fall setvol behoben, der in meinem Fall spezielle Anweisungen benötigt.

#/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
quelle
2

amixerMit dieser Mixer-Option können Sie die pulseaudio-Lautstärke ablesen.

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

Jetzt können wir es mit grepoder sedoder analysieren perl.

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