ALSA Api:如何同时播放两个波形文件?

Lun*_*oms 6 c linux audio alsa

播放两个独立波形文件所需的API配置/调用是什么?我试图这样做,我得到资源忙的错误.一些解决问题的指针将非常有帮助.

以下是snd_pcm_prepare()第二个wavefile 的错误消息

"Device or resource busy"
Run Code Online (Sandbox Code Playgroud)

Jon*_*nny 20

您可以配置ALSA的dmix插件,以允许多个应用程序共享输入/输出设备.

下面是一个示例配置:

pcm.dmixed {
    type dmix
    ipc_key 1024
    ipc_key_add_uid 0
    slave.pcm "hw:0,0"
}
pcm.dsnooped {
    type dsnoop
    ipc_key 1025
    slave.pcm "hw:0,0"
}

pcm.duplex {
    type asym
    playback.pcm "dmixed"
    capture.pcm "dsnooped"
}

# Instruct ALSA to use pcm.duplex as the default device
pcm.!default {
    type plug
    slave.pcm "duplex"
}
ctl.!default {
    type hw
    card 0
}
Run Code Online (Sandbox Code Playgroud)

这样做如下:

  • 使用dmix插件创建一个新设备,允许多个应用程序共享输出流
  • 创建另一个使用dsnoop,它对输入流执行相同的操作
  • 将这些合并到一个新duplex设备中,该设备将使用该asym插件支持输入和输出
  • 告诉ALSA使用新duplex设备作为默认设备
  • 告诉ALSA用来hw:0控制默认设备(alsamixer等)

坚持这个~/.asoundrc或者/etc/asound.conf你应该好好去.

有关更多信息,请参阅http://www.alsa-project.org/main/index.php/Asoundrc#Software_mixing.

  • 天才!!!!强尼,你是英雄,是的,你是.非常感谢数百万人.干得好,这很棒,我讨厌PulseAudio,对它们的2013年和PA崩溃感到羞耻,让我们成功了.Alsa永远是最好的,只有我的脚本有这个多输出问题,它的500%工作.谢谢你,保持最佳答案. (2认同)

Nik*_* C. 5

ALSA不提供混音器.如果您需要同时播放多个音频流,则需要自己将它们混合在一起.

最简单的方法是将WAV文件解码为float样本,添加它们,并在将它们转换回整数样本时剪切它们.

或者,您可以尝试多次打开默认音频设备(而不是像"hw:0"这样的硬件设备),对于您希望播放的每个流,可以尝试打开一次,并希望加载dmix ALSA插件并提供混音功能.