Đọc khối lượng pulseaudio từ dòng lệnh? (Tôi muốn: Fact pactl GET-chìm-volume ')


25

Tôi muốn đọc mức âm lượng tôi có thể đặt

pactl set-sink-volume $SINK $VOLUME

Có một cách dễ dàng để làm điều đó? Dễ như giả thuyết

pactl get-sink-volume $SINK

?

(Tôi đang cố gắng làm gì? Tôi sử dụng pactl để đặt âm lượng và nó cho phép tôi đặt âm lượng cao hơn 100%, đó là một ý tưởng tồi (chất lượng âm thanh giảm), vì vậy tôi nghĩ về việc viết một kịch bản nhỏ sẽ không vượt quá 100%. Đọc nó ra. Trên một số ngưỡng? Đặt thành 100%. Dưới đây? thêm 1%. Nếu có một cách khác để làm điều đó, thật tuyệt, hãy nói cho tôi biết! Giải pháp sạch nhất có lẽ sẽ khiến xung chỉ dừng lại ở mức 100%. Nhưng câu hỏi ban đầu vẫn còn, phải có cách nào đó ..)

Tôi đang trên Debian nếu điều đó làm cho bất kỳ sự khác biệt.


pactl list sinkscung cấp cho bạn âm lượng, nhưng không phải ở một định dạng dễ dàng như set-chìm-volume.
derobert

2
Có một câu hỏi trên Hỏi Ubuntu với một câu trả lời đưa ra một perl-oneliner tuyệt vời để phân tích âm lượng ra khỏi điều này.
Andreas Wiese

@derobert Cảm ơn, tôi sẽ chỉ grep và / hoặc sed nó ra khỏi đó!
Higemaru

@AndreasWiese Cảm ơn, đã không thấy điều đó. Tôi đã lướt qua mã perl nhưng tôi đoán tôi sẽ chỉ viết kịch bản nhỏ bẩn thỉu của riêng tôi. ;-)
Higemaru

Câu trả lời:


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

Đó là những gì tôi có. Nó không gọn gàng, nhưng nó là đủ cho việc sử dụng của tôi. Tôi không thể tìm ra cách để làm điều đó. Các pactlchỉ dường như không có bất cứ phương tiện nhận được danh sách cho một chìm mà thôi, nhưng họ được in trong thứ tự tăng dần. Vì vậy, chọn dòng thứ n bằng cách sử dụng tailhead. Lưu ý rằng dòng âm lượng có thể có các âm lượng riêng cho các kênh phải và trái và sedthay thế chỉ chọn kênh đầu tiên, vì tôi chỉ cần điều đó.

Đối với bản ghi, tôi sử dụng pactl list sinks shortđể lấy số chìm hoạt động của mình:

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

EDIT 2017-10-05: Tôi đã phải điều chỉnh những thứ đó một chút do những thay đổi trong pulseaudio. Đây là những gì tôi có bây giờ:

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

Tôi đã MODđặt thành +10 hoặc -10 và tôi thực hiện một số kiểm tra ranh giới và cuối cùng:

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

1
Cảm ơn! Để có được số chìm hoạt động, tôi cần sử dụng pactl list sinks short | grep RUNNING | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,'- Đã thêm sinksgiữa pactl listshort
koushik

Để mạnh mẽ, tôi sẽ đề xuất LC_ALL=C pactl list sinks | grepvì văn bản "Âm lượng:" có thể được bản địa hóa thành ngôn ngữ của người dùng.
Marius Gedminas

Vì tôi chỉ có một bồn rửa, điều này hiệu quả với tôi trong kịch bản Bash:volume=$(pactl list sinks | grep Volume | head -n1 | awk '{print $5}')
Matthias Braun

11

Nếu bạn không có một hạn chế để sử dụng một chương trình khác, đó là pamixer.

Bạn có thể lấy âm lượng bằng:

$ pamixer --get-volume

4
Trong Debian, bạn có thể sử dụng pulsemixergói. Nó trông giống nhau.
Josef Kufner

8

Lưu ý rằng câu trả lời của Tommi Kyntola dựa vào bồn rửa đang được sử dụng để bạn thực sự có thể có được số chìm.

Cũng lưu ý rằng nó phụ thuộc vào các chỉ số chìm được đặt tên giống với chỉ số được tính . Ví dụ, giả sử chúng ta có 3 bồn 1, 2 và 3 và 3 là bồn được chọn, sau đó chúng ta ngắt kết nối số 2, để lại cho chúng ta 1 và 3. Bây giờ bạn không thể đếm đến chìm 3 với giải pháp của Tommi Kyntola vì pactl list sinks | grep "^[[:space:]]Volume:"sẽ chỉ xuất 2 trường Âm lượng, do đó chuyển sang đầu / đuôi để có được $SINK + 1dòng thứ 'sẽ không hoạt động. (Tôi đã trải nghiệm irl này, tôi không chỉ là nitpicking)

Giải pháp của tôi hoạt động dựa trên giả định rằng pacmd sẽ luôn liệt kê các mức chìm theo một thứ tự cụ thể. Nếu bạn muốn một giải pháp đáng tin cậy hơn, bạn cần phân tích đầu ra.

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

Lưu ý: Tôi không biết liệu các trường âm lượng có khác nhau không, trường của tôi trông như thế này (từ pacmd list-sinks):

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

Ngoài ra, tôi chỉ nhận âm lượng của kênh đầu tiên (phía trước bên trái) ở định dạng tỷ lệ phần trăm (tức là trường 5), các kênh của bạn có thể ở các mức khác nhau.


CHỈNH SỬA:

Về ý nghĩ thứ hai, có lẽ bạn thực sự muốn lấy tên chìm mặc định pacmd statcho một giải pháp ít phức tạp hơn:

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

Cảm ơn! Giải pháp thứ hai của bạn hoạt động tuyệt vời. Tuy nhiên, tôi nghĩ setdefaulsinkvol () cần phải cópactl set-sink-volume $(getdefaultsinkname) "$1"
MountainX cho Monica Cellio

4

để có được một tập tôi đang thử cái này:

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

3
Lưu ý: 'Tập' là ngôn ngữ bản địa được dịch, vì vậy nó chỉ hoạt động cho các hệ thống tiếng Anh.

3
Nếu bạn có nhiều bồn, điều này sẽ cho nhiều dòng đầu ra.
run 2/11/11

4

Biến thể đa ngôn ngữ:

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

Đã thử nghiệm trên pactl 5.0


Bạn có thể thêm một lời giải thích?
Mã Bling

4

Vì tôi chưa thể nhận xét (đã đăng ký cụ thể để cải thiện câu trả lời của @ jgr), trong trường hợp bồn rửa mặc định của bạn là một plugin (giống như bất kỳ số bổ trợ ladspa nào), giải pháp chỉnh sửa của anh ấy sẽ trả về XX%, (lưu ý dấu phẩy ), vì vậy điều này hoạt động tốt hơn một chút. Xin lỗi, awk-fu của tôi rất cơ bản, tôi chắc chắn có cách tốt hơn để làm điều này.

Giải pháp đã sửa đổi cũng bỏ qua '%' vì tôi không thấy điểm nào trong việc giữ nó và nếu chúng ta chỉ trả về số chúng ta có thể sử dụng nó trong toán học. Cũng đã sửa trường hợp setvol, cần hướng dẫn cụ thể trong trường hợp của tôi.

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

Bạn có thể sử dụng amixerđể đọc âm lượng pulseaudio bằng cách sử dụng tùy chọn bộ trộn như thế này.

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

Bây giờ chúng ta có thể phân tích nó sử dụng grephoặc sedhoặc perl.

$ amixer -c 1 -M -D pulse get Master | grep -o -E [[:digit:]]+%
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.