как считывать уровень громкости клиентов pulseaudio в консоли - PullRequest
4 голосов
/ 19 февраля 2011

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

Проблема, которую мне нравится решать, заключается в следующем: Я слушаю музыку в формате xmms, затем ставлю ее на паузу, чтобы послушать песню, которую мой друг прислал мне на YouTube. Через час я вдруг обнаружил, что не слушаю музыку!

(очень базовое) решение, о котором я думал, это bash-скрипты, которые просто проверяют громкость всех приложений, кроме xmms каждую секунду, если какое-либо приложение издает звук, xmms приостанавливается, если нет звука, и xmms молчит, xmms включен. (Я хочу иметь возможность делать это в приложении, например, pidgin следует игнорировать)

Я мог найти только графические инструменты для чтения тома, например, pavucontrol, который хорошо его отображает. Я действительно не хотел бы кодировать все виды программ на C, чтобы сделать такую ​​простую вещь, поэтому:

  1. Думал ли я в правильном направлении, или есть более простое решение
  2. Если нет, как мне узнать текущий уровень громкости для отдельных приложений

Ответы [ 3 ]

7 голосов
/ 02 марта 2011

Возможно, вы можете записать один сэмпл аудио из выходного потока и посмотреть, равен ли он (близок) 0. Этот конвейер дает вам один сэмпл в виде числа от -32768 до 32767 (включительно):

parec --raw --channels=1 --latency=2 2>/dev/null | od -N2 -td2 | head -n1 | cut -d' ' -f2- | tr -d ' '

Вам потребуется настроить аргументы parec и, возможно, конфигурацию PulseAudio, чтобы подключиться к выходному потоку и записать его.

2 голосов
/ 02 марта 2011

pactl list выводит список ... ну, похоже, почти все.С работающим экземпляром mplayer -ao pulse я получаю следующее:

Sink Input #2
        Driver: protocol-native.c
        Owner Module: 8
        Client: 10
        Sink: 0
        Sample Specification: s16le 2ch 44100Hz
        Channel Map: front-left,front-right
        Mute: no
        Volume: 0: 100% 1: 100%
                0: 0.00 dB 1: 0.00 dB
                balance 0.00
        ...
        Properties:
                media.name = "audio stream"
                application.name = "MPlayer"
                native-protocol.peer = "UNIX socket client"
                ....
                application.process.binary = "mplayer"
                ...

Это не дает вам текущие уровни монитора (громкость воспроизводимого в данный момент аудио), но, может быть, этого достаточно?

0 голосов
/ 02 марта 2011

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

...