Odczytać objętość pulseaudio z wiersza poleceń? (Chcę: „pactl GET-sink-volume”)


25

Chcę odczytać poziom głośności, który mogę ustawić

pactl set-sink-volume $SINK $VOLUME

Czy jest na to łatwy sposób? Tak proste, jak hipotetyczne

pactl get-sink-volume $SINK

?

(Co próbuję zrobić? Używam pactl, aby ustawić głośność i pozwala mi to ustawić głośność powyżej 100%, co jest złym pomysłem (jakość dźwięku spada), więc myślę o napisaniu małego skryptu, który będzie nie przekraczaj 100%. Przeczytaj to. Przekroczono pewien próg? Ustawiono na 100%. Poniżej? dodaj 1%. Jeśli istnieje inny sposób, świetnie, powiedz mi! Najczystsze rozwiązanie prawdopodobnie powiedziałoby, żeby puls przestał na 100%. Ale pierwotne pytanie pozostaje, musi być jakiś sposób ..)

Jestem na Debianie, jeśli to robi jakąkolwiek różnicę.


pactl list sinksdaje ci objętość, ale nie w przyjemnym, łatwym formacie, takim jak set-sink-volume.
derobert

2
Jest pytanie na Ask Ubuntu z odpowiedzią dającą miły perl-oneliner do przeanalizowania objętości.
Andreas Wiese

@derobert Dzięki, po prostu grep i / lub sed stamtąd!
Higemaru

@AndreasWiese Dzięki, nie widziałem tego. Rzuciłem okiem na kod perla, ale chyba po prostu napiszę własny, brudny, mały skrypt. ;-)
Higemaru

Odpowiedzi:


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

Właśnie to mam. Nie jest fajnie, ale wystarczyło na mój użytek. Nie mogłem znaleźć sposobu, aby to zrobić. pactlPo prostu nie wydają się mieć żadnych środków na uzyskanie wymieniając tylko na jeden zlew, ale są drukowane w kolejności rosnącej. Tak więc wybiera n-tą linię za pomocą taili head. Zauważ, że linia głośności może mieć osobne głośności dla prawego i lewego kanału i że sedsubstytut wybiera tylko pierwszy, ponieważ właśnie tego potrzebowałem.

Dla przypomnienia używam, pactl list sinks shortaby uzyskać mój aktywny numer zlewu:

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

EDYCJA 2017-10-05: Musiałem je trochę ulepszyć ze względu na zmiany w pulseaudio. Oto co mam teraz:

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

Mam MODustawiony na +10 lub -10 i robię jakieś kontrole graniczne i wreszcie:

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

1
Dzięki! Aby uzyskać numer aktywnej umywalki, musiałem użyć pactl list sinks short | grep RUNNING | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,'- Dodano sinkspomiędzy pactl listishort
koushik

Ze względu na niezawodność sugerowałbym, LC_ALL=C pactl list sinks | grepponieważ tekst „Volume:” może być zlokalizowany w języku użytkownika.
Marius Gedminas

Ponieważ mam tylko jedną umywalkę, działało to dla mnie w skrypcie Bash:volume=$(pactl list sinks | grep Volume | head -n1 | awk '{print $5}')
Matthias Braun

11

Jeśli nie masz ograniczeń korzystania z innego programu, istnieje pamixer.

Możesz uzyskać objętość za pomocą:

$ pamixer --get-volume

4
W Debianie możesz użyć pulsemixerpakietu. Wygląda mniej więcej tak samo.
Josef Kufner,

8

Zauważ, że odpowiedź Tommiego Kyntoli zależy od tego, czy zlew będzie używany, abyś mógł uzyskać numer zlewu.

Należy również pamiętać, że opiera się na nazwanych indeksach ujścia, aby były takie same jak indeks zliczany . Załóżmy na przykład, że mamy 3 zlewy 1, 2 i 3 i że 3 jest naszym wybranym zlewem, następnie odłączamy numer 2, pozostawiając nam 1 i 3. Teraz nie możesz liczyć na zatopienie 3 z rozwiązaniem Tommi Kyntola, ponieważ pactl list sinks | grep "^[[:space:]]Volume:"wypisze tylko 2 pola objętości, więc potokowanie do głowy / ogona w celu uzyskania $SINK + 1linii nie będzie działać.

Moje rozwiązanie działa w oparciu o założenie, że pacmd zawsze będzie wyświetlał zlewy w określonej kolejności. Jeśli potrzebujesz bardziej niezawodnego rozwiązania, musisz przeanalizować dane wyjściowe.

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

Uwaga: nie wiem, czy pola objętości różnią się, moje wygląda następująco (od pacmd list-sinks):

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

Dostaję też tylko głośność pierwszego kanału (lewy przedni) w formacie procentowym (tj. Pole 5), twoje kanały mogą być na różnych poziomach.


EDYTOWAĆ:

Po drugie, prawdopodobnie faktycznie chcesz uzyskać domyślną nazwę zlewu pacmd statdla mniej skomplikowanego rozwiązania:

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

Dzięki! Twoje drugie rozwiązanie działa świetnie. Myślę jednak, że setdefaulsinkvol () musi byćpactl set-sink-volume $(getdefaultsinkname) "$1"
MountainX dla Moniki Cellio

4

dla uzyskania woluminu próbuję tego:

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

3
Uwaga: „Tom” jest tłumaczony na język ojczysty, więc działałby tylko w systemach angielskich.

3
Jeśli masz wiele zlewów, da to wiele wierszy wyniku.
tremby

4

Wariant wielojęzyczny:

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

Testowane na pactl 5.0


Czy możesz dodać wyjaśnienie?
Code Bling

4

Ponieważ nie mogę jeszcze komentować (zarejestrowałem się specjalnie w celu ulepszenia odpowiedzi @ jgr), w przypadku, gdy domyślnym zlewem jest wtyczka (jak dowolna liczba wtyczek ladspa), jego rozwiązanie edycyjne zwróci XX%, (zwróć uwagę na przecinek końcowy ), więc działa to trochę lepiej. Niestety, moje awk-fu jest bardzo proste, jestem pewien, że jest lepszy sposób, aby to zrobić.

Zmodyfikowane rozwiązanie pomija także „%”, ponieważ nie widzę sensu w utrzymywaniu go, a jeśli zwrócimy tylko liczbę, możemy go użyć w matematyce. Naprawiono również przypadek setvol, który w moim przypadku wymaga szczegółowych instrukcji.

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

Możesz użyć amixerdo odczytu głośności pulseaudio, używając opcji miksera w ten sposób.

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

Teraz możemy go przeanalizować za pomocą greplub sedlub perl.

$ amixer -c 1 -M -D pulse get Master | grep -o -E [[:digit:]]+%
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.