在IDirectSoundBuffer8的锁定方法上,我们假设要传递2个部分及其各自的大小。那些是什么?第一部分是开始,第二部分是锁的结束?它们与主缓冲区和辅助缓冲区有关吗?立体声?我完全迷失了。
有人可以帮忙吗?
答案 0 :(得分:3)
这里最好的答案是:除非使用的是Windows XP,否则不要使用DirectSound。
如果您一次只播放一个声音并且不关心任何实时混音,则可以使用像PlaySound这样的小事。我假设你真的想要实时混音以及播放多个重叠声音的能力。
对于Windows 8,Windows 8.1或Windows 10,您可以使用操作系统内置的XAudio 2.8或2.9。否则,您可以使用XAudio 2.7,它是legacy DirectX SDK。
的一部分有关某些教育资源,请参阅Learning XAudio2。
有关XAudio2的简单C ++包装,请参阅DirectX Tool Kit for Audio。
RE:DirectSound缓冲区
回答你原来的问题:在Windows 95的旧时代,'主缓冲区'是提交给硬件的实际音频缓冲区。 “辅助缓冲区”是您创建个人“声音”的地方,用于一次播放多个声音。然后,系统将所有辅助缓冲区混合到主缓冲区中以进行回放。
然而,自从转换到NT之后,'主缓冲区'就不再存在了。有一种称为“主要”缓冲区的东西,但它主要用于BackCompat。所有缓冲区都由DirectSound混合到一个缓冲区中,然后送到系统进行回放。在Windows Vista或更高版本中,它被提供给Windows Core API(WASAPI),它将来自系统和所有正在运行的应用程序的所有声音混合在它实际进入音频硬件之前。
您可以直接使用WASAPI,但API非常严格,因为它不会执行任何应用程序级混合或源速率转换。一般情况下,如果您的音频引擎已经完成了所有必需的转换并且只是想进行最终混音,那么您只能直接使用WASAPI。
在任何情况下,处理Lock
时有两组指针的原因是因为它是一个“环形缓冲区”,又称“循环缓冲区”。在Windows 95的旧时代,主要缓冲区的一部分实际上将由硬件播放,与您在当前正在进行播放的位置之前写入缓冲区的时间完全相同。你有这个复杂的双指针设置,以避免覆盖仍在播放的数据 - 否则你的声音播放中可怕的'弹出'或'故障'。因为在现代版本的Windows上不再发生这种情况,所以它只适用于BackCompat w.r.t.到主缓冲区。也就是说,DirectSound调音台仍然利用了辅助缓冲区是“环形缓冲区”这一事实,所以如果您正好更新播放,同样的机制用于保护实时调音台读数缓冲。如果没有播放辅助缓冲区,您可以安全地将nullptr
传递给第二个指针&大小
这种老式的“环形缓冲区”模型很难处理,并且在系统内存非常有限时更为重要。几乎所有现代声音API都是基于“数据包”的,而每个播放的语音都有一个待处理缓冲区队列,您可以通过向队列提交新缓冲区进行处理来添加更多数据。您可以在缓冲区完成时收到通知,以便知道“数据包”中的音频已被处理。
此外,在DirectSound中,您必须将音频数据复制到Lock
提供的内存中,但现代的基于“数据包”的API通过直接从应用程序内存中读取源数据来避免额外的副本。这确实增加了您需要确保源内存在所有播放停止之前保持可用的复杂性(即,当实时混音器仍在读取内存时您无法free
内存,或者您的应用程序将崩溃) ,但作为回报,你可以避免大量的额外复制。