方法一:最简单的方法
使用重复播放参数: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"播放背景音乐失败!"); } }
我把他的代码改装了下。利用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)); } }