Komut satırından pulseaudio hacmini oku? (İstediğim: “pactl GET-sink-volume”)


25

Ayarlayabildiğim ses seviyesini okumak istiyorum

pactl set-sink-volume $SINK $VOLUME

Bunu yapmanın kolay bir yolu var mı? Varsayım kadar kolay

pactl get-sink-volume $SINK

?

(Ne yapmaya çalışıyorum? Ses seviyesini ayarlamak için pactl kullanıyorum ve ses seviyesini% 100'den daha yüksek ayarlamama izin veriyor, bu kötü bir fikir (ses kalitesi düşüyor), bu yüzden küçük bir senaryo yazmayı düşünüyorum. % 100'den fazla gitmeyin, okuyun, biraz eşikten daha fazla mı,% 100 olarak ayarlayın. Aşağıda,% 1 ekleyin. Bunu yapmanın başka bir yolu varsa, harika, söyle bana! En temiz çözüm muhtemelen nabzın durmasını söylerdi. % 100 at. Ama asıl soru hala kalıyor, bir yolu olmalı ..)

Bu herhangi bir fark yaratırsa Debian'dayım.


pactl list sinkssize hacmi verir, ancak set-sink-volume gibi güzel ve kolay bir biçimde değildir.
derobert

2
Sesi ayrıştırmak için güzel bir perl-oneliner veren bir cevap ile Ubuntu'ya sor üzerine bir soru var .
Andreas Wiese

@derobert Teşekkürler, ben sadece onu grep ve / veya oradan çıkarıyorum!
Higemaru

@AndreasWiese Teşekkürler, görmedim. Perl koduna hızlıca baktım ama sanırım kendi kirli küçük senaryomu yazacağım. ;-)
Higemaru

Yanıtlar:


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

Elimde bu var. Düzgün değil, ama benim kullanmam için yeterliydi. Bunu yapmanın yolunu bulamadım . pactlTek tek lavabo için sadece listeleme almanın herhangi araçlara sahip görünmüyor, ancak artan düzende yazdırılır. Böylece nth satırını tailve kullanarak seçer head. Ses seviyesi çizgisinin sağ ve sol kanallar için ayrı hacimlere sahip olabileceğine ve bu sedikame edicinin yalnızca birincisini seçtiğine dikkat edin, çünkü buna ihtiyacım vardı.

Kayıt pactl list sinks shortiçin aktif havuz numaramı almak için kullanıyorum :

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

EDIT 2017-10-05: Pulseaudio'daki değişikliklerden dolayı bunları biraz değiştirmek zorunda kaldım. İşte şimdi sahip olduklarım:

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

Ben var MOD+10 veya -10 ayarlı ve nihayet bazı sınır kontrolleri ve yapmak:

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

1
Teşekkürler! Aktif havuz numarasını almak için kullanmam gerekiyor pactl list sinks short | grep RUNNING | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,'- ve sinksarasına eklendipactl listshort
koushik

Sağlamlık için şunu önerebilirim, LC_ALL=C pactl list sinks | grepçünkü "Cilt:" metni kullanıcının dilinde yerelleştirilebilir.
Marius Gedminas,

Sadece bir lavaboya sahip olduğum için, bu benim için bir Bash senaryosunda işe yaradı:volume=$(pactl list sinks | grep Volume | head -n1 | awk '{print $5}')
Matthias Braun

11

Başka bir program kullanmak için herhangi bir kısıtlama yoksa pamixer.

Ses seviyesini şunlarla alabilirsiniz:

$ pamixer --get-volume

4
Debian'da pulsemixerpaketi kullanabilirsiniz . Aynı görünüyor.
Josef Kufner

8

Tommi Kyntoya'nın cevabının, lavabon numarasını alabilmeniz için kullanılan lavaboya dayandığını unutmayın.

Ayrıca, sayılan indeks ile aynı olması için adlandırılmış havuz indekslerine dayandığını unutmayın . Örneğin, 3 lavabo 1, 2 ve 3 var ve bu 3 bizim seçtiğimiz lavabosuz, sonra 2 numarayı kesiyoruz, bizi 1 ve 3 ile bırakıyoruz. Şimdi Tommi Kyntola'nın çözümü ile 3'ü batıramazsınız çünkü pactl list sinks | grep "^[[:space:]]Volume:"sadece 2 Hacim alan çıktısı alacaktır, bu yüzden başa / kuyruğa boru $SINK + 1hattı kurarak hattını çalışmayacak.

Çözümüm, pacmd'nin her zaman belirli bir sırayla lavaboları listeleyeceği varsayımına dayanarak çalışır. Daha güvenilir bir çözüm istiyorsanız, çıktıyı ayrıştırmanız gerekir.

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

Not: Cilt alanlarının farklılık gösterip göstermediğini bilmiyorum, benimki şu şekilde görünüyor pacmd list-sinks:

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

Ayrıca sadece ilk kanalın hacmini (ön-sol) yüzde biçiminde (yani alan 5) alıyorum, kanallarınız farklı seviyelerde olabilir.


DÜZENLE:

İkinci düşüncede muhtemelen pacmd statdaha az karmaşık bir çözüm için varsayılan lavabo adını almak isteyeceksinizdir :

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

Teşekkürler! İkinci çözümün harika çalışıyor. Ancak, setdefaulsinkvol () 'nin olması gerektiğini düşünüyorumpactl set-sink-volume $(getdefaultsinkname) "$1"
Monica

4

Ses almak için bunu deniyorum:

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

3
Not: 'Cilt' ana dilden çevrilmiştir, bu nedenle yalnızca ingilizce sistemler için işe yarar.

3
Birden fazla lavabo varsa, bu birden fazla çıktı satırı verecektir.
tremby

4

Çok dilli değişken:

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

Pactl 5.0'da test edildi


Bir açıklama ekleyebilir misiniz?
Kod Bling

4

Henüz yorum yapamadığım için (@ jgr'nin cevabını geliştirmek için özel olarak kaydoldum), varsayılan lavabonuzun bir eklenti olması durumunda (herhangi bir sayıda ladspa eklentisi gibi) düzenleme çözümü% XX döndürür, ), yani bu ondan biraz daha iyi çalışıyor. Üzgünüm, awk-fu'm çok basit, bunu yapmanın daha iyi bir yolu olduğuna eminim.

Değiştirilen çözüm,% 'değerini de göz ardı etmekte zorlandığımı görememektedir ve sadece sayıyı döndürürsek matematikte kullanabiliriz. Ayrıca benim durumumda özel talimatlar gerektiren setvol davası düzeltildi.

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

Bunun amixergibi mikser seçeneğini kullanarak pulseaudio sesini okumak için kullanabilirsiniz .

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

Şimdi grepveya sedveya kullanarak onu ayrıştırabiliriz perl.

$ amixer -c 1 -M -D pulse get Master | grep -o -E [[:digit:]]+%
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.