多年来,我一直在研究 ALSA,同样长时间以来,我一直对它使用的相当不透明的配置系统感到沮丧。毫无疑问,它确实很强大,但得到我想要的东西难的。
基本上,我希望我的普通立体声设置能通过低音炮稍微扩展一点,以便不时增加一点俱乐部般的声音。但是,我使用的音频源没有子通道,那么我该如何...
- 将我的常规 2.0 立体声源混频为 2.1(其中 .1 是子通道)
- 对子通道进行过滤,使子通道仅处理低频(即制作交叉滤波器)
ALSA 有upmix
和ladspa
插件。一个处理混音通道,另一个能够应用各种数字信号处理滤波器。我试了又试,但 ALSA 总是给我抛出难以解释的错误。我曾单独进行上混和滤波工作,但将它们串联起来总是不太顺利。
答案1
下面的配置正好适合我的情况,并且基于这个帖子描述了非常相似的事情。我将对不同的部分进行评论,以传达我的观点做明白。有些我不太明白,但我承认它们是使事情正常运转所必需的。如果您能进一步完善这一点,请添加解释:
ALSA 配置基本上是相互引用的块链。一个块通过引用与标签一致的下一个块,将一组音频通道移交给另一个块进行处理slave
。我的配置中的第一个标签指定了默认设备,即应用程序在没有指定其他内容时使用的音频设备
pcm.!default "plug:upmix21"
该upmix
插件负责将输入通道混合到不同数量的通道。在这里,我们从 2.0 升级到 5.1,因为该upmix
插件只处理 n 个通道,其中 n%2=0,而且它让我避免使用一个route
我从未设法让它工作的插件
pcm.upmix21 {
type upmix
slave.pcm "lowpass_51to51_plug"
delay 0
channels 6
}
这pcm.lowpass_51to51_plug
是一个句法上的必要性,因为upmix21
块似乎只接受plug
类型块作为从属。
pcm.lowpass_51to51_plug {
type plug
slave.pcm "lowpass_51to51"
}
此位处理调用 LADSPA 过滤器。它们的数量相当多。在 Ubuntu、Raspian 等上,它们随和cmt
包一起提供swh-plugins
。它们可用于各种用途 - ALSA 只是其中之一。在安装时,您应该检查指向path
过滤ladspa
器在系统上的位置。
在此配置中,我使用了两个插件,它们通过 ID 来引用。1098
是一个直通滤波器,它只将输入复制到输出,但如果没有它,未特别提及的通道将不会有声音。语法有点奇怪,因为即使您只指定输入和输出通道 0,所有通道都会被复制。显然,这就是它的工作原理。滤波器 1051 是一个低通滤波器,它接受交叉频率 - 在我的情况下是 120Hz。我将其应用于通道 5,即上混立体声信号中的 LFE 或低音炮通道。
pcm.lowpass_51to51 {
type ladspa
slave.pcm "upmix_51to51_float"
path "/usr/lib/ladspa"
channels 6
plugins {
0 {
id 1098 # Identity (Audio) (1098/identity_audio)
policy duplicate
input.bindings.0 "Input";
output.bindings.0 "Output";
}
1 {
id 1051 # Low-pass filter.
policy none
input.bindings.5 "Input";
output.bindings.5 "Output";
input {
controls [ 120 ] # No higher than 120 Hz - nothing good.
}
}
}
}
接下来的一点我不太明白,但它是必要的——否则,ALSA 会出错,说格式不兼容。基本上,我们将音频格式设置为S16_LE
(立体声 16 位低端?)。我认为这已经确定了,但我承认我需要这个——如果可以的话,请在这里添加一个解释。
pcm.upmix_51to51_float {
type lfloat
slave.pcm "21route"
slave.format "S16_LE"
}
在测试时,我实际上使用了 5.1 设置来弄清楚哪些有效,哪些无效。此块允许我将不需要的频道静音。ttable
以 形式保存映射<input channel>.<output channel> <volume>
。这实际上是最后一个块,因为它的从属设备是surround51
- 一个随我的 ASUS Xonar U7 声卡附带的 pcm 设备。检查aplay -l
和aplay -L
以查看您的设备的名称。
pcm.21route {
type route
slave.pcm "surround51"
ttable {
0.0 1 # left channel
1.1 1 # right channel
2.2 0 # mute
3.3 0 # mute
4.4 0 # mute
5.5 1 # sub channel
}
}
就是这样。我不知道我总共花了多长时间。这是一个断断续续的项目,现在已经成功了。我希望这可以帮助别人比我花更少的时间。
顺便说一句,我已经在 RasPi 2 上运行mpd
了upmpdcli
这个。使用 Android 上的 BubbleUPNP 和 Windows 上的 SWYH,我可以将 Google 音乐、我自己的媒体以及几乎任何其他内容传输到我超级时髦的设置中。太棒了!
编辑:我还需要做的事情:
- 我实际上还没有与 BubbleUPNP 配合使用的音量控制。我需要一个正确的 ALSA
ctl
定义。其实这不是什么大问题 - 我只需要alsamixer
默认将音量调高到 100% - 然后我手动(是的,令人震惊)调整我的放大器的音量。 - 我希望能够重定向全部我可以从 Android 设备中播放音频,但我只能使用 root 设备和框架来实现这一点
Xposed
。这很有效,但我希望能够不使用 root 来实现这一点。