Winapi 为什么要通过两个部件?

Winapi 为什么要通过两个部件?,winapi,audio,directx,directsound,Winapi,Audio,Directx,Directsound,在IDirectSoundBuffer8的lock方法中,我们假设传递2个部分及其各自的大小。那些是什么?第一部分是锁的开始,第二部分是锁的结束?它们与主缓冲区和辅助缓冲区有关吗?立体声?我完全迷路了 有人能帮忙吗?这里最好的答案是:除非您使用的是Windows XP,否则不要使用DirectSound 如果您一次只播放一个声音,而不关心任何实时混音,那么您可以使用一些非常简单的方法。我假设你真的想要实时混音和播放多个重叠声音的能力 对于Windows 8、Windows 8.1或Windows

在IDirectSoundBuffer8的lock方法中,我们假设传递2个部分及其各自的大小。那些是什么?第一部分是锁的开始,第二部分是锁的结束?它们与主缓冲区和辅助缓冲区有关吗?立体声?我完全迷路了


有人能帮忙吗?

这里最好的答案是:除非您使用的是Windows XP,否则不要使用DirectSound

如果您一次只播放一个声音,而不关心任何实时混音,那么您可以使用一些非常简单的方法。我假设你真的想要实时混音和播放多个重叠声音的能力

对于Windows 8、Windows 8.1或Windows 10,可以使用内置于操作系统中的XAudio 2.8或2.9。否则,您可以使用XAudio 2.7,它是的一部分

请参阅以获取一些教育资源

参见XDeOdio.< /P>的一个简单C++包装器 RE:DirectSound缓冲区

对于您最初的问题:在旧的Windows95时代,“主缓冲区”是提交给硬件的实际音频缓冲区。“辅助缓冲区”是您创建个人“声音”的地方,用于一次播放多个声音。然后,系统将所有辅助缓冲区混合到主缓冲区中进行播放

然而,自从过渡到NT之后,“主缓冲区”就不再存在了。有一种称为“主”缓冲区的东西,但它主要用于BackCompat。DirectSound将所有缓冲区混合到单个缓冲区中,然后将其送入系统进行播放。在WindowsVista或更高版本上,它被输入到WindowsCoreAPI(WASAPI)中,该API将系统和所有正在运行的应用程序的所有声音混合在一起,然后才真正进入音频硬件

您可以直接使用WASAPI,但该API限制性很大,因为它不进行任何应用程序级混合或源速率转换。通常,如果您是一个音频引擎,已经完成了所有必需的转换和混音,并且只想播放最终混音,那么您只能直接使用WASAPI

在任何情况下,处理
Lock
时存在两组指针的原因都是因为它是一个“环形缓冲区”,也称为“循环缓冲区”。在Windows95的旧时代,部分主缓冲区实际上是在硬件播放的同时,您可以在当前播放之前写入缓冲区。为了避免覆盖仍在播放的数据,您进行了这种复杂的双指针设置——否则,您的声音播放会出现可怕的“弹出”或“闪烁”。由于这种情况在现代版本的Windows上再也不会发生了,所以它只用于BackCompat w.r.t.到主缓冲区。这就是说,DirectSound混音器仍然利用辅助缓冲区是“环形缓冲区”这一事实,因此,如果您碰巧正在更新播放缓冲区,那么在“提前”写入时,也会使用相同的机制来保护实时混音器读取。如果没有播放辅助缓冲区,您可以安全地传递第二个指针和大小的
nullptr

这种老式的“环形缓冲区”模型使用起来很复杂,在系统内存非常有限的情况下更为重要。几乎所有现代的声音API都是基于“数据包”的,每个播放的声音都有一个待处理的缓冲区队列,您可以通过向队列提交一个新的缓冲区进行处理来添加更多数据。当缓冲区完成时,您可以收到通知,以知道该“数据包”中的音频已被处理


此外,在DirectSound中,您必须将音频数据复制到
Lock
提供的内存中,但现代的基于“数据包”的API通过直接从应用程序内存读取源数据来避免额外的复制。这确实增加了复杂性,您需要确保源内存在所有播放停止之前保持可用(即,当实时混音器仍在读取内存时,您无法
释放内存,否则应用程序将崩溃),但作为回报,您可以避免大量额外复制。

缓冲区可能是循环的。因此,缓冲区在概念上可以环绕。当这种情况发生时,缓冲区是不连续的,必须由两个不相交的内存区域来表示。当要锁定的大小大于缓冲区大小时,将存储在其他部件上。谢谢大卫。请注意,我对音频一无所知,只是从一些网络搜索中收集到的。你应该自己深入挖掘。当然还有更多的微妙之处。但是websearch会帮你走很长的路,我知道。问题是我刚刚在学习winapi,有时甚至不知道如何搜索。我的英语也帮不上忙。为了回答这个问题,我至少花了15分钟,我担心没有人会理解。所以在这里问一些像DirectSound这样复杂的问题对我来说比让谷歌理解我想说的话更容易。但我会尝试更多。再次感谢您的回复和建议。祝你愉快,大卫。谢谢你提供的信息,但我想你误解了这个问题。无论如何,谢谢你,这些信息是非常有效和有用的。对不起,我还没有写完答案。。。现在我做完了,谢谢你,恰克。这就是我所说的一个了不起的回答。呵呵,太谢谢你了。顺便说一句,很抱歉耽搁了,我最近很忙。