• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開(kāi)發(fā)教程 > 詳細(xì)頁(yè)面

        大型WAV文件的播放

        大型WAV文件的播放

        更新時(shí)間:2019-05-30 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

        在多媒體軟件的設(shè)計(jì)中經(jīng)常要處理聲音文件,用Windows提供的API函數(shù)sndPlaySound可以實(shí)現(xiàn)小型WAV文件的播放。但是當(dāng)WAV文件大于可用內(nèi)存時(shí),sndPlaySound函數(shù)就不能進(jìn)行播放,那么如何利用MCI播放大型音頻文件呢?本文將介紹一種方法。

          Windows支持兩種RIFF(resource interchange file format,“資源交互文件格式”)音頻文件:MIDI的RMID文件和波形音頻文件格式WAV文件,本文將介紹如何用MCI命令播放大型WAV文件。

          用sndPlaySound播放音頻文件只需要一行代碼。比如實(shí)現(xiàn)異步播放的方法為sndPlaySound("c:\windows\ding.wav",SND_ASYNC);
          由此可以看到,sndPlaySound的使用是很簡(jiǎn)單的。但是用sndPlaySound播放音頻文件有一個(gè)限制,即整個(gè)音頻文件必須全部調(diào)入可用的物理內(nèi)存。因此應(yīng)用sndPlaySound播放的音頻文件相對(duì)較小,最大約100K。要播放大一些的音頻文件(在多媒體設(shè)計(jì)中是經(jīng)常要遇到的情況)需要使用MCI的功能。   本文創(chuàng)建了一個(gè)Cwave類(lèi),可以處理播放音頻的MCI命令,因?yàn)樵擃?lèi)能夠執(zhí)行很多的MCI命令和建立了數(shù)據(jù)結(jié)構(gòu),所以只需要簡(jiǎn)單的成員函數(shù)(如OpenDevice, CloseDevice, Play和Stop)。在CWave類(lèi)中抽象了特定的MCI命令和數(shù)據(jù)結(jié)構(gòu),只含幾個(gè)簡(jiǎn)單的成員函數(shù)OpenDevice, CloseDevice, Play和Stop。波形音頻設(shè)備是一個(gè)復(fù)合設(shè)備,如果打開(kāi)波形設(shè)備,然后打開(kāi)并關(guān)閉每個(gè)波形元素,最后關(guān)閉波形設(shè)備,這樣可以使得播放性能更好。調(diào)用Cwave::OpenDevice就可以打開(kāi)波形設(shè)備,OpenDevice將MCI_OPEN命令傳遞給mciSendCommand函數(shù),如果調(diào)用成功,就用數(shù)據(jù)結(jié)構(gòu)MCI_OPEN_PARMS的wDeviceID成員返回波形設(shè)備的標(biāo)識(shí)符,該標(biāo)識(shí)符保存在一個(gè)供以后使用的私有數(shù)據(jù)成員中。   一旦打開(kāi)了Cwace對(duì)象,通過(guò)Cwace::Play播放WAV文件就就緒了,WAV文件名和一個(gè)窗口指針被傳遞給Play方法以便將MCI通知消息發(fā)送到制定的窗口。   WAV文件的播放分為兩步。首先要通過(guò)分配一個(gè)MCI_OPEN_PARMS結(jié)構(gòu)并給所要播放的WAV文件設(shè)置lpstrElementName成員打開(kāi)WAV文件。將該結(jié)構(gòu)和MCI_OPEN傳遞給mciSendCommand,打開(kāi)WAV文件并用MCI_OPEN_PARMS結(jié)構(gòu)的wDeviceID成員返回元素標(biāo)識(shí)符。   第二步是命令波形音頻設(shè)備播放WAV文件。分配了MCI_PLAY_PARMS結(jié)構(gòu)并將dwCallback成員設(shè)置為窗口句柄。如果要同步播放音頻波形文件,就增加MCI_WAIT標(biāo)志并跳過(guò)窗口句柄。這樣做會(huì)使應(yīng)用程序在mciSendCommand函數(shù)返回之前等待WAV文件播放完畢。最可能的情況是異步播放大型WAV文件,可以象下面那樣指定MCI_NOTIFY標(biāo)志并設(shè)置dwCallback成員做到這一點(diǎn)。 MCI_PLAY_PARMS mciPlayParms; MciPlayParms.dwCallback=(DWORD)pWnd->m_hWnd; DwResult=mciSendCommand(m_nDevice,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&mciPlayParms);

          這樣就開(kāi)始了WAV文件的播放,并且在播放完畢后,MM_MCINOTIFY消息會(huì)發(fā)送到指定的窗口,一個(gè)WAV文件播放所發(fā)生的事件序列:(1)命令播放WAV文件并立即返回;(2)播放WAV文件;(3)完成后發(fā)送通知消息。 完成播放后關(guān)閉WAV文件元素是程序員的責(zé)任,簡(jiǎn)單的調(diào)用Cwave類(lèi)的Stop成員函數(shù)就可以了。Stop成員函數(shù)將WAV文件標(biāo)識(shí)符和MCI_CLOSE命令傳遞給mciSendCommand函數(shù),不必為該命令分配一個(gè)MCI結(jié)構(gòu),下述代碼關(guān)閉了WAV文件   mciSendCommand(m)nElement,MCI_CLOSE,NULL,NULL); 播放完所有的WAV文件后必須關(guān)閉波形音頻設(shè)備,Cwave類(lèi)的析構(gòu)函數(shù)調(diào)用Cwave::CloseDevice自動(dòng)完成。 將本文中介紹的CWave類(lèi)加入到自己的程序中,就可以方便的應(yīng)用它播放音頻文件了。   //建立Cwave類(lèi),放在Wave.h文件中

          class CWave:public CObject

        {

        //Construction public: CWave();

        virtual ~CWave(); //Operations

        public: DWORD OpenDevice();

        DWORD CloseDevice();

        DWORD Play(CWnd *pParentWnd,LPCSTR pFileName);

        DWORD Stop(); //Implementation protected:

        void DisplayErrorMsg(DWORD dwError); //Members protected: MCIDEVICEID m_nDeviceID;

        MCIDEVICEID m_nElementID;   

        };   

        //Cwave類(lèi)的實(shí)現(xiàn)代碼,Cwave.cpp  

        #include   

        #include "cwave.h"   

        CWave::CWave(){   

        m_nDeviceID=0;   

        m_nElementID=0;   

        }   

        CWave::~CWave()   

        {   

        if(m_nElementID)   

        Stop();   

        if(m_nDeviceID)    CloseDevice();   

        }   

        DWORD CWave::OpenDevice()   

        {   

        DWORD dwResult=0;   

        if (m_nDeviceID) MCI_OPEN_PARMS mciOpenParms;

        mciOpenParms.lpstrDeviceType=(LPSTR)MCI_DEVTYPE_WAVEFORM_AUDIO; //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; //display error message if failed if(dwResult)

        DisplayErrorMsg(dwResult);

        } //return result of MCI operation return dwResult;   }   

        DWORD CWave::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) DisplayErrorMsg(dwResult); //set identifier to close state else m_nDeviceID=0; } //return result of MCI operation return dwResult;   

        }   

        DWORD CWave::Play(CWnd* pWnd,LPCSTR pFileName)   

        {

        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); //display error message if failed if(dwResult)

        DisplayErrorMsg(dwResult); //if successful,instruct the device to play the WAV file 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

        dwResult=mciSendCommand(m_nElementID,MCI_PLAY, MCI_NOTIFY,(DWORD)(LPVOID)&mciPlayParms); //display error and close element if failed if(dwResult) { DisplayErrorMsg(dwResult); Stop(); }

        } //return result of MCI operation return dwResult;   }   

        DWORD CWave::Stop()   

        {   

        DWORD dwResult=0;    //close if element is currently open    if(m_nElementID)    {   

        dwResult=mciSendCommand(m_nElementID,MCI_CLOSE,NULL,NULL);    //display error message if failed   

        if(dwResult)    DisplayErrorMsg(dwResult);    //set identifier to closed state    else  

        m_nElementID=0;   

        return dwResult;   

        }   

        void CWave::DisplayErrorMsg(DWORD dwError)   

        {    //check if there was an error   

        if(dwError)   

        {    //character string that contains error message   

        char szErrorMsg[MAXERRORLENGTH];    //retrieve string associated error message   

        if(!mciGetErrorString(dwError,szErrorMsg,sizeof(szErrorMsg)))    strcpy(szErrorMsg,"Unknown Error");    //display error string in message box   

        AfxMessageBox(szErrorMsg);   

        }   

        }  

        溫馨提示:喜歡本站的話(huà),請(qǐng)收藏一下本站!

        本類(lèi)教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 久久亚洲AV成人无码国产| 亚洲国产成人乱码精品女人久久久不卡| a级亚洲片精品久久久久久久| 亚洲精品自偷自拍无码| 成人免费观看一区二区| 亚洲综合激情视频| 亚欧人成精品免费观看| 亚洲国产精品yw在线观看| 2021国内精品久久久久精免费| 色拍自拍亚洲综合图区| 久久精品国产免费观看三人同眠 | 精品亚洲一区二区三区在线观看| 暖暖免费中文在线日本| 国产精品亚洲不卡一区二区三区| 岛国岛国免费V片在线观看| 亚洲老妈激情一区二区三区| 国产精品免费无遮挡无码永久视频 | 久久精品无码专区免费青青| 亚洲狠狠狠一区二区三区| 51视频精品全部免费最新| 久久久国产亚洲精品| 国产精品无码一区二区三区免费| 免费一级全黄少妇性色生活片| 久久久久亚洲AV无码专区桃色| 久久er国产精品免费观看2| 亚洲成aⅴ人片在线观| 永久免费无码网站在线观看| 九九久久国产精品免费热6| 亚洲国产成人片在线观看| 黄色片在线免费观看| 国产精品亚洲综合天堂夜夜| 亚洲精品无码久久久久去q| 99久久国产热无码精品免费| 日韩亚洲综合精品国产| 久久亚洲国产成人亚| 成人黄页网站免费观看大全| 国产精品成人免费观看| 亚洲综合久久1区2区3区 | 国产成人亚洲精品狼色在线| 免费成人激情视频| 男女交性无遮挡免费视频|