5

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

当我调用 WaveOutOpen() 一次,然后多次调用 WaveOutWrite() 时,声音不是并行的——它们是排队的。

但是当我调用 WaveOutOpen 时说九次(然后存储九个句柄),然后用九种不同的声音调用九次 WaveOutWrite(),它们是并行播放的(多声道)——也就是说它们是混合的。

它似乎有效,但我不确定它是否可以,因为我在任何教程或文档中都没有明确说明。

以这种“许多 WaveOutOpen”的方式播放声音可以吗?

4

3 回答 3

3

当我调用 WaveOutOpen() 一次,然后多次调用 WaveOutWrite() 时,声音不是并行的——它们是排队的。

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

但是当我调用 WaveOutOpen 时说九次(然后存储九个句柄),然后用九种不同的声音调用九次 WaveOutWrite(),它们是并行播放的(多声道)——也就是说它们是混合的。

同样,这是正确的和预期的。这是同时播放许多声音的最简单方法。但是,如果您想要样本准确的混合,您应该自己将音频样本混合成一个样本流并通过单个 WaveOut 设备播放。

于 2011-10-07T09:22:27.947 回答
1

我用 waveOut* API 同时播放和混合声音的能力进行了纠正。

这是好奇的测试代码:http ://www.alax.info/trac/public/browser/trunk/Utilities/WaveOutMultiPlay一个应用程序以参数开始,abc分别在 1、5 和 15 kHz 的不同线程上播放声音,它们混合出色地。

同时,建立在同一 API 之上的DirectShow音频渲染器 (WaveOut) 过滤器无法播放任何内容,只能播放单个流,没有明显的原因。

仅供参考,waveOutOpen API 很久以前就退役了,目前是新 API 之上的包装器。waveOutOpen 假设音频输出设备被打开以供独占使用,因此不能保证同时打开的多个设备会产生混合音频输出。要实现这种行为,最好使用更新的音频 API:DirectSound、DirectSound 之上的 DirectShow 或 WASAPI。

于 2011-10-06T16:03:43.070 回答
0

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

从 DirectX8 开始,API 处于实际上非常轻松的地步,大多数消费类机器都会安装它。

于 2011-10-07T09:35:37.617 回答