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

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

pactl set-sink-volume $SINK $VOLUME

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

pactl get-sink-volume $SINK

?

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

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

20 голосов | спросил Higemaru 27 Maypm14 2014, 19:44:27

7 ответов


15
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}%
ответил Tommi Kyntola 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 18 Sep 2015 15:53:52 +0300 2015, 15:53:52
6

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

Также обратите внимание, что он полагается на индексы имен sink, которые будут совпадать с индексом counted . Скажем, например, у нас есть 3 раковины 1, 2 и 3, и 3 - наш выбранный приемник, затем мы отключим номер 2, оставив нас с 1 и 3. Теперь вы не можете рассчитывать на то, чтобы утонуть 3 с решением Tommi Kyntola, потому что pactl list sinks | grep "^[[:space:]]Volume:" будет выводить только 2 тома, таким образом, конвейер на голову /хвост, чтобы получить $SINK + 1 'th строка не будет работать. (Я испытал эту irl, я не просто nitpicking)

Мое решение работает на основе предположения, что 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), ваши каналы могут находиться на разных уровнях.


EDIT:

Во-вторых, вы, вероятно, действительно хотите получить имя приемника по умолчанию из 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 28 MonEurope/Moscow2015-12-28T16:33:44+03:00Europe/Moscow12bEurope/MoscowMon, 28 Dec 2015 16:33:44 +0300 2015, 16:33:44
4

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

echo `(pactl list sinks | grep "Volume: 0:")| awk '{print $3}'`
ответил kairo 29 +03002014-10-29T06:46:43+03:00312014bEurope/MoscowWed, 29 Oct 2014 06:46:43 +0300 2014, 06:46:43
4

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

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

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

ответил Peter 28 +03002015-10-28T13:40:27+03:00312015bEurope/MoscowWed, 28 Oct 2015 13:40:27 +0300 2015, 13:40:27
4

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

Вы можете получить том с помощью:

$ pamixer --get-volume
ответил yudi-matsuzake 10 Jam1000000amTue, 10 Jan 2017 10:29:01 +030017 2017, 10:29:01
2

Как я еще не могу прокомментировать (специально для того, чтобы улучшить ответ @ 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
}
ответил Ng Oon-Ee 7 AMpThu, 07 Apr 2016 10:45:16 +030045Thursday 2016, 10:45:16
2

Вы можете использовать amixer для чтения тома pulseaudio с помощью опции микшера, как это.

$ 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:]]+%
ответил Ashhar Hasan 5 Maypm16 2016, 17:35:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132