winmm的多声道声音,很多WaveOutOpen?

时间:2011-10-06 14:47:33

标签: windows winapi audio winmm

我试图以多声道(并行)方式在Windows XP上播放声音。 我曾经读过某个地方,用WinMM播放平行声音可能是不可能的, 但这是我观察到的:

当我调用WaveOutOpen()一次,然后多次调用许多WaveOutWrite()时 然后声音不平行 - 它们排队等候。

但是当我打电话给WaveOutOpen说九次(然后存储九个句柄) 然后用九种不同的声音调用九次WaveOutWrite() 并行播放(多频道) - 即他们是混合的。

它似乎有用,但我不确定它是否可以,因为我没有发现它清楚 在任何教程或文档中。

可以用这么多'WaveOutOpen'的方式播放声音吗?

3 个答案:

答案 0 :(得分:3)

  

当我调用WaveOutOpen()一次,然后调用很多WaveOutWrite()时   然后声音不是平行的 - 它们排队等候。

这正是应该发生的事情。 WaveOutWrite将下一个缓冲区排队。它允许您以小块发送要播放的音频。

  

但是当我打电话给WaveOutOpen说九次(然后存储九次   处理它然后用九次调用WaveOutWrite()九次   不同的声音它们是并行播放的(多声道) - 也就是说   他们是混合的。

同样,这是正确和预期的。这是播放许多同步声音的最简单方法。但是,如果您希望样本准确混合,则应将自己的音频样本混合到一个样本流中,然后通过单个WaveOut设备进行播放。

答案 1 :(得分:1)

我的观点是waveOut * API能够同时播放声音和混音。

以下是好奇的测试代码:http://www.alax.info/trac/public/browser/trunk/Utilities/WaveOutMultiPlay以参数abc启动的应用程序分别在1,5和15 kHz的不同线程上播放,并且它们混合良好。

同时,建立在同一API之上的DirectShow Audio Renderer (WaveOut) Filter无法播放任何单个流,因为没有明显的原因。

FYI waveOutOpen API自很久以前就已经退役,目前是新API的封装。 waveOutOpen假定音频输出设备是专用的,因此无法保证多次打开的设备可以产生混合的音频输出。要实现这样的行为,最好使用更新的音频API:DirectSound,DirectSound或WASAPI之上的DirectShow。

答案 2 :(得分:0)

如果您的产品面向消费者,我建议您使用DirectSound。

从DirectX8开始,API实际上非常轻松,大多数消费者机器都会安装它。