2016-04-24 41 views
2

在IDirectSoundBuffer8的锁定方法中,我们假设要传递2个部分及其各自的大小。那些是什么?第一部分是开始,第二部分是锁的结束?他们必须处理主要和次要缓冲区?立体声声音?我完全迷失了。IDirectSoundBuffe锁定,为什么要传递2个部分?

有人可以帮忙吗?

+2

缓冲区可以是圆形的。所以缓冲区概念上可以环绕。当发生这种情况时,缓冲区不是连续的,必须由两个不相交的内存区域表示。 –

+0

现在有道理。当要锁定的大小大于缓冲区大小时,存储在其他部分。谢谢大卫。 –

+0

请注意,我对音频一无所知,只是从几个网络搜集中收集了这些信息。你应该深入自己。肯定有更多的微妙之处。但是网络搜索会让你走得很远。 –

回答

3

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

如果您一次只播放一个声音,并且不关心任何实时混音,您可以使用一些微不足道的东西,如PlaySound。我假设你实际上需要实时混音并能够播放多个重叠的声音。

对于Windows 8,Windows 8.1或Windows 10,您可以使用内置于操作系统中的XAudio 2.8或2.9。否则,您可以使用属于legacy DirectX SDK的XAudio 2.7。

请参阅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通过直接从应用程序内存中读取源数据来避免额外复制。这确实增加了你需要确保源存储器保持可用状态的复杂性,直到所有的播放停止为止(即当实时混音器仍然正在读取它时,或者你的应用程序将会崩溃时,你不能使用存储器),但是作为回报你避免了很多额外的复制。

+0

感谢您提供的信息,但我认为您误解了这个问题。无论如何,感谢信息是非常有效和有用的。 –

+1

对不起,没有完成答案...现在我完成了。 –

+0

谢谢查克。这不是我称之为大屁股真棒的答案。呵呵非常感谢。顺便提一下,最近我一直很忙。 –

相关问题