我正在使用 Win32 SDK 中的PlaySound函数来播放 wave 声音文件。目前,我有以下代码行:
PlaySound
PlaySound(szFile,NULL,SND_FILENAME );
但现在我想知道,我怎么能检测到波形文件播放完毕的时间?我想在波浪停止播放时更改按钮的文本。
PlaySound 的功能非常有限。在我工作的产品中,我们在 DirectSound 之上构建了一个媒体播放库来克服这些限制。在它做的很多事情中,它涉及编写 WAV 文件解析器和线程代码以将 PCM 样本流维持到 DirectSound 缓冲区。不适合胆小的人。
你可以走这条路,但这里有一些简单的建议。
如果您知道正在播放的 WAV 文件的长度,可以使用 SND_ASYNC 标志调用 PlaySound。安排计时器在声音完成播放的估计时间内开火。如果您不知道 WAV 文件的长度,可以编写解析器来读取文件的标头。将“fmt”块中的采样率和格式与数据块中的字节数进行比较,以计算文件的时间长度。
或....创建一个专用线程来发出 PlaySound 调用(没有 SND_ASYNC 标志)。当同步 PlaySound 函数返回时,对 UI 线程执行 PostMessage 以更新按钮。如果你有重叠的 PlaySound 调用,你可能需要做一些 multi-threaded 同步,但这应该不难。
除非你指定SND_ASYNC标志,PlaySound 功能是同步,这意味着在你调用它之后,它不会将控制权返回给你的程序,直到它完成播放声音文件。
SND_ASYNC
因此,一旦函数返回一个值(如果成功则为TRUE,否则为FALSE),您知道声音已完成播放。
TRUE
FALSE
您可以在调用PlaySound函数后立即在下一行代码中更新按钮控件的文本。如果您想确保按钮立即更新以反映您的更改,您可能还需要调用UpdateWindow 函数。
2 回答
PlaySound 的功能非常有限。在我工作的产品中,我们在 DirectSound 之上构建了一个媒体播放库来克服这些限制。在它做的很多事情中,它涉及编写 WAV 文件解析器和线程代码以将 PCM 样本流维持到 DirectSound 缓冲区。不适合胆小的人。
你可以走这条路,但这里有一些简单的建议。
如果您知道正在播放的 WAV 文件的长度,可以使用 SND_ASYNC 标志调用 PlaySound。安排计时器在声音完成播放的估计时间内开火。如果您不知道 WAV 文件的长度,可以编写解析器来读取文件的标头。将“fmt”块中的采样率和格式与数据块中的字节数进行比较,以计算文件的时间长度。
或....创建一个专用线程来发出 PlaySound 调用(没有 SND_ASYNC 标志)。当同步 PlaySound 函数返回时,对 UI 线程执行 PostMessage 以更新按钮。如果你有重叠的 PlaySound 调用,你可能需要做一些 multi-threaded 同步,但这应该不难。
除非你指定
SND_ASYNC
标志,PlaySound 功能是同步,这意味着在你调用它之后,它不会将控制权返回给你的程序,直到它完成播放声音文件。因此,一旦函数返回一个值(如果成功则为
TRUE
,否则为FALSE
),您知道声音已完成播放。您可以在调用
PlaySound
函数后立即在下一行代码中更新按钮控件的文本。如果您想确保按钮立即更新以反映您的更改,您可能还需要调用UpdateWindow 函数。