我想检测直接声音环境中的缓冲区欠载情况。
我使用两个声音缓冲区(主要和次要)。有时(当服务器提供数据时)我调用lock
接口的IDirectSoundBuffer
方法将数据发布到辅助声音缓冲区。如果来自服务器的数据没有时间来,则声音缓冲区将从缓冲区的开头重新开始播放(并重复播放直到我将新数据发送到缓冲区)。也许它是标志DSBPLAY_LOOPING
,但在我阅读(并对其进行测试)时,没有该标志就无法创建主缓冲区(Play
方法存在错误)。
我尝试获取播放状态,但是GetStatus
方法始终返回相同状态,即使没有新数据并且播放器重复旧数据也是如此。
那么,如何检测缓冲区欠载情况(当没有新数据要播放而所有旧数据都已播放时)?
谢谢。
答案 0 :(得分:0)
IDirectSoundBuffer8::GetCurrentPosition
实际上是确定它从何处播放的唯一方法,但是它也仅在报告DSBCAPS_TRUEPLAYPOSITION
的Windows Vista或更高版本的系统上可靠。
一些注意事项:
DirectSound是“传统”,这意味着它在很长一段时间内都没有被积极地研究,推广或测试。最新的示例已于2007年11月发布到现在已经报废的DirectX SDK中。x64本机应用程序不支持DirectSound 8之前的版本,并且Windows的Windows SDK中包含DirectSound 8头文件/库。 SDK7。ARM上的Windows,Windows Store应用程序或Universal Windows应用程序不支持它。 DirectSound的文档只能在旧版DirectX SDK中脱机找到,而不能在Microsoft Docs上找到-仍然在线的唯一DirectSound内容供驱动程序编写者使用。
DirectSound在现代版本的Windows上也被“模拟”,因此实际上没有任何“直接”的东西。主缓冲区实际上并没有直接连接到音频硬件,也没有用于混音,因此它只是另一个软件缓冲区,例如辅助缓冲区。它确实模仿了Windows 9x / ME中应用的主缓冲区的旧限制,但除此之外并没有做很多事情。
从Windows Vista开始,完全不再支持LOC_HARDWARE
缓冲区。 Windows Vista确实增加了对多通道LOC_SOFTWARE
缓冲区的支持,而Windows XP上仅支持LOC_HARDWARE
缓冲区。
从Windows Vista开始,DirectSound不支持效果(ID3L,EAX等)。
TL; DR :请勿在新应用程序中使用DirectSound。仍然仅支持旧软件和游戏。
那么,如果不是DirectSound,开发人员应该使用什么?
(1)如果可以以已知的数据速率和格式提供声音数据,则Windows Core Audio(WASAPI)是一个不错的选择。如果需要任何实时混音或源速率转换,则必须自己进行操作-或-您可以使用许多现有的第三方音频库之一来执行此操作,并将最终结果发送到WASAPI。参见Microsoft docs。
(2)如果要进行实时混合,源速率转换和基于软件的DSP效果,XAudio版本2是一个不错的选择。从Windows 8开始,它就包含在操作系统中,但是要支持Windows 7,您必须使用一些旧版发行版和SDK。参见Microoft docs和this blog。
WASPI和XAudio都使用“音频数据包”模型而不是循环缓冲区进行数据提交。只要数据包正在等待处理,就不会出现欠载情况。