Считанный pulseaudio объем от командной строки? (Я хочу: “pactl GET-sink-volume”)

Не то, чтобы очень вопрос "правильной" файловой системы, но как Вы используете его и как Вы монтируете его.

В случае ext3 и ext4 можно использовать ro, синхронизацию, dirsync опции.

Файловые системы с поглощенным журналом записи обычно лучше, если метаданные синхронизируются перед фактической записью.

В Вашем случае, возможно, случилось так, что кэш библиотеки (/etc/ld.so.cache) был поврежден - простое ldconfig возможно, решил проблему.

Иногда необходимо вынудить полную проверку файловой системы найти и исправить ошибки. Иногда Вам нужна спасательная начальная загрузка через Netboot или CD/DVD (изображение), чтобы сделать так.

fsck -f -y ... - запишите вывод в файл журнала для более позднего обзора.

После этого пройдите каждый файл/каталог, о котором сообщили как багги, и вид пакета все еще в порядке (в основанных системах об/мин: rpm -V) - Debian должен иметь сопоставимый механизм для определения, которые упаковывают файл, принадлежит и проверить целостность пакета.

26
05.08.2014, 17:18
10 ответов

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

Также обратите внимание, что он полагается на то, что именованные индексы приемников совпадают с подсчитываемым индексом. Скажем, например, у нас есть 3 раковины 1, 2 и 3, и эта 3 является нашей выбранной раковиной, затем мы отключаем номер 2, оставляя нам 1 и 3. Теперь вы не можете считать до 3 раковин с решением Томми Кинтола, потому что раковины pactl list | grep "^ [[: space:]] Volume:" будет выводить только 2 поля Volume, таким образом, переход к заголовку / хвосту для получения строки $ 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-drops ):

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

Также я получаю громкость только первого канала (передний -left) в процентном формате (например, поле 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
}
8
27.01.2020, 19:39

Для получения объема я пробую эту:

echo `(pactl list sinks | grep "Volume: 0:")| awk '{print $3}'`
4
27.01.2020, 19:39
pactl list sinks | grep '^[[:space:]]Volume:' | \
    head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \([0-9][0-9]*\)%.*,\1,'

Вот что у меня есть. Неприятно, но мне хватило. Я не мог найти способа сделать это. pactl просто, похоже, не имеет никаких средств получения листинга только для одного приемника, но они печатаются в возрастающем порядке. Таким образом, выбирается n-я строка с использованием хвоста и головы . Обратите внимание, что в строке громкости могут быть отдельные объемы для правого и левого каналов, и что замена sed выбирает только первый, потому что мне это и нужно.

Для записи, я использую список приемников pactl 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}%
19
27.01.2020, 19:39

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

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

Проверено на pactl 5.0

4
27.01.2020, 19:39

Поскольку я еще не могу комментировать (подписался специально, чтобы улучшить ответ @ 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
}
4
27.01.2020, 19:39

Вы можете использовать amixer для чтения тома pulseaudio с помощью опции mixer следующим образом.

$ 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:]]+%
2
27.01.2020, 19:39

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

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

$ pamixer --get-volume
11
27.01.2020, 19:39

Я обнаружил, что некоторые ответы здесь ограничены, особенно если у вас несколько приемников. Поэтому я хочу поделиться тем, что я нашел.

В исходном коде для pulseaudio -ctl есть множество отличных скриптов для «получения» и установки статуса PulseAudio, которые вы можете просмотреть здесь .

Они решили использовать похожий на pactlинструмент под названием pacmd, который также входит в состав PulseAudio. Если вы взглянете на man pacmd, вы обнаружите, что его можно «использовать для самоконтроля или перенастройки работающего звукового сервера PulseAudio во время выполнения»(man-страница pacmd). Этот «самоанализ» — это то, что нам здесь нужно.

Получить текущий объем

pacmd list-sinks|grep -A 15 '* index'| awk '/volume: front/{ print $5 }' | sed 's/[%|,]//g'

Функция из репозитория немного более подробная в зависимости от среды:получить текущий объем

Получить статус отключения звука

Вы также можете получить статус без звука :

pacmd list-sinks|grep -A 15 '* index'|awk '/muted:/{ print $2 }'

Посмотреть здесь:получить статус отключения звука


Сценарий прочь!

Это открывает множество возможностей для сценариев с libnotify(, как это делает библиотека ), и печати нового уровня громкости или возможности реализации с помощью какого-либо другого хука, например воспроизведения звука при изменении громкости.

change-volume.sh:

SINK=$(pacmd list-sinks|awk '/\* index:/{ print $3 }') || "@DEFAULT_SINK@"
pactl set-sink-volume "$SINK" "$@"
canberra-gtk-play -i audio-volume-change -d "$(basename "$0")"

. изменить -объем.ш +5%

2
27.01.2020, 19:39

На самом деле это может быть реализовано как часть команды pulseaudio pactlв какой-то момент в будущем (, начиная с января 2021 года ). Неполный -список мест, где можно отслеживать прогресс:

4
17.01.2021, 11:13
pactl list sinks | tr ' ' '\n' | grep -m1 '%'

Или обрежьте процент с конца:

pactl list sinks | tr ' ' '\n' | grep -m1 '%' | tr -d '%'
0
24.04.2021, 21:53

Теги

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