在Win32 SDK中使用PlaySound时,如何检测声音何时播放完毕?

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

 PlaySound(szFile,NULL,SND_FILENAME ); 

但现在我想知道,如何才能检测到波形文件播放完毕的时间? 我想在wave停止播放时更改button的文本。

Solutions Collecting From Web of "在Win32 SDK中使用PlaySound时,如何检测声音何时播放完毕?"

PlaySound的功能非常有限。 在我工作的产品中,我们在DirectSound之上构建了一个媒体播放库,以克服这些限制。 在它所做的很多事情中,它涉及到编写一个WAV文件分析器和线程代码来维护一个PCM样本流到一个DirectSound缓冲区。 不是为了心灵的隐隐。

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

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

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

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

因此,一旦该函数返回一个值(如果成功则为TRUE ,否则为FALSE ),则知道声音已完成播放。

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