使用mciSendCommand循环播放音乐

来源:互联网 发布:淘宝全球购举报 编辑:程序博客网 时间:2024/05/07 12:59

       方法一:最简单的方法

使用重复播放参数:MCI_DGV_PLAY_REPEAT

mciSendCommand(m_nDeviceID, MCI_PLAY,MCI_DGV_PLAY_REPEAT, (DWORD)&mciPlay))

需要头文件:

#include <Digitalv.h>#include <MMSystem.h>#pragma comment(lib , "winmm.lib")。。。。。。
 MCIDEVICEID m_nDeviceID;。。。。。。
void CMyDlg::OpenMciDeveci(void){    DWORD dwResult = 0;    MCI_OPEN_PARMS mciOpenParms;    mciOpenParms.lpstrDeviceType = _T("sequencer");    mciOpenParms.lpstrElementName = _T(SOUND_BACK);    dwResult = mciSendCommand(NULL,         MCI_OPEN,        MCI_OPEN_ELEMENT,        (DWORD)&mciOpenParms);       //save device identifier,will use eith other MCI commands    m_nDeviceID = mciOpenParms.wDeviceID;    if (dwResult != 0)    {       MessageBox(L"加载背景音乐失败!");    }}void CMyDlg::PlayBackMusic(void){    MCI_PLAY_PARMS mciPlay;    if(mciSendCommand(m_nDeviceID, MCI_PLAY, MCI_DGV_PLAY_REPEAT, (DWORD)&mciPlay))    {        MessageBox(L"播放背景音乐失败!");    }}

        方法二:通过响应MM_MCINOTIFY消息来重复播放声音。详情参考这里:http://www.vckbase.com/document/viewdoc/?id=633
        我把他的代码改装了下。利用MCI_SEEK命令将播放位置重置到开头,然后再调用MCI_PLAY命令,即可从头开始播放。这样就省去了打开关闭文件时带来的额外开销。
///MCIPlayMusic.h /** * @file MCIPlayMusic.h * @author 游蓝海* @mail you_lan_hai@foxmail.com* @data 2011-11-30* 说明:* 改装自如《何播放大型 WAV 文件?》 * 原作者:hermess* http://www.vckbase.com/document/viewdoc/?id=633*/#pragma once#include <MMSystem.h>/**播放音乐类*/class cMciPlayMusic{public:    ///构造函数    cMciPlayMusic();    virtual ~cMciPlayMusic();public:    DWORD openDevice();    DWORD closeDevice();    DWORD play(CWnd *pParentWnd,LPCTSTR pFileName);    DWORD stop();    DWORD seekToStart();    LPCTSTR getErrorMsg(DWORD dwError);        MCIDEVICEID getDeviceID(void){ return m_nDeviceID; }    MCIDEVICEID getElementID(void){ return m_nElementID; }protected:    MCIDEVICEID m_nDeviceID;    MCIDEVICEID m_nElementID;};

#include <stdafx.h>#include "MCIPlayMusic.h"cMciPlayMusic::cMciPlayMusic(){    m_nDeviceID=0;    m_nElementID=0;}cMciPlayMusic::~cMciPlayMusic(){    if(m_nElementID != 0)    {        stop();    }    if(m_nDeviceID != 0)    {        closeDevice();    }}DWORD cMciPlayMusic::openDevice(){    DWORD dwResult=0;    if (m_nDeviceID == 0)    {        MCI_OPEN_PARMS mciOpenParms;        ZeroMemory(&mciOpenParms, sizeof(mciOpenParms));        //mciOpenParms.lpstrDeviceType = (LPCTSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;        mciOpenParms.lpstrDeviceType = (LPCTSTR)MCI_DEVTYPE_SEQUENCER;                //open the wave device        dwResult = mciSendCommand(NULL,            MCI_OPEN,            MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_WAIT,            (DWORD)(LPVOID)&mciOpenParms);        //save device identifier,will use eith other MCI commands        m_nDeviceID = mciOpenParms.wDeviceID;    }    //return result of MCI operation    return dwResult;}DWORD cMciPlayMusic::closeDevice(){    DWORD dwResult=0;    //close if currently open    if(m_nDeviceID)    {        //close the MCI device        dwResult=mciSendCommand(m_nDeviceID,MCI_CLOSE,NULL,NULL);        //display error message if failed        if(!dwResult)        {            m_nDeviceID=0;        }    }    //return result of MCI operation    return dwResult;}DWORD cMciPlayMusic::play(CWnd* pWnd,LPCTSTR pFileName){    if (m_nElementID == 0)    {        MCI_OPEN_PARMS mciOpenParms;        //initialize structure        memset(&mciOpenParms,0,sizeof(MCI_OPEN_PARMS));        //set the WAV file name to be played        mciOpenParms.lpstrElementName = pFileName;        //first open the device        DWORD dwResult = mciSendCommand(m_nDeviceID,MCI_OPEN,            MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);        if (dwResult != 0)        {            return dwResult;        }        else        {            //save element indentifier            m_nElementID = mciOpenParms.wDeviceID;        }    }    MCI_PLAY_PARMS mciPlayParms;    //set the window that will receive notification message    mciPlayParms.dwCallback = (DWORD)pWnd->m_hWnd;    //instruct device to play file    DWORD dwResult=mciSendCommand(m_nElementID,MCI_PLAY,        MCI_NOTIFY,(DWORD)(LPVOID)&mciPlayParms);    //display error and close element if failed    if(dwResult != 0)//失败    {        stop();    }    //return result of MCI operation    return dwResult;}DWORD cMciPlayMusic::stop(){    DWORD dwResult=0;    //close if element is currently open    if(m_nElementID != 0)    {        dwResult=mciSendCommand(m_nElementID,MCI_CLOSE,NULL,NULL);        //display error message if failed        if(dwResult == 0)        {            m_nElementID=0;        }    }    return dwResult;}DWORD cMciPlayMusic::seekToStart(){    DWORD dwResult=0;    //close if element is currently open    if(m_nElementID != 0)    {        MCI_SEEK_PARMS seekParam;        ZeroMemory(&seekParam, sizeof(seekParam));        dwResult=mciSendCommand(m_nElementID,            MCI_SEEK,            MCI_SEEK_TO_START,            (DWORD)&seekParam);    }    return dwResult;}LPCTSTR cMciPlayMusic::getErrorMsg(DWORD dwError){    //character string that contains error message    static TCHAR szErrorMsg[MAXERRORLENGTH];    //check if there was an error    if(dwError)    {        //retrieve string associated error message        if(!mciGetErrorString(dwError,szErrorMsg,sizeof(szErrorMsg)))        {            lstrcpy(szErrorMsg,_T("未知错误。"));        }    }    else    {        lstrcpy(szErrorMsg, _T("没有错误。"));    }    return szErrorMsg;}   

给窗口添加响应消息:ON_MESSAGE(MM_MCINOTIFY, &CMyDlg::OnMCINotify)
LRESULT CMyDlg::OnMCINotify(WPARAM wParam, LPARAM lParam){    if (wParam == MCI_NOTIFY_SUCCESSFUL )    {        PlayBackMusic();    }    return 0;}void CMyDlg::OpenMciDeveci(void){    DWORD dwResult = 0;    dwResult = m_mciMusic.openDevice();    if(0 != dwResult)    {        MessageBox(m_mciMusic.getErrorMsg(dwResult));    }}void CMyLLKDlg::PlayBackMusic(void){     m_mciMusic.seekToStart();    //m_mciMusic.stop();    DWORD dwResult = m_mciMusic.play(this, _T(“your_music.mp3”));    if (dwResult != 0)    {        MessageBox(m_mciMusic.getErrorMsg(dwResult));    }}





原创粉丝点击