我正在尝试在Windows XP上以多通道(并行)方式播放声音。我在某个地方读到过,用WinMM播放平行声音可能是不可能的,但这是我观察到的:
当我调用一次WaveOutOpen(),然后调用多次waveoutrite ()那么声音就不是并行的了——它们是排队的。
但是当我调用WaveOutOpen说9次(然后存储9个句柄)然后用9种不同的声音调用9次wavewrite ()并行播放(多声道)-即它们是混合的。
它似乎工作,但我不确定如果它是好的,因为我没有发现它陈述清楚
在这样的"许多WaveOutOpen"方式下播放声音是可以的吗??
当我调用一次WaveOutOpen(),然后调用多次waveoutrite ()然后声音不是并行的——它们是排队的。
这正是应该发生的。wavewrite将下一个缓冲区排队。它允许你发送你想要播放的小块音频。
但是当我调用WaveOutOpen说9次(然后存储9次)然后调用9次wavewrite ()不同的声音是并行播放的(多声道)——也就是说它们是混合的。
同样,这是正确的和预期的。这是同时播放许多声音的最简单的方法。如果你想要采样准确的混合,但是,你应该把音频样本自己混合成一个样本流,并通过一个单一的WaveOut设备播放。
我纠正了waveOut* API同时播放和混合声音的能力。
下面是好奇的测试代码:http://www.alax.info/trac/public/browser/trunk/Utilities/WaveOutMultiPlay一个应用程序以参数abc
开始,分别在不同的线程上播放1,5和15khz的声音,它们混合得很好。
同时,基于相同API的DirectShow Audio Renderer (WaveOut) Filter无法播放单个流之外的任何内容,原因不明。
仅供参考,waveOutOpen API很早以前就已经退役了,目前是新API的包装器。waveOutOpen假设音频输出设备是为独占使用而打开的,因此不能保证多个打开的设备同时会产生混合音频输出。要实现这样的行为,你最好使用较新的音频API: DirectSound, DirectShow在DirectSound或WASAPI之上。
如果你的产品是面向消费者的,我建议使用DirectSound。
从DirectX8开始,API实际上是相当轻松的,大多数消费机器都会安装它。