音频混合使用c ++中的alsa的dmix插件

时间:2013-08-08 16:27:29

标签: c++ linux audio alsa

我尝试使用alsa同时播放两个wav文件。请注意,wav文件具有不同的采样率。这是可能的,并且音频流被混合并发送到音频芯片。 (我正在开发一个嵌入式Linux设备。)但是一个流的播放速度比正常情况快几倍。所以我猜重新采样存在问题。

我在/etc/asound.conf中启用了dmix插件的默认设备,并将采样率设置为44100Hz。但根据我的理解,ALSA将内部的所有流重新采样到48khz并混合它们,然后再将它们再次采样到我想要的输出速率,在我的情况下为44.1khz。

这是对的吗?

使用alsa-lib播放音频文件时,是否需要为该特定wav文件设置所有参数?

例如:8000hz mono 16-bit

  • 将snd_pcm_hw_params_set_rate()设为8000hz
  • snd_pcm_hw_params_set_format到16位LE / BE /签名/未签名
  • snd_pcm_hw_params_set_channels for mono

这是否会更改设备的硬件设置或仅更改此特定音频流?

任何澄清都将不胜感激。

修改

我可能误解了以下内容:[ALSA]

启用软件混合后,ALSA会强制将所有内容重新采样到相同的频率(默认情况下,支持时为48000)。 dmix使用差的重采样算法,会产生明显的音质损失。

所以要明确的是,如果我将dmix设备的asound.conf中的速率更改为44100,那么应该将所有内容自动重新采样到44100并混合使用吗?

因此,我的两个混合音频文件之一的速度不正确的原因可能是由使用alsa-lib的错误流设置引起的?

因为如果我一次播放一个wav文件,两个流似乎都是正确的。 只有在第一个播放时,同时我在流中混合另一个,第一个wav文件的速度才会改变。请注意,此时hw设置是相同的。为什么设置stream2的hw参数(和播放)会改变stream1中的内容?

1 个答案:

答案 0 :(得分:1)

ALSA没有固定的48 kHz重采样。

dmix设备使用固定的采样率和格式,但使用它的所有设备通常使用plug插件启用自动转换。

使用alsa-lib时,必须设置对您很重要的所有参数;对于未明确设置的任何参数,alsa-lib选择一个稍微随机的值。

不同的流可以使用不同的参数。