我正在尝试编写一个程序来在C ++中播放一个小的.wav文件。我已按照DirectX SDK文档对其进行编程,以便在辅助静态缓冲区上编写和播放。它运行正常,除了在任何.wav文件的播放结束时,有一个非常明显的“点击”噪音。我确信这不是我的音频硬件的缺陷,因为我知道使用DirectSound的任何其他游戏都没有。
我已经尝试过每个周期轮询GetCurrentPosition并在它结束之前停止它但是不可靠。我无法在主缓冲区上播放它,因为在主缓冲区上播放的.wav必须循环播放,这是我不想要的。
有人知道解决这个问题吗?提前谢谢。
答案 0 :(得分:4)
我们需要查看有问题的WAV文件和将WAV文件加载到声音缓冲区的代码。但这是一些猜测。
我的第一个猜测是,如果我们要将WAV文件加载到视觉音频编辑器中,我们会看到声音突然结束,而不是逐渐变成沉默。这会导致几乎所有音频播放器都出现“砰砰”声。
我的第二个猜测是你在最后将垃圾数据复制到声音缓冲区。某些WAV文件在DATA块结尾之后的文件末尾有额外的元数据。不知道你是如何确定声音文件中的位置来复制样本的,但是很容易搞砸了。您是否使用十六进制编辑器(如Visual Studio)检查WAV文件以确认DATA块的长度是否与它声称的一样大?当您调试ReadFile调用以将数据从文件复制到缓冲区时,您是否检查了缓冲区的最后几个字节是否与您在十六进制编辑器中看到的相匹配?