我正在尝试为很棒的 wm 创建一个小部件来控制和监视音量。
在 ALSA 和 PulseAudio 中获取和设置扬声器音量很容易,但获取实际信号强度怎么样?
我的意思是您听到的实际噪音,例如,如果没有声音播放,则噪音为零。就像您看到的放大器(VU 监视器)一样。
通常我可以设法找到一个文件,/proc/
其中包含有关正在使用的内容的一些值(例如,/proc/stat
CPU 使用情况),但这次情况并非如此。
目标实际上是显示实时音频显示(最好是单独的 L/R 通道),类似于放大器的增益 VU 监视器。
请注意,问题不在于如何为很棒的 wm 进行编程,而是如何获取可用于执行此操作的值
答案1
我认为这不是微不足道的,这个问题可能应该转移到 stackoverflow。
据我所知,没有sysfs
或procfs
没有接口可以访问最终的(ALSA)[音频]混音;甚至不能保证软件中存在这样的事情,因为某些硬件(例如emu10k1
)会执行自己的混合,尽管我承认不知道它是如何工作的。
还有同一张卡上的多个音频输出(数字(如 SPDIF)、模拟、耳机或扬声器等)和多个扬声器配置的问题,更不用说多张卡的可能性了。
最好的选择大概是尝试利用任何使用的 ALSA 设备(大概hw0
如果混合发生在像pulseaudio这样的声音子系统中,或者dmix
没有使用声音子系统),因为这是音频到达硬件之前的“最后一步” 。话虽这么说,我不知道这是否可能;可能不会。
如果您可以假设用户正在使用pulseaudio之类的东西,那么任务就会变得容易得多。软件如帕武控制已经实现了这一点,如下所示回放选项卡,以及预最终混合阶段输出设备。从技术上讲,这涉及获取音频流本身,然后将其转换为频域(例如,通过执行斯托夫)以便以某种方式将其可视化;为此,您真正需要的是访问音频流,pulseaudio 可以通过接收器提供此功能(就像 pavucontrol 所做的那样)。
我帮不了什么忙,不是吗?如果我是你并且只想将其用于我的桌面,并且如果我使用pulseaudio(我自己碰巧使用),我的第一个目标将是尝试获得最终的混合流。那些家伙在这个线程似乎已经找到了一种仅使用pactl
和来做到这一点的雄辩方法pacmd
,这也可以很容易地以编程方式完成。
当您掌握了音频流时,只剩下数学了:-)