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

时间:2011-05-09 07:53:55

标签: c windows winapi playsound

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

PlaySound(szFile,NULL,SND_FILENAME );

但是现在我想知道,我怎么能检测到波形文件播放完毕的时间?我想在波浪停止播放时更改按钮的文字。

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

除非您指定SND_ASYNC标记,PlaySound function同步,这意味着在您调用它之后,它不会将控制权返回给您的程序,直到之后它已经播放完声音文件。

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

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