【问题标题】:How do I detect when the sound has finished playing when using PlaySound in Win32 SDK?在 Win32 SDK 中使用 PlaySound 时,如何检测声音何时播放完毕?
【发布时间】:2011-05-09 07:53:55
【问题描述】:

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

PlaySound(szFile,NULL,SND_FILENAME );

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

【问题讨论】:

    标签: c windows winapi playsound


    【解决方案1】:

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

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

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

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

    【讨论】:

    • @Cody。我不知道提问者的情况,但我假设如果他的声音足够长,他不想阻塞他的 UI 线程。否则,在播放声音时,他的 UI 将显示为冻结且无响应。他可以使用 SND_ASYNC,但无论如何他都不知道声音何时播放完毕。
    • 是的,这当然是合理的。我不认为声音文件很长,而且问题没有提供太多细节让我不这么认为。
    【解决方案2】:

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

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

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

    【讨论】:

    • 使用SND_ASYNC仍然无法得到波形文件的停止播放时间点。
    • @tunpishuang:是的。我说不要使用SND_ASYNC
    • 如果使用SND_SYNC并且wave文件很长,用户必须等到播放结束,但不能中断播放,因为windows消息循环不会运行并等待播放结束。这对程序也不利。
    • @tunpishuang:你的问题中应该有这样的信息。如果您想播放 long 声音文件,我认为这值得特别提及。不要强迫我们猜测细节。
    • 很抱歉,由于英语不好,我无法很好地解释我的问题。无论如何,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2011-04-25
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    相关资源
    最近更新 更多