第一部分:音频播放

来源:互联网 发布:替代 usleep windows 编辑:程序博客网 时间:2024/06/10 23:48
首先新建基于对话框的mfc项目,在CprojectnameDlg.cpp加入如下代码
<span style="font-size:18px;">#include<Mmsystem.h>#pragma   comment(lib, "winmm.lib")</span>

然后声明一个全局变量

<span style="font-size:18px;">MCI_OPEN_PARMS op;</span>

此后所有的操作都用到该变量

定义播放、获取音频长度、停止函数

<span style="font-size:18px;">void CMCIDlg::OnPlay() { // TODO: Add your control notification handler code here DWORD cdlen;//音频文件长度 op.dwCallback=NULL;  op.lpstrAlias=NULL;  op.lpstrDeviceType=_T("MPEGAudio");  //设备类型,大多数文件可以这样设置  op.lpstrElementName=_T("D:\\2.mp3"); //文件路径  op.wDeviceID=NULL;      //打开设备成功以后保存这个设备号备用  UINT rs;        //接受函数返回结果  //发送命令打开设备,成功返回0,否则返回错误号,第三个参数这里必须MCI_OPEN_ELEMENT   rs=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)&op); mciSendCommand(NULL,MCI_SET,MCI_SET_DOOR_OPEN,NULL); cdlen=getinfo(op.wDeviceID,MCI_STATUS_LENGTH);//获取音频文件长度 if(rs==0)        //设备打开成功就播放文件  {   MCI_PLAY_PARMS pp;   pp.dwCallback=NULL;   pp.dwFrom=0;      //开始播放的位置   mciSendCommand(op.wDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD)&pp);  //播放文件,如果第三个参数设为MCI_WAIT则程序窗口会被阻塞,为了避免这种情况可以设为MCI_NOTIFY  } Sleep(cdlen);//根据文件长度等待,与MCI_WAIT效果一样,cdlen参数可以控制播放时间 OnStop();        //关闭音频文件 }</span>
<span style="font-size:18px;"><pre name="code" class="cpp">DWORD CMCIDlg::getinfo(UINT wDeviceID,DWORD item){ MCI_STATUS_PARMS mcistatusparms; mcistatusparms.dwCallback=(DWORD)GetSafeHwnd(); mcistatusparms.dwItem=item; mcistatusparms.dwReturn=0; mciSendCommand(wDeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)&mcistatusparms); return mcistatusparms.dwReturn;}</span>
<span style="font-size:18px;">void CMCIDlg::OnStop() { // TODO: Add your control notification handler code here //在WM_CLOSE消息处理过程中发送MCI_CLOSE命令关闭设备 MCI_GENERIC_PARMS gp;  gp.dwCallback=NULL;  mciSendCommand(op.wDeviceID,MCI_CLOSE,MCI_WAIT,(DWORD)&gp);  }</span>

以上函数的定义取自作业文档推荐的博客!

为了简单实现播放音乐的功能,我在Dialog中定义一个button,在button相应的函数中调用上文的OnPlay函数。


在实现的时候同学们可能会发现,音乐播放时整个dialog处于不可操作的状态,经过调试我发现是因为在OnPlay()中我调用了Sleep()函数,导致系统睡眠,所以要解决这个问题,只需将OnPlay()中的OnSotp(),Sleep(cdlen)去掉即可,在需要的时候调用OnStop()函数。

经过修改基本上没有什么问题了,音频可以正常播放,如想要进一步了解,请浏览作业文档推荐的网站。

1 0