Bacakan volume pulseaudio dari commandline? (Saya ingin: "pactl GET-sink-volume")

25

Saya ingin membaca level volume yang dapat saya atur

pactl set-sink-volume $SINK $VOLUME

Apakah ada cara mudah untuk melakukan itu? Semudah hipotesis

pactl get-sink-volume $SINK

?

(Apa yang saya coba lakukan? Saya menggunakan pactl untuk mengatur volume dan memungkinkan saya mengatur volume lebih tinggi dari 100% yang merupakan ide yang buruk (kualitas suara turun), jadi saya sedang berpikir tentang menulis skrip kecil yang akan tidak melebihi 100% .Baca keluar. Lebih dari ambang batas? Setel ke 100%. Di bawah ini? Tambahkan 1%. Jika ada cara lain untuk melakukan itu, bagus, katakan padaku! Solusi terbersih mungkin akan memberitahu pulsa untuk berhenti begitu saja 100%. Tapi pertanyaan aslinya tetap, pasti ada beberapa cara ..)

Saya menggunakan Debian jika itu membuat perbedaan.

Higemaru
sumber
pactl list sinksmemberi Anda volume, tetapi tidak dalam format mudah yang bagus seperti set-sink-volume.
derobert
2
Ada pertanyaan di Tanya Ubuntu dengan jawaban yang memberikan perl-oneliner yang bagus untuk mengurai volume dari ini.
Andreas Wiese
@derobert Terima kasih, saya hanya akan mengambil dan / atau mengeluarkannya dari sana!
Higemaru
@AndreasWiese Terima kasih, tidak melihat itu. Aku melihat sekilas kode perl tapi kurasa aku hanya akan menulis skrip kecilku sendiri yang kotor. ;-)
Higemaru

Jawaban:

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

Itu yang saya miliki. Itu tidak rapi, tapi cukup untuk saya gunakan. Saya tidak dapat menemukan cara untuk melakukannya. Orang pactlsepertinya tidak memiliki cara mendapatkan daftar untuk satu wastafel saja, tetapi mereka dicetak dalam urutan menaik. Sehingga memilih baris ke-n menggunakan taildan head. Perhatikan bahwa garis volume mungkin memiliki volume yang terpisah untuk saluran kanan dan kiri dan sedpenggantinya hanya mengambil yang pertama, karena saya membutuhkannya.

Sebagai catatan, saya menggunakan pactl list sinks shortuntuk mendapatkan nomor wastafel aktif saya:

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

EDIT 2017-10-05: Saya harus mengubah sedikit itu karena perubahan di pulseaudio. Inilah yang saya miliki sekarang:

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

Saya telah MODmenetapkan ke +10 atau -10 dan saya melakukan beberapa pemeriksaan batas dan akhirnya:

pactl set-sink-volume $SINK ${MOD}%
Tommi Kyntola
sumber
1
Terima kasih! Untuk mendapatkan nomor wastafel aktif, saya perlu menggunakan pactl list sinks short | grep RUNNING | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,'- Added sinksbetween pactl listandshort
koushik
Untuk ketahanan saya sarankan LC_ALL=C pactl list sinks | grepkarena teks "Volume:" dapat diterjemahkan ke dalam bahasa pengguna.
Marius Gedminas
Karena saya hanya memiliki satu wastafel, ini bekerja untuk saya dalam skrip Bash:volume=$(pactl list sinks | grep Volume | head -n1 | awk '{print $5}')
Matthias Braun
11

Jika Anda tidak memiliki batasan untuk menggunakan program lain, ada pamixer.

Anda bisa mendapatkan volume dengan:

$ pamixer --get-volume
yudi-matsuzake
sumber
4
Di Debian, Anda dapat menggunakan pulsemixerpaket. Itu terlihat hampir sama.
Josef Kufner
8

Perhatikan bahwa jawaban Tommi Kyntola bergantung pada wastafel yang akan digunakan sehingga Anda benar-benar bisa mendapatkan nomor wastafel.

Perhatikan juga bahwa itu bergantung pada indeks wastafel yang dinamai sama dengan indeks yang dihitung . Katakanlah, misalnya, kita memiliki 3 wastafel 1, 2 dan 3 dan 3 itu adalah wastafel pilihan kita, lalu kita putuskan sambungan nomor 2, meninggalkan kita dengan 1 dan 3. Sekarang Anda tidak dapat menghitung untuk tenggelam 3 dengan solusi Tommi Kyntola karena pactl list sinks | grep "^[[:space:]]Volume:"hanya akan menghasilkan 2 bidang Volume, jadi perpipaan ke kepala / ekor untuk mendapatkan$SINK + 1 garis th tidak akan berfungsi. (Saya telah mengalami irl ini, saya tidak hanya melakukan nitpicking)

Solusi saya bekerja berdasarkan asumsi bahwa pacmd akan selalu daftar tenggelam dalam urutan tertentu. Jika Anda menginginkan solusi yang lebih andal, Anda perlu mengurai 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

Catatan: Saya tidak tahu apakah bidang volume berbeda, milik saya terlihat seperti ini (dari pacmd list-sinks):

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

Saya juga hanya mendapatkan volume saluran pertama (kiri-depan) dalam format persentase (yaitu, bidang 5), saluran Anda mungkin ada di level yang berbeda.


EDIT:

Setelah dipikir-pikir, Anda mungkin benar-benar ingin mendapatkan nama bak cuci default dari pacmd statuntuk solusi yang tidak berbelit-belit:

#/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
sumber
Terima kasih! Solusi kedua Anda bekerja sangat baik. Namun, saya pikir setdefaulsinkvol () haruspactl set-sink-volume $(getdefaultsinkname) "$1"
MountainX untuk Monica Cellio
4

untuk mendapatkan volume, saya mencoba yang ini:

echo `(pactl list sinks | grep "Volume: 0:")| awk '{print $3}'`
Kairo
sumber
3
Catatan: 'Volume' adalah bahasa asli yang diterjemahkan, jadi itu hanya akan berfungsi untuk sistem bahasa Inggris.
3
Jika Anda memiliki beberapa sink, ini akan memberikan beberapa baris output.
gemetar
4

Varian multibahasa

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

Diuji pada pactl 5.0

Peter
sumber
Bisakah Anda menambahkan penjelasan?
Kode Bling
4

Karena saya belum dapat berkomentar (mendaftar secara khusus untuk meningkatkan jawaban @ jgr), dalam kasus bahwa bak cuci default Anda adalah sebuah plugin (seperti jumlah plugin ladspa), solusi editnya akan mengembalikan XX%, (perhatikan koma setelahnya ), jadi ini bekerja sedikit lebih baik dari itu. Maaf, awk-fu saya sangat mendasar, saya yakin ada cara yang lebih baik untuk melakukan ini.

Solusi yang dimodifikasi juga menghilangkan '%' karena saya tidak melihat gunanya menyimpannya, dan jika kita mengembalikan hanya angka kita dapat menggunakannya dalam matematika. Juga memperbaiki kasus setvol, yang membutuhkan instruksi khusus dalam kasus saya.

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

Anda dapat menggunakan amixeruntuk membaca volume audio dengan menggunakan opsi mixer seperti ini.

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

Sekarang kita dapat menguraikannya menggunakan grepatau sedatau perl.

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