1

我正在使用PlaySoundWin32 SDK 中的函数来播放波形声音文件。目前,我有以下代码行:

PlaySound(szFile,NULL,SND_FILENAME );

但是现在我想知道,如何检测波形文件播放完毕的时间?当波浪停止播放时,我想更改按钮的文本。

4

2 回答 2

6

PlaySound 的功能非常有限。在我从事的一个产品中,我们在 DirectSound 之上构建了一个媒体播放库来克服这些限制。在它所做的许多事情中,它涉及编写 WAV 文件解析器和线程代码以将 PCM 样本流维护到 DirectSound 缓冲区中。不适合胆小的人。

你可以走这条路,但这里有一些更简单的建议。

  1. 如果您知道正在播放的 WAV 文件的长度,则可以使用 SND_ASYNC 标志调用 PlaySound。安排一个计时器在声音应该完成播放的估计时间触发。如果您不知道 WAV 文件的长度,您可以编写一个解析器来读取文件的标题。将“fmt”块的采样率和格式与数据块中的字节数进行比较,以计算文件的时间长度。

  2. 或.... 创建一个专用线程来发出 PlaySound 调用(不带 SND_ASYNC 标志)。当同步 PlaySound 函数返回时,对 UI 线程执行 PostMessage 以更新按钮。如果您对 PlaySound 的调用重叠,您可能需要进行一些多线程同步,但这应该不难。

于 2011-05-09T08:21:29.207 回答
1

除非您指定SND_ASYNC标志,否则该PlaySound函数同步的,这意味着在您调用它之后,它不会将控制权返回给您的程序,直到完成播放声音文件之后。

因此,一旦函数返回一个值(TRUE成功或FALSE失败),您就知道声音已播放完毕。

您可以在调用PlaySound函数后立即在下一行代码中更新按钮控件的文本。如果您想确保按钮立即更新以反映您的更改,您可能还需要调用UpdateWindow函数

于 2011-05-09T08:01:35.247 回答