小弟按照网上MCI播放MP3的方法,写了一个函数,专门来播放MP3文件,如下:
MCI_OPEN_PARMS mciOpen;
MCI_PLAY_PARMS mciPlay;
UINT DeviceID;
void PlayMuzic(CString str)
{

    
//use mciSendCommand
mciOpen.lpstrDeviceType = "mpegvideo";
mciOpen.lpstrElementName = str.GetBuffer();
if (m_PlayTimer)
{
mciError=mciSendCommand(DeviceID,MCI_CLOSE,NULL,NULL);
} mciError = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,(DWORD)&mciOpen);
if(mciError)
{
char buf[128];
mciGetErrorString(mciError,buf,128);
// AfxMessageBox(buf);
return;
}
DeviceID = mciOpen.wDeviceID ;
mciError = mciSendCommand(DeviceID,MCI_PLAY,0 ,(DWORD)&mciPlay); if(mciError)
{
char buf[128];
mciGetErrorString(mciError,buf,128); 
// AfxMessageBox(buf);
return;
 
}

}由于程序中,经常需要播放很多声音,所以播放下一个声音的时候,我就把上一个播放声音的ID给关掉
mciSendCommand(DeviceID,MCI_CLOSE,NULL,NULL);
但是发现播放声音久了之后,其中的某一个声音又播放不出来了,关闭程序,重新运行也不行,电脑重启就好了,
我去抓mciError=mciSendCommand(DeviceID,MCI_CLOSE,NULL,NULL);的返回值,如果关闭失败就不播放声音,这样程序运行一段时间后,一个声音都播放不出来了,一定是出在了MCI_CLOSE失败,就不播放声音了,请教各位大侠,这是什么原因呢,这样循环的播放声音久了,就会关闭DeviceID 的时候失败吗

解决方案 »

  1.   

    可以使用PlaySound()函数播放mp3声音,该函数原型位于windows.h中,
    函数原型为:
    BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound);参数pszSound是指定了要播放声音的字符串,该参数可以是MP3文件的名字,或是MP3资源的名字,或是内存中声音数据的指针,或是在系统注册表WIN.INI中定义的系统事件声音。如果该参数为NULL则停止正在播放的声音。参数hmod是应用程序的实例句柄,当播放MP3资源时要用到该参数,否则它必须为NULL。参数fdwSound是标志的组合,各种可选的标志及意义如下所示。若成功则函数返回TRUE,否则返回FALSE。播放标志以及含义:SND_APPLICATION
    用应用程序指定的关联来播放声音。SND_ALIAS
    pszSound参数指定了注册表或WIN.INI中的系统事件的别名。SND_ALIAS_ID
    pszSound参数指定了预定义的声音标识符。SND_ASYNC
    用异步方式播放声音,PlaySound函数在开始播放后立即返回。SND_FILENAME
    pszSound参数指定了MP3文件名。SND_LOOP
    重复播放声音,必须与SND_ASYNC标志一块使用。SND_MEMORY
    播放载入到内存中的声音,此时pszSound是指向声音数据的指针。SND_NODEFAULT
    不播放缺省声音,若无此标志,则PlaySound在没找到声音时会播放缺省声音。SND_NOSTOP
    PlaySound不打断原来的声音播出并立即返回FALSE。SND_NOWAIT
    如果驱动程序正忙则函数就不播放声音并立即返回。SND_PURGE
    停止所有与调用任务有关的声音。若参数pszSound为NULL,就停止所有的声音,否则,停止pszSound指定的声音。SND_RESOURCE
    pszSound参数是WAVE资源的标识符,这时要用到hmod参数。SND_SYNC
    同步播放声音,在播放完后PlaySound函数才返回。************************************************************例如我想播放在C:\WINDOWS\Media目录中的 Windows XP 启动.MP3文件
    程序如下:#include <windows.h>
    #include <stdlib.h>
    int main(int argc, char* argv[])
    {
    PlaySound("C:\\WINDOWS\\Media\\Windows XP 启动.MP3", NULL, SND_FILENAME | SND_ASYNC);
    system("pause");
    return 0;
    }
      

  2.   

    给你个用mciSendCommand函数封装的类,头文件如下:
    http://download.csdn.net/source/2511288
    class CfyMCI
    {
    private:
    CfyMCI(const CfyMCI &);//禁止复制
    CfyMCI& operator=(const CfyMCI &);//禁止拷贝
    public:
        CfyMCI();
        ~CfyMCI();
        explicit CfyMCI(LPCTSTR szFileName);
        operator BOOL()const;//返回文件打开与否
        HWND GetCallBack()const;//可无视
        void SetCallBack(HWND hWnd);//可无视
    public:
        MCIERROR OpenFileA(LPCSTR);
        MCIERROR OpenFileW(LPCWSTR);
        MCIERROR OpenFile(LPCTSTR);
        MCIERROR PlayA(LPCSTR);
        MCIERROR PlayW(LPCWSTR);
        MCIERROR Play(LPCTSTR);
        MCIERROR Play(DWORD dwFrom=MCI_ERROR, DWORD dwTo=MCI_ERROR);//默认值是从当前位置到末尾
        MCIERROR Pause();
        MCIERROR Seek(DWORD dwTo);//毫秒为单位//Seek之后,播放会停止.
        MCIERROR Seek(DWORD dwHr,DWORD dwMn,DWORD dwSc,DWORD dwMl=0);//时分秒毫秒//Seek之后,播放会停止.
        MCIERROR Stop();
        MCIERROR Close();
        MCIERROR AddVolume(int dwVol);//dwVol为负表示减小音量
        MCIERROR SetVolume(DWORD dwVol);//0-1000
        DWORD    GetVolume()const;
        DWORD    GetPosition()const;//返回当前播放位置,毫秒数
        LPCTSTR  GetPositionStr()const;//返回当前播放位置,00:00的格式
        DWORD    GetLength()const;//返回文件长度,毫秒数
        LPCTSTR  GetLengthStr()const;//返回文件长度,00:00的格式
        LPCTSTR  GetFileName()const;//返回文件名
        DWORD    GetPlayStatus()const;//↓
        static   LPCTSTR GetErrorString(MCIERROR);
    private:
    //略..
    };
    /*
    DWORD GetPlayStatus();返回值如下:
    MCI_MODE_NOT_READY
    MCI_MODE_PAUSE
    MCI_MODE_PLAY
    MCI_MODE_STOP
    MCI_MODE_OPEN
    MCI_MODE_RECORD
    MCI_MODE_SEEK
    */
      

  3.   

    一楼的忽悠人呀,哪个函数只能播放WAV格式的。我只是想知道我错在哪了