Зчитувати пульс-аудіо з командного рядка? (Я хочу: "pactl GET-sink-volume")


25

Я хочу прочитати рівень гучності, з яким можна встановити

pactl set-sink-volume $SINK $VOLUME

Чи є простий спосіб це зробити? Настільки ж просто, як і гіпотетичне

pactl get-sink-volume $SINK

?

(Що я намагаюся зробити? Я використовую Pactl для встановлення гучності, і це дозволяє мені встановити гучність вище 100%, що погана ідея (якість звуку знижується), тому я думаю про створення невеликого сценарію, який буде не переходьте на 100%. Прочитайте. За деякий поріг? Встановіть 100%. Нижче? Додайте 1%. Якщо є інший спосіб зробити це, чудово, скажіть! Найчистішим рішенням було б, мабуть, сказати пульс просто зупинитися на 100%. Але оригінальне питання залишається, має бути якийсь спосіб ..)

Я на Debian, якщо це має значення.


pactl list sinksнадає обсяг, але не в такому приємному простому форматі, як set-sink-volume.
дероберт

2
На запитання Ubuntu є запитання з відповіддю, який дає хороший perl-oneliner для розбору обсягу з цього.
Андреас Візе

@derobert Спасибі, я просто греп і / або сідаю його звідти!
Хігемару

@AndreasWiese Спасибі, не бачив цього. Я швидко поглянув на код Perl, але, мабуть, просто напишу свій власний брудний сценарій. ;-)
Хігемару

Відповіді:


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

Це я маю. Це не акуратно, але цього було досить для мого використання. Я не міг знайти способу це зробити. pactlПросто , здається, не мають будь - яких засобів отримання лістингу на один тоне тільки, але вони друкуються в порядку зростання. Так що вибирає n-й рядок за допомогою tailі head. Зауважте, що у рядку гучності можуть бути окремі томи для правого та лівого каналів, і цей sedзамінник вибирає лише перший, тому що мені було потрібно саме це.

Для запису я використовую номер, pactl list sinks shortщоб отримати свій активний номер раковини:

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

EDIT 2017-10-05: Мені довелося трохи підправити їх через зміни в pulseaudio. Ось що я маю зараз:

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

Я MODвстановив +10 або -10, і я роблю кілька межових перевірок і, нарешті:

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

1
Спасибі! Щоб отримати активний номер раковини, мені потрібно було скористатися pactl list sinks short | grep RUNNING | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,'- Додано sinksміж pactl listтаshort
koushik

Для надійності я б запропонував, LC_ALL=C pactl list sinks | grepоскільки текст "Volume:" може бути локалізований на мові користувача.
Маріус Гедмінас

Оскільки у мене є лише одна раковина, це працювало для мене за сценарієм Баша:volume=$(pactl list sinks | grep Volume | head -n1 | awk '{print $5}')
Маттіас Браун

11

Якщо у вас немає обмеження на використання іншої програми, існує pamixer.

Ви можете отримати гучність за допомогою:

$ pamixer --get-volume

4
У Debian ви можете використовувати pulsemixerпакет. Це виглядає приблизно так само.
Йозеф Куфнер

8

Зауважте, що відповідь Томмі Кентоли покладається на те, що мийка використовується, щоб ви могли фактично отримати номер раковини.

Також зауважте, що він покладається на названі індекси мийки, щоб вони були такими ж, як і підрахований індекс. Скажімо, наприклад, у нас є 3 раковини 1, 2 і 3, і що 3 - це наша вибрана раковина, ми від'єднуємо номер 2, залишаючи нас з 1 і 3. Тепер ви не можете розраховувати, щоб потопити 3 за допомогою рішення Tommi Kyntola, оскільки pactl list sinks | grep "^[[:space:]]Volume:"виведе лише 2 поля гучності, таким чином, провівши голову / хвіст, щоб отримати $SINK + 1'-ву лінію не вийде.

Моє рішення працює на основі припущення, що pacmd завжди буде перераховувати раковини в певному порядку. Якщо ви хочете більш надійного рішення, вам потрібно проаналізувати результат.

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

Примітка. Я не знаю, чи відрізняються поля гучності, моє виглядає так (від pacmd list-sinks):

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

Також я отримую лише гучність першого каналу (передній лівий) у форматі відсотків (тобто поле 5), ваші канали можуть бути на різних рівнях.


Редагувати:

По-друге, ви, мабуть, хочете отримати ім'я раковини за замовчуванням pacmd statдля менш складного рішення:

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

Спасибі! Ваше друге рішення чудово працює. Однак, я думаю, що setdefaulsinkvol () має бутиpactl set-sink-volume $(getdefaultsinkname) "$1"
MountainX для Моніки Стейліо

4

для отримання обсягу я пробую це:

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

3
Примітка: "Том" є перекладеною рідною мовою, тому він працюватиме лише для англійських систем.

3
Якщо у вас кілька раковин, це дасть кілька ліній виводу.
тремтіння

4

Багатомовний варіант:

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

Тестовано на пактілі 5.0


Чи можете ви додати пояснення?
Code Bling

4

Оскільки я ще не можу коментувати (підписаний спеціально для покращення відповіді на @ jgr), у випадку, якщо ваша мийка за замовчуванням є плагіном (як і будь-яка кількість плагінів ladspa), його рішення для редагування поверне XX%, (зверніть увагу на трейлінг кома ), тому це працює трохи краще, ніж це. Вибачте, мій awk-fu - це дуже просто, я впевнений, що є кращий спосіб зробити це.

Змінене рішення також опускає "%", оскільки я не бачу сенсу зберігати його, і якщо ми повернемо лише число, ми можемо використовувати його в математиці. Також виправлено випадок setvol, який потребує конкретних інструкцій у моєму випадку.

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

Ви можете amixerпрочитати гучність імпульсного аудіо, використовуючи такий варіант змішувача.

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

Тепер ми можемо проаналізувати його за допомогою grepабо sedабо perl.

$ amixer -c 1 -M -D pulse get Master | grep -o -E [[:digit:]]+%
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.