3

我正在尝试编写一个程序来在 C++ 中播放一个小的 .wav 文件。我已经按照 DirectX SDK 文档对其进行了编程,以在辅助静态缓冲区上进行写入和播放。它运行正常,只是在任何 .wav 文件的播放结束时,都会出现非常明显的“咔哒”声。我确信这不是我的音频硬件方面的缺陷,因为我知道使用 DirectSound 的任何其他游戏都没有它。

我试过在每个周期都为它轮询 GetCurrentPosition 并在它结束之前停止它,但不可靠。我不能在主缓冲区上播放它,因为在主缓冲区上播放的 .wav 必须循环播放,这是我不想要的。

有人知道解决这个问题的方法吗?提前致谢。

4

1 回答 1

4

我们需要查看有问题的 WAV 文件和将 WAV 文件加载到声音缓冲区的代码。但这里有一些猜测。

我的第一个猜测是,如果我们将您拥有的 WAV 文件加载到可视音频编辑器中,我们会看到声音突然结束,而不是逐渐变细。这将导致几乎所有音频播放器都发出突然的“爆裂”噪音。

我的第二个猜测是您最后将垃圾数据复制到声音缓冲区中。一些 WAV 文件在 DATA 块末尾之后的文件末尾有额外的元数据。不确定您如何确定声音文件中从中复制样本的位置,但很容易搞砸。您是否使用十六进制编辑器(如 Visual Studio)检查了 WAV 文件以确认 DATA 块的长度与其声称的一样大?当您调试 ReadFile 调用以将数据从文件复制到缓冲区时,您检查缓冲区的最后几个字节是否与您在十六进制编辑器中看到的匹配?

于 2010-06-28T06:46:03.207 回答