根据音频输出(内置扬声器或外部设备),自动切换均衡器预设。

以下事实来自于64位笔记本电脑上的Ubuntu 13.10的经验。
背景/问题:音质差的扬声器
众所周知,笔记本电脑扬声器的"频响高度不一致",就如音频专业人士所说。普通人会说:"它们听起来非常糟糕"。
第一步解决方案:均衡
均衡提供了一个有价值的临时解决方案,通过一次性努力显著改善音质。例如,我安装了Web Upd8上的PulseAudio Equalizer
为了取得良好效果,均衡值应基于测量结果进行选择,但这是另外一个故事(虽然使用Ubuntu单独完成也是棘手的,请向我询问详细信息)。
剩余问题:均衡曲线依赖于输出设备
均衡值与整个音频链路相关,尽管扬声器通常是不一致响应的主要原因。
这意味着我有两个均衡配置文件:
  • 一个用于笔记本电脑扬声器的(具有差异很大的均衡曲线)
  • 另一个(曲线更平坦,因此通常可以禁用均衡)当外部立体声插入例如3.5毫米插孔时。

目前实际情况:自动静音/解除静音,好但不足够

  • 当将3.5毫米插头插入外部立体声时,内置扬声器会自动静音,并由Ubuntu堆栈调整音量。这是好的,但不足够。
  • 当拔出插头时,内置扬声器会自动重新激活。这是好的,但不足够。

改进:不仅自动静音,还要自动选择均衡曲线

当插入/拔出3.5毫米插头时,应用正确的均衡器预设会更好。插入外部立体声时,选择平坦的曲线。拔出立体声时,内置扬声器恢复其校正曲线。


问题

如何快速而简单地进行黑客攻击?如何从脚本中检测插孔?

如何进行干净的设置:将均衡器曲线分配给内部扬声器,而不仅仅是插拔事件。

例如,假设我插入一个USB音频设备并通过它播放音频。简单粗暴的解决方法是在3.5毫米耳机插孔连接或断开时改变均衡曲线,尽管实际上音频仍然传输到USB音频设备而不是内置扬声器,使得均衡曲线的改变无关紧要。
在一个“干净”的设置中,均衡配置文件将被清晰地分配给内置扬声器,使其更加稳定。无论情况如何,只有在需要时才会始终应用。
有人正在研究吗?有什么提示吗?
感谢您的关注。

关于“为了获得良好的效果,应根据测量结果选择均衡值”的问题,我在linux - Program measuring sound and generating an equalizer profile - Software Recommendations Stack Exchange上提出了另一个问题。 - Stéphane Gourichon
жӘЂжµ‹жЏ’е…Өе’Њж‹”е‡ғеЏҮд»ӨйЂљиү‡acpi_listenе®һзҺ°пәЊдҢ†ж€‘дёҚзџӨ道如дҢ•ењЁд»»дҢ•иҮ­иЁЂзљ„и„љжњ¬дё­е®һж–ҢгЂ‚ - Tooniis
2个回答

因为我有一个类似的问题,所以我写了一个“快速而简单”的Python脚本,它使用pulseaudio的DBus-Events来检测何时激活哪个均衡器配置文件。
安装
要使用它,您需要将以下行添加到/etc/pulse/default.pa中:
load-module module-dbus-protocol

然后通过pulseaudio-equalizer-gtk禁用均衡器,并点击“应用设置”,现在关闭GUI。
下载apply-equalizer.py,将其保存在某个地方并使其可执行。
以用户身份执行它(!)。也许您需要安装一些额外的Python模块。此外,您可能希望在登录时自动启动它(我不知道最佳方法是什么)。
使用方法
脚本在~/.config/apply-equalizer下为每个端口[1]创建均衡器配置,并在设备更改输出端口时创建符号链接(例如插入或拔出耳机)。
[1]: 许多声卡有不同的端口,例如一个扬声器端口和一个耳机端口
所以:
  1. 拔下耳机。
  2. 打开pulseaudio-equalizer图形界面。
  3. 自定义均衡器设置,直到听起来好为止。
  4. 点击"应用设置"将你所做的配置(包括是否启用均衡器)分配给当前端口(在这种情况下是扬声器)。
  5. 关闭图形界面,然后从第2步开始重复操作,为每个要分配的端口(未插入耳机)进行设置。

现在,当你在扬声器和耳机之间切换时,均衡器设置会自动调整。


太棒了!我会试一试然后汇报的!谢谢分享。 - Stéphane Gourichon
这是我做的:我没有改变/etc/pulse/default.pa,而是改变了~/.config/pulse/default.pa。然后执行pactl exit命令,再运行脚本,然后...在第一次出现"current device has no ports!"之后,它成功了! - Stéphane Gourichon
它能工作,但只有在ActivePortUpdated事件之后。脚本启动时执行的代码行port_addr = fb_sink.Get('org.PulseAudio.Core1.Device', 'ActivePort', dbus_interface=dbus.PROPERTIES_IFACE)每次都失败。不过这仍然是一个很大的进步! - Stéphane Gourichon
你的意思是首先显示“当前设备没有端口!”但是如果触发了ActivePortUpdated事件,它就能正常工作? - Euro
好的。在GitHub上做一个小项目怎么样?我们可以讨论并分享代码。我还得尝试一些登录选项(已经好几天没退出了)。 - Stéphane Gourichon
在遇到有关dbus的问题后,我修改了/etc/pulse/default.pa,但并没有解决。不过,无论如何,我需要测试它是否在启动时工作,目前是手动运行脚本。此外,第一个ActivePortUpdated事件并不总是足够的。如果需要的话,我可以创建一个GitHub项目。祝好。 - Stéphane Gourichon
1我创建了一个 GitHub 存储库:https://github.com/nullEuro/apply-equalizer - Euro

这里有一个手动解决方案,可以在均衡器打开(使用您喜欢的设置)和关闭之间切换。
if [ "$(pulseaudio-equalizer status | grep "Equalizer status" | cut -d"[" -f2 | cut -d"]" -f1)" == "enabled" ]; then
    pulseaudio-equalizer disable
else
    pulseaudio-equalizer enable
fi

将其保存为一个bash脚本文件,创建一个新的面板启动器,以便可以直接从桌面或菜单面板启动该脚本。