本文来自依云's Blog,转载请注明。
之前我写过一篇文章,讲述我使用 EasyEffects 的均衡器来调整 Bose 音箱的音效。最近读者 RNE 留言说可以直接通过 PipeWire 实现,于是前几天我实现了一下。
先说一下换了之后的体验。相比于 EasyEffects,使用 PipeWire 实现此功能获得了以下好处:
- 少用一个软件(虽然并没有多大)。
- 不依赖图形界面。EasyEffects 没有图形界面是启动不了的。
- 占用内存少。EasyEffects 有时候会占用很多内存,不知道是什么问题。
- 自己实现的切换逻辑,更符合自己的需求。EasyEffects 只能针对指定设备加载指定的配置,不能指定未知设备加载什么配置。因此,当我的内置扬声器名称在「alsa_output.pci-0000_00_1f.3.analog-stereo」、「alsa_output.pci-0000_00_1f.3.7.analog-stereo」或者「alsa_output.pci-0000_00_1f.3.13.analog-stereo」等之间变化时,我需要一个个名称地指定要加载的配置。
- 只要打开 pavucontrol 就能确认均衡器是否被应用了。EasyEffects 需要按两下Shift-Tab和空格(或者找找鼠标)来切换界面。
缺点嘛,就是我偶尔使用的「自动增益」功能没啦。不过自动增益的效果并不太好,我都是手动按需开关的。没了就没了吧。
配置方法
首先要定义均衡器。创建「~/.config/pipewire/pipewire.conf.d/bose-eq.conf」文件,按《Linux好声音(干净的均衡器)》一文的方式把均衡器定义写进去就好了。我的文件见 GitHub。
然后需要在合适的时候使用这个均衡器。实际上上述配置加载之后,PipeWire 里就会多出来一对名叫「Bose Equalizer Sink」的设备,一个 source 一个 sink。把 source 接到音箱,播放声音的程序接到 sink,就用上了。别问我为什么 source 的名字也是「Sink」,我不会分开定义它们的名字……
自动化应用使用的是 WirePlumber 脚本。它应该放在「~/.local/share/wireplumber/scripts」里,但是我为了方便放到 dotconfig 仓库里管理,在这里放了个到「~/.config/wireplumber/scripts」的软链接。脚本干的事情很简单:在选择输出设备的时候,看看当前默认设备是不是 Bose 音箱;如果是,就选择之前定义的「Bose Equalizer Sink」作为输出目标。不过因为文档匮乏,为了干成这件事花了我不少精力,翻看了不少 WirePlumber 自带脚本和源码。最终的脚本也在 GitHub 上。
结语
PipeWire 挺强大的,就是文档太「瘦弱」啦。能用脚本配置的软件都很棒~
再次感谢读者 RNE 的留言~
Aug 08, 2024 01:36:35 AM
我也遇到了问题,请问,github的地址是多少呢?感谢
Aug 08, 2024 09:58:01 AM
啊?文中链接了呀。带下划线的粗体字都是超链接。
Aug 08, 2024 06:05:02 PM
麻烦加我一下微信,26917235,我用您这个脚本,提示attempt to call a nil value(field open_topic)
Aug 08, 2024 08:46:26 PM
微信在 Linux 上太难用了。用 Telegram(@lilydjwg) / Matrix(@lilydjwg:mozilla.org)吧。
Aug 08, 2024 11:20:34 PM
好的,那我注册一个账号,然后添加你好友
Aug 09, 2024 11:23:10 AM
我下载了Telegram,无法注册账号
Aug 09, 2024 01:17:33 PM
现在 Telegram 的反垃圾是比较狠……注册个 Matrix 账号吧,用你喜欢的服务器就行。
Aug 09, 2024 02:18:24 PM
我知道问题了,我客户的机器是wireplumber0.4.17版本,您这个脚本应该是0.5.x的版本,一些函数不支持的原因
Aug 09, 2024 08:59:48 PM
哦,原来如此。我现在用的是 0.5.5。
Oct 02, 2024 12:52:06 AM
上游合并了一个 module 可以直接加载 Parametric EQ 格式的均衡器配置文件,不过还没发版本。
https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/68ed40570de272bd78c1ecb23c4cc4bdf911c0d3
Oct 02, 2024 01:10:12 AM
另外可以看看 Wireplumber 的 Smart Filter 机制
https://www.collabora.com/news-and-blog/blog/2024/06/26/smart-audio-filters-with-wireplumber-0.5/
Oct 02, 2024 02:43:44 AM
虽然文档没直说,但是 filter.smart.target 的 node.name 是可以用正则表达式的