★★★如何得知PlaySound播放完毕?★★★

seaskyfox 2004-11-10 05:34:44
注意,不能指定SND_SYNC
...全文
363 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wasltone 2004-12-25
  • 打赏
  • 举报
回复
先分析WAV文件的长度
chen18s 2004-12-24
  • 打赏
  • 举报
回复
一般的现成函数都会提供说明
最少,都有一个返回值。根据返回值确定函数执行状态比较常用
楼上有位给出了例子啊
dingfuhai 2004-12-24
  • 打赏
  • 举报
回复
不要用计时器反复检测,busyloop的方法很浪费CPU,你干脆自己定义一个消息,当Playsound函数返回时向主线程法一个消息就行了,主线程处理一下这个消息就可以了。
seaskyfox 2004-11-13
  • 打赏
  • 举报
回复
自己顶 ^_^
seaskyfox 2004-11-12
  • 打赏
  • 举报
回复
我这里已经有一个方案,不过需要用多线程

在主线程需要播放声音的地方创建分线程,在分线程中用PlaySound(),指定SND_SYNC方式,分线程等待返回不会影响主线程,返回后分线程自动关闭。

在主线程中设定一个秒计时器,反复检测分线程状态,如果检测到分线程已不存在,就表明声音已自动播放完毕;如果分线程仍在活动,就表明声音仍在播放。

我想知道,有没有更好更简单的方法?
seaskyfox 2004-11-12
  • 打赏
  • 举报
回复
抱歉,我问题表达不清楚,让你没有完全明白。

我说了“不能指定SND_SYNC”,本意是说必须指定SND_ASYNC,即播放声音的同时不能影响其它操作。你的方式实际相当于指定了SND_SYNC,即只有在播放完毕后PlaySound()才能返回值,你单步调试一下就知道了。

你可以参考一下Windows的声音方案设置中的媒体声音播放效果,我就是需要那种效果。
seaskyfox 2004-11-11
  • 打赏
  • 举报
回复
自己顶
I_Love_CPP 2004-11-11
  • 打赏
  • 举报
回复
你没有理解我的意思。
虽然你说的PlaySound()立即返回了,但下面的语句要等播放完毕了才执行
正是利用这点才能用这么简单的语句完成了任务。
造成你误解大概试我没有把注释的位置放对,应该:
//如果能够播放,只有播放完毕了才调用下面的程序。
if(bStartPlay)
{
AfxMessageBox("播放完毕");
}
else
.....

另外,我已经调试成功了。
你可以去试试。
seaskyfox 2004-11-11
  • 打赏
  • 举报
回复
to I_Love_CPP(我爱C++):

  在不指定SND_SYNC的情况下,PlaySound()是立即返回的,即使返回TRUE,也并不能代表当前已经播放完毕。
I_Love_CPP 2004-11-11
  • 打赏
  • 举报
回复
bool bStartPlay(false);
bStartPlay = PlaySound(...);
if(bStartPlay)
{//如果能够播放,只有播放完毕了才调用下面的程序。
AfxMessageBox("播放完毕");
}
else
{
AfxMessageBox("不能播放文件");
}
phoenix_fei 2004-11-10
  • 打赏
  • 举报
回复
每一首音乐的时间不一样,我估计不好测试

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧