如何在控制台中读出pulseaudio客户端的音量级别

时间:2011-02-18 21:50:33

标签: linux console pulseaudio

我想读出当前为pulseaudio的几个客户播放的音频音量。

我想解决的问题如下: 我正在用xmms听音乐,然后我把它暂停,听一个朋友在youtube上发给我的一首歌。一个小时后,我突然发现我没有听任何音乐!

我想到的(非常基本的)解决方案是一个bash脚本,它只检查除xmms以外的所有应用程序的音量,如果有任何应用程序发出声音,xmms暂停,如果没有声音,和xmms是静默的,xmms已启用。 (我确实希望能够以app的方式执行此操作,例如,应该忽略pidgin)

我只能找到读取音量的图形工具,比如pavucontrol,它可以很好地显示它。我真的不想编写各种C程序来做这么简单的事情,所以:

  1. 我是在想正确的方向,还是有更简单的解决方案
  2. 如果没有,我如何读取单独应用的当前音量级别

3 个答案:

答案 0 :(得分:7)

也许您可以从输出流中录制一个音频样本,看看它是否(接近)0。此管道为您提供单个样本,数字形式介于-32768和32767(含)之间:< / p>

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

您需要调整parec参数,可能还需要调整PulseAudio配置,以便接入输出流并从中进行记录。

答案 1 :(得分:2)

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"
                ...

虽然它没有提供当前的显示器级别(当前正在播放的音频的音量),但也许它已经足够了?

答案 2 :(得分:0)

我甚至不愿意阅读这些卷。我写了一个模块,其中包含一个接收器,可以检测连接到它的应用程序的数量,并可以执行基于此的操作,以及可以指向现有接收器以进行最终音频输出的虚拟应用程序。