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

C 在Win32 SDK中使用PlaySound时,如何检测声音何时播放完毕?,c,windows,winapi,playsound,C,Windows,Winapi,Playsound,我正在使用Win32 SDK中的PlaySound函数来播放wave sound文件。目前,我有以下代码行: PlaySound(szFile,NULL,SND_FILENAME ); 但是现在我想知道,我怎样才能检测到wave文件完成播放的时间?我想在wave停止播放时更改按钮的文本。除非您指定SND_ASYNC标志,否则它是同步的,这意味着在您调用它之后,它不会将控制权返回到您的程序,直到它完成声音文件的播放 因此,一旦函数返回一个值(如果成功,则返回TRUE,否则返回FALSE),您就知

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

PlaySound(szFile,NULL,SND_FILENAME );

但是现在我想知道,我怎样才能检测到wave文件完成播放的时间?我想在wave停止播放时更改按钮的文本。

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

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


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

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

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


您只需在调用
PlaySound
函数后立即在下一行代码中更新按钮控件的文本即可。如果要确保按钮立即更新以反映您的更改,您可能还需要调用。PlaySound的功能非常有限。在我开发的一款产品中,我们在DirectSound之上构建了一个媒体播放库,以克服这些限制。在它所做的许多事情中,包括编写WAV文件解析器和线程代码,以将PCM样本流保存到DirectSound缓冲区中。不适合胆小的人

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

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

  • 或者。。。。创建一个专用线程,用于发出PlaySound调用(不带SND_ASYNC标志)。当synchronous PlaySound函数返回时,向UI线程发送PostMessage以更新按钮。如果对PlaySound有重叠调用,则可能需要进行一些多线程同步,但这并不难


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

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

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

  • 或者。。。。创建一个专用线程,用于发出PlaySound调用(不带SND_ASYNC标志)。当synchronous PlaySound函数返回时,向UI线程发送PostMessage以更新按钮。如果对PlaySound有重叠调用,则可能需要进行一些多线程同步,但这并不难


  • 使用
    SND\u ASYNC
    仍然无法获得wave文件的停止播放时间点。@tunpishuang:是的。我说过不要使用
    SND_ASYNC
    。如果使用
    SND_SYNC
    并且wave文件很长,用户必须等到播放结束,但不能中断播放,因为windows消息循环不会运行并等待播放结束。这对节目也不好。@tunpishuang:像这样的信息应该在你的问题中。如果你想播放一个长的声音文件,我认为这值得一提。不要强迫我们猜测细节。对不起,我不能很好地解释我的问题,因为我的英语很差。xD thx.using
    SND_ASYNC
    仍然无法获得wave文件的停止播放时间点。@tunpishang:是的。我说过不要使用
    SND_ASYNC
    。如果使用
    SND_SYNC
    并且wave文件很长,用户必须等到播放结束,但不能中断播放,因为windows消息循环不会运行并等待播放结束。这对节目也不好。@tunpishuang:像这样的信息应该在你的问题中。如果你想播放一个长的声音文件,我认为这值得一提。不要强迫我们猜测细节。对不起,我不能很好地解释我的问题,因为我的英语很差。反正是xD thx。@Cody。我不知道询问者的情况,但我认为如果他的声音足够长,他不想阻止他的UI线程。否则,当声音播放时,他的UI将显示为冻结和无响应。他可以使用SND_ASYNC,但他无论如何也不知道声音何时结束播放。是的,这当然是合理的。我没有认为声音文件很长,而且问题没有给出。