如何将 ALSA 2.0 混音至 2.1?

如何将 ALSA 2.0 混音至 2.1?

多年来,我一直在研究 ALSA,同样长时间以来,我一直对它使用的相当不透明的配置系统感到沮丧。毫无疑问,它确实很强大,但得到我想要的东西难的

基本上,我希望我的普通立体声设置能通过低音炮稍微扩展一点,以便不时增加一点俱乐部般的声音。但是,我使用的音频源没有子通道,那么我该如何...

  • 将我的常规 2.0 立体声源混频为 2.1(其中 .1 是子通道)
  • 对子通道进行过滤,使子通道仅处理低频(即制作交叉滤波器)

ALSA 有upmixladspa插件。一个处理混音通道,另一个能够应用各种数字信号处理滤波器。我试了又试,但 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 -laplay -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 上运行mpdupmpdcli这个。使用 Android 上的 BubbleUPNP 和 Windows 上的 SWYH,我可以将 Google 音乐、我自己的媒体以及几乎任何其他内容传输到我超级时髦的设置中。太棒了!

编辑:我还需要做的事情:

  • 我实际上还没有与 BubbleUPNP 配合使用的音量控制。我需要一个正确的 ALSActl定义。其实这不是什么大问题 - 我只需要alsamixer默认将音量调高到 100% - 然后我手动(是的,令人震惊)调整我的放大器的音量。
  • 我希望能够重定向全部我可以从 Android 设备中播放音频,但我只能使用 root 设备和框架来实现这一点Xposed 。这很有效,但我希望能够不使用 root 来实现这一点。

相关内容