【问题标题】:multi channel sound with winmm, many WaveOutOpen?用winmm多声道声音,多WaveOutOpen?
【发布时间】:2011-12-02 07:53:51
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 整理了你的问题。希望你不要介意。
  • 不要太在意 ;-) (我看到“意义”可能略有改变,但不会太多)
  • 请注意,某些音频驱动程序无法多次 WaveOutOpen。​​

标签: windows winapi audio winmm


【解决方案1】:

waveOut* API 能够同时播放和混合声音。

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

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

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

【讨论】:

  • 但它似乎工作,并且是系统(没有库 - 这对我来说很重要)并且很容易。我不想应付directx,我用纯c和纯winapi写
  • 对你有好处 - 对你有用,对我的音频硬件不起作用。使用 Windows SDK 中的 GraphEdit 工具实际上很容易检查。
  • 如果你给我带来坏消息,我需要(想要)用纯系统(无库)播放多声道声音。
  • 不正确,waveOutOpen 得到了很好的支持,尽管它是一个旧的 Windows API。您可以同时运行它的多个实例。
  • @Roman 我经常使用多个并发 WaveOut 实例,但我从未见过它们无法正确混合声音。据我了解,当您使用多个 WaveOutOpens 时,Windows 会为您进行混合(和采样率转换)。在 Windows XP 时代,它使用KMixer,但我怀疑 Vista/Win7 在下面使用 WASAPI 框架。这是 WaveOut 延迟很差的部分原因。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    但是当我调用 WaveOutOpen 时说九次(然后存储九次 处理它),然后用九次调用 WaveOutWrite() 九次 它们并行播放(多声道)的不同声音 - 即 它们是混合的。

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

    【讨论】:

    • 第二部分不正确。没有发生混合。行为是满足其中一个 waveOutOpens 并播放此提要。其他声音在波形句柄上被消耗,但被丢弃并且它们没有到达实际设备。因此,不会发生混合。
    • 根据 OP,他们正在同时播放,因此可能看起来是混合的。
    • 正如我所提到的,您不需要编写一行代码来检查这一点。使用 Windows SDK graphedt.exe,您可以使用 Default WaveOut Device 自己尝试一下,看看它是否有效。即使它适用于 OP,他的问题的答案是预期的行为是“否”。
    • 我们将不得不不同意,因为我相信它确实有效。我有一个可以轻松证明这一点的测试程序,我所开发的产品安装在全球数千个地点,并定期使用此功能。阅读 KMixer 以了解 windows 是如何做到这一点的。
    • 我检查了我的台式机和笔记本电脑(虽然都是 Win 7 x64),但它们都不能正常工作。我想如果您保持设备打开并且不排队新缓冲区,它可能对您有用 - 然后另一个设备变得可播放。但是,如果您同时播放两个而没有间隙-它就是行不通的。我的系统很容易证明它不起作用 - 对我来说已经足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2021-04-20
    • 2011-06-25
    相关资源
    最近更新 更多