Считать громкость импульса из командной строки? (Я хочу: «pactl GET-sink-volume»)

25

Я хочу зачитать уровень громкости, который могу установить

pactl set-sink-volume $SINK $VOLUME

Есть ли простой способ сделать это? Так легко, как гипотетически

pactl get-sink-volume $SINK

?

(Что я пытаюсь сделать? Я использую pactl для установки громкости, и это позволяет мне устанавливать громкость выше 100%, что является плохой идеей (качество звука снижается), поэтому я думаю о написании небольшого сценария, который будет не превышайте 100%. Прочитайте это. За некоторый порог? Установите на 100%. Ниже - добавьте 1%. Если есть другой способ сделать это, отлично, скажите мне! Самое чистое решение, вероятно, скажет пульс просто остановиться. на 100%. Но оригинальный вопрос остается, должен быть какой-то путь ..)

Я на Debian, если это что-то меняет.

Higemaru
источник
pactl list sinksдает вам объем, но не в таком удобном формате, как set-sink-volume.
Дероберт
2
Есть вопрос на Ask 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,'

РЕДАКТИРОВАТЬ 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:» может быть локализован на язык пользователя.
Мариус Гедминас
Поскольку у меня есть только одна раковина, это сработало для меня в сценарии Bash:volume=$(pactl list sinks | grep Volume | head -n1 | awk '{print $5}')
Матиас Браун
11

Если у вас нет ограничений на использование другой программы, есть pamixer.

Вы можете получить объем с:

$ pamixer --get-volume
Yudi-matsuzake
источник
4
В Debian вы можете использовать pulsemixerпакет. Это выглядит примерно так же.
Йозеф Куфнер
8

Обратите внимание, что ответ Tommi Kyntola зависит от использования приемника, чтобы вы могли получить номер приемника.

Также обратите внимание, что он полагается, что именованные индексы приемника совпадают с подсчитанным индексом. Скажем, например, у нас есть 3 приемника 1, 2 и 3, и что 3 - это выбранный приемник, затем мы отключаем номер 2, оставляя нам 1 и 3. Теперь вы не можете рассчитывать на приемник 3 с решением Томми Кинтолы, потому что 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
}
JGR
источник
Благодарность! Ваше второе решение прекрасно работает. Тем не менее, я думаю, что setdefaulsinkvol () должен бытьpactl set-sink-volume $(getdefaultsinkname) "$1"
MountainX для Monica Cellio
4

для получения тома я пытаюсь это:

echo `(pactl list sinks | grep "Volume: 0:")| awk '{print $3}'`
Kairo
источник
3
Примечание: «Том» переведен на родной язык, поэтому он будет работать только для английских систем.
3
Если у вас есть несколько приемников, это даст несколько строк вывода.
Тремби
4

Многоязычный вариант:

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

Протестировано на pactl 5.0

Питер
источник
Можете ли вы добавить объяснение?
Код Блинг
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:]]+%
Ашхар Хасан
источник