第12章多媒體開發(fā)與MCI與MMAPI編程_第1頁
第12章多媒體開發(fā)與MCI與MMAPI編程_第2頁
第12章多媒體開發(fā)與MCI與MMAPI編程_第3頁
第12章多媒體開發(fā)與MCI與MMAPI編程_第4頁
第12章多媒體開發(fā)與MCI與MMAPI編程_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、多媒體開發(fā)多媒體開發(fā)是多媒體技術的一個重要方面,也是計算機專業(yè)人員可充分發(fā)揮自己長處的地方。本篇主要介紹,在Windows環(huán)境下進行多媒體開發(fā)的,各種應用程序編程接口的使用方法。本篇首先介紹多媒體開發(fā)的一般概念,比較兩類媒體集成工具的優(yōu)劣;然后給出在Windows中播放波形音頻的三種方法與函數(shù);重點介紹傳統(tǒng)的Windows高/底層多媒體編程接口MCI和MMAPI,對后者主要介紹MIDI和MMIO編程。本篇的另一個重點內(nèi)容,是介紹微軟公司所推崇的(多媒體和計算機游戲的開發(fā)接口)DirectXSDK編程。先概述DirectX的發(fā)展歷史和版本演化、功能結構與組件模塊,重點介紹DirectX的主要組件

2、Direct3D和DirectSound的基本編程方法,并給出若干實例。本篇包含如下2章:第12章多媒體開發(fā)與MCI和MMAPI編程第13章DirectX編程入門第12章多媒體開發(fā)與MCI和MMAPI編程本章先概述多媒體開發(fā)的要素、過程和工具,接著給出播放波形音頻文件的三個高層函數(shù),然后討論MCI、MMIO與MIDI等多媒體編程接口,重點介紹MCI編程。多媒體開發(fā)概述多媒體的開發(fā)有人、環(huán)境和工具三個要素,其開發(fā)過程與人員有關,其開發(fā)工具分為素材準備和媒體集成兩大類,而其中的媒體集成工具又可分成編程和著作兩類。開發(fā)要素人一一開發(fā)者=設計人員+編程人員環(huán)境一一軟硬件=多媒體計算機(MPC等)+多媒

3、體操作系統(tǒng)(MOS)工具一一開發(fā)軟件=素材準備工具+媒體集成工具(編程/著作)開發(fā)過程與人員多媒體開發(fā)的過程與相關人員如圖12-1所示。圖12-1多媒體的開發(fā)過程與相關人員開發(fā)工具多媒體的開發(fā)工具可以分為素材準備和媒體集成兩大類,而其中的集成工具又可進一步分成編程和著作兩類。本書重點介紹集成工具中的編程類。1。素材準備工具常用軟件文字:Word、WordPerfect、WPS、Cool3D音頻:CoolEdit、AudioEditor、WaveFlow、Cakewalk圖形:Illustrator、CorelDraw、AutoCAD圖像:Photoshop、ACDSee動畫:Flash、GIF

4、Animator、3DS、Maya視頻:VideoStudio、Premiere、AfterEffects綜合:MediaStudio、Fireworks2。媒體集成工具多媒體的集成工具有兩類:著作與編程,前者針對普通用戶,后者則為計算機專業(yè)人員所使用。編程API高層MCI/DirectX底層MMIO/MMAPI/硬件驅動程序語言工具VisualC+C+BuilderVisualBasicDelphiJava接口類型MDK/SDK/DDKOLE/COM/ActiveXDLL著作分類基于圖標(流程圖)按對象/事件順序組織數(shù)據(jù),以流程圖為骨干,通用。如Authorware、IconAuthor基于

5、時間(時序)一一按時間順序組織數(shù)據(jù)/事件,用時線方式表達媒體元素之間的相互關系,特別適合于動畫。如Director、Action!基于頁(腳本/卡片)將媒體對象連接于頁(卡片/節(jié)點)上,以面向對象方式處理媒體元素,用屬性定義/腳本規(guī)范媒體元素,超文本功能強,特別適合于電子圖書、MCAI。如ToolBook、PowerPoint、HyperCard基于網(wǎng)頁(標記語言)Web網(wǎng)頁,基于HTML/XML、JavaScript/VBScript、ASP/JSP。如FrontPageDreamweaver要求編程環(huán)境一一能控制和編排多媒體數(shù)據(jù)超媒體一一提供超級鏈接功能流程控制易生成帶有條件和邏輯分支的復

6、雜流程結構可由用戶輸入產(chǎn)生跳轉可調(diào)整復雜事件的順序易產(chǎn)生和鏈接熱鍵/點/區(qū)多媒體數(shù)據(jù)I/O卡一支持各種文件格式動畫一一支持動畫的編輯與演播卡態(tài)鏈接外部程序一一OLE/ActiveX、數(shù)據(jù)交換、嵌入模塊化面向對象界面友好一一易學易用擴充性好一一支持各種擴展比較兩種媒體集成工具的優(yōu)缺點與適用范圍的比較見表12-1。表12-1多媒體集成工具的比較類型優(yōu)點缺點適用編程控制靈活,速度快難度大、工作量大、周期長、需專業(yè)程序員、設計人員與編程人員難溝通集成、量小、快速著作容易、工作量小、周期短、不需專業(yè)程序員速度慢,控制粗單獨、量大、固定方式播放波形音頻文件本節(jié)介紹Windows中只可用來播放音頻文件的幾種

7、高層函數(shù),包括只能播放系統(tǒng)聲音的MessageBeepWin16中就有的可以播放波形文件的老函數(shù)sndPlaySound以及Win32弓I進的功能強大的播放波形文件的新函數(shù)PlaySound而MCI中的聲音播放將在下節(jié)介紹。Windows音頻服務的層次關系參見圖12-2。圖12-2Windows音頻服務的層次關系MessageBeep函數(shù)原型為:BOOLMessageBeep(UINTuType/soundtype);該函數(shù)調(diào)用后馬上返回,若成功返回TRUE,否則返回FALSE。其中,參數(shù)uType為聲音類型,其可取值見表12-2:表12-2MessageBeep播放的聲音類型uType值聲音

8、0 xFFFFFFFF(-1)用計算機喇叭發(fā)出標準嘟聲MB_ICONASTERISK系統(tǒng)星號MBICONEXCLAMATION系統(tǒng)感嘆號MBICONHAND系統(tǒng)手MBICONQUESTION系統(tǒng)問號MBOK系統(tǒng)缺省這些系統(tǒng)事件的聲音,可用控制面板中聲音與音頻設備程序來設置和指定,保存在注冊表中。老版本的Windows將這些設置信息保存在win.ini文件的Sounds段中。如:SoundsSystemAsterisk=chord.wav,AsteriskSystemExclamation=chord.wav,ExclamationSystemHand=chord.wav,CriticalSto

9、pSystemQuestion=chord.wav,QuestionSystemDefault=ding.wav,DefaultBeepSystemStart=data.wav,WindowsStartSystemExit=c:windows/glass.wav,WindowsExit若系統(tǒng)沒有安裝音頻設備,則會使用計算機本身的小喇叭來發(fā)聲;否則,會調(diào)用聲卡來播放對應的波形文件??梢杂肧DK函數(shù)waveOutGetNumDevs來判斷系統(tǒng)是否安裝了音頻設備,其原型為:UINTwaveOutGetNumDevs(VOID);返回系統(tǒng)中安裝的音頻設備數(shù)如if(waveOutGetNumDevs()

10、=0)MessageBox(LNoaudiodevice!,LError);return;sndPlaySound函數(shù)原型為:BOOLsndPlaySound(LPCSTRlpszSound,UINTfuSound);其中,lpszSound可為注冊系統(tǒng)聲音的表項,也可為盤中的波形文件,為NULL則停止播放正在播放的任何聲音。fuSound為標志參數(shù)(無符號整數(shù)),可取值為表12-3中所列諸符號常量的或:表12-3sndPlaySound函數(shù)中的fuSound參數(shù)fuSound值對應數(shù)值含義SND_ASYNC0 x01異步播放,調(diào)用后立即返回(最常用)SNDLOOP0 x08循環(huán)播放,必須與S

11、ND_ASYNC標志同用SNDMEMORY0 x04lpszSound指向內(nèi)存中波形聲音映像(可以動態(tài)生產(chǎn)聲音)SNDNODEFAULT0 x02找不到指定聲音時,不播放缺省的聲音SNDNOSTOP0 x10如果有聲音正在播放,則不播放指定的聲音而直接返回SNDSYNC0 x00同步播放,直到聲音播完后調(diào)用才返回(缺省值)為了結束異步或循環(huán)播放,可以用lpszSound=NULL來調(diào)用sndPlaySound函數(shù)。如:sndPlaySound(LSystemAsterisk,SND_ASYNC);sndPlaySound(strWaveFile,SND_LOOP|SND_ASYNC);sndP

12、laySound(NULL,0);又如:voidCMTestDlg:OnSndplayPlay()charfilters=L波形音頻文件(*.wav)|*.wav|所有文件(*.*)|*.*|;CFileDialogfDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,filters);if(fDlg.DoModal()=IDOK)CStringstrWavFile=fDlg.GetPathName();UINTflags=0;if(IsDlgButtonChecked(IDC_SNDPLAY_ASYNC)flags|=SND_ASYNC;if(IsDlgButtonChe

13、cked(IDC_SNDPLAY_LOOP)flags|=SND_LOOP;if(IsDlgButtonChecked(IDC_SNDPLAY_NOSTOP)flags|=SND_NOSTOP;sndPlaySound(strWavFile,flags);voidCMTestDlg:OnSndplayStop()sndPlaySound(NULL,0);注意:對波形文件,系統(tǒng)先在當前目錄中查找,若沒有,再到標準的搜索路徑中去查找。若沒有找到指定的系統(tǒng)聲音或波形文件,則播放系統(tǒng)缺省聲音;若沒有定義系統(tǒng)缺省聲音,則不播放任何聲音并返回FALSE。另外,為了使包含sndPlaySoundPlaySo

14、und或MCI函數(shù)的程序能夠編譯通過,必須包含多媒體頭文件:#include并在項目屬性中添加對多媒體庫winmm.lib的鏈接。PlaySoundsndPlaySound是為了與Win16兼容而保留的老函數(shù),而PlaySound是Win32引進的新函數(shù),它的功能更強大,sndPlaySound只不過是它的子集。其函數(shù)原型為:BOOLPlaySound(LPCSTRpszSound,HMODULEhmod,DWORDfdwSound);其中參數(shù)pszSound含義與fdwSound的設置有關。若fdwSound標志設置為SND_ALIAS、SND_FILENAME或SND_RESOURCE,則

15、pszSound為系統(tǒng)事件的別名、文件名或資源ID若fdwSound標志沒有設置這些值,則先在注冊表或win.ini中尋找串為pszSound的聲音,若沒有,則視其為文件名若pszSound=NULL,則停止播放正在播放的任何聲音(同sndPlaySoun。若要停止非波形格式的聲音,必須設置fdwSound的標志SND_PURGEhmod若設置了fdwSound的標志SND_RESOURCE,貝Uhmod為包含pszSound所指定資源的可執(zhí)行文件的句柄若沒有設置fdwSound的標志SND_RESOURCE,貝Uhmod必須為NULLfdwSound似sndPlaySound的fuSound

16、為標志參數(shù),它除了可取fuSound可取的6個值外,還可以取表12-4中所列的值。表12-4PlaySound函數(shù)中的fdwSound參數(shù)的部分值fdwSound值對應數(shù)值含義SND_NOWAIT0 x002000若設備忙,則不等待(不播放聲音,立即返回)SND_ALIAS0 x010000pszSound為注冊項的別名SNDALIASID0 x110000別名是一個預定義的IDSND_FILENAME0 x020000pszSound為文件名SNDRESOURCE0 x040004pszSound為資源名或原子(atom)SNDPURGE0 x40清除任務的非靜止事件SNDAPPLICATI

17、ON0 x80使用應用程序指定關聯(lián)程序來播放聲音例如:PlaySound(Lc:soundssample.wav,NULL,SND_ASYNC);若定義了波形資源:IDR_SAMPLEWAVEressample.wav則可用下面的語句來播放:PlaySound(MAKEINTRESOURCE(IDR_SAMPLE),AfxGetInstanceHandle(),SND_RESOURCE);也可以用PlaySound來播放系統(tǒng)聲音,如PlaySound(LSystemHand,NULL,SND_ASYNC);MCI編程MCI(MediaControlInterface媒體控制接口)是Window

18、s中控制多媒體設備的高層命令接口,用于事件協(xié)調(diào)及與MCI設備驅動程序的通信。MCI的主要特點是其設備獨立性。通過設備驅動程序,MCI提供了與設備無關的虛擬接口。參見圖12-3。圖12-3MCI的設備獨立性MCI的核心是MCI的設備驅動程序,它用于解釋和執(zhí)行MCI的命令,可分成如下三類:直接控制媒體設備硬件,如CD音樂、影碟機間接控制目標設備,通過低層MMAPI間接控制,如MIDI、WAV提供DLL高層接口,如AVI/MPEG影片播放器MCI設備MCI設備可分為如下兩種類型:簡單設備一一不需要提供數(shù)據(jù)文件,如CD音樂、激光視盤機復合設備一一需要提供數(shù)據(jù)文件,如MIDI音序器(.MID)、波形音頻

19、設備(.WAV)、影片播放器(.AVI/.MPG)每類MCI設備都有對應的命令集,但也有若干同類MCI驅動程序共用同一命令集,為了區(qū)分不同的驅動程序,MCI引入設備名:(按字母序排列)animation動畫播放設備cdaudioCD音樂播放設備dat數(shù)字音頻磁帶機(DAT=DigitalAudioTape數(shù)字錄音帶)digitalvideo數(shù)字視頻(不基于GUI)mmmovie多媒體影片播放設備other簡一未定義的MCI設備(擴展用)overlay一一窗口中的*II擬視頻接口(基于GUI)scanner圖像掃描儀sequenceMIDI音序器vcr盒式磁帶錄像機(VCR=VideoCasse

20、tteRecorder)videodisc影碟機waveaudio波形音頻設備這些設備名所對應的設備驅動程序在Win32/64的注冊表或老版本W(wǎng)indows的win.ini中定義。如win.ini的mci段:mcicdaudio=mcicda.drvwaveaudio=mciwave.drvsequencer=mciseq.drvmmmovie=mcimmp.drv接口、函數(shù)與命令多媒體應用程序通過發(fā)送命令來控制多媒體設備,MCI有串和消息兩種命令接口方式。這些命令接口,又由若干MCI函數(shù)來具體實現(xiàn)。接口應用程序通過向MCI設備發(fā)送命令來控制它,這種命令有兩種接口方式:(功能等價)命令串方式用

21、近似英語的句法與MCI設備通信,直觀、面向用戶。是一種文本形式的接口,常用于VB等可視化編程平臺和ToolBook等多媒體著作工具。如mciExcute(Lplaycdaudiofrom2to5);命令消息方式利用消息和數(shù)據(jù)結構與MCI設備通信,快速、面向程序員。常用于C/C+語言的應用程序,以直接控制多媒體設備。如:MCI_PLAY_PARMSplayParms;playParms.dwFrom=MCI_MAKE_TMSF(2,0,0,0);playParms.dwTo=MCI_MAKE_TMSF(6,0,0,0);mciSendCommand(wDevID,MCI_PLAY,MCI_FRO

22、M|MCI_TO,(DWORD)(LPVOID)&playParms);函數(shù)MCI函數(shù)中,有些只適用于一種接口方式,有些則兩種接口都可以用。1)僅命令串方式只適用于命令串接口方式的有下列2個函數(shù):(命令串中不區(qū)分大小寫)mciSendString(發(fā)送命令串),函數(shù)原型為:MCIERRORmciSendString(/出錯返回非零值(錯誤代碼)/可用mciGetErrorString獲得錯誤的文本描述LPCTSTRlpszCommand,/指向以null結尾的命令字符串:”命令設備參數(shù)”LPTSTRlpszReturnString,/指向接收返回信息的緩沖區(qū),為NULL時不返回信息UINTcc

23、hReturn,/上述緩沖區(qū)的大小HANDLEhwndCallback/在命令串中含notify時,它指定一個回調(diào)窗口的句柄/一般為NULL);如:mciSendString(Lopensample.wavtypewaveaudioaliaswave,NULL,0,NULL);mciExcute(執(zhí)行)是mciSendString的簡化形式:BOOLmciExcute(LPCTSTRlpszCommand);/成功返回TRUE該函數(shù)只有Win16支持,Win32不支持,可自寫一函數(shù)實現(xiàn):BOOLmciExcute(LPCTSTRlpszCommand)if(mciSendString(lpsz

24、Command,NULL,0,NULL)returnFALSE;returnTRUE;如:mciExcute(Lopensample.wavtypewaveaudioaliaswave);2)僅命令消息方式只適用于命令消息接口方式的只有一個函數(shù):mciSendCommand(發(fā)送命令),函數(shù)原型為:MCIERRORmciSendCommand(/出錯返回非零值(低字錯誤代碼,高字驅動程序ID)/也可用mciGetErrorString獲得錯誤的文本描述MCIDEVICEID IDDevice,UINT uMsg,DWORD fdwCommand,DWORD dwParam/接收命令消息的MCI

25、設備ID/對MCI_OPEN消息為NULL/命令消息/命令消息的附加標志/命令消息參數(shù)的結構指針(可統(tǒng)一函數(shù)形式);如:MCI_OPEN_PARMSopenParms;openParms.lpstrDeviceType=Lwaveaudio;openParms.lpstrElementName=Lsample.wav;openParms.lpstrAlias=Lwave;mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT|MCI_OPEN_ALIAS,(DWORD)(LPVOID)&playParms);MCIDEVICEID

26、wDevID=openParms.wDeviceID;3)兩種接口方式兩種接口方式都支持的函數(shù)有五個:mciGetErrorString(獲得出錯文本串)BOOLmciGetErrorString(/成功返回TRUEDWORDfdwError,/由mciSendString或mciSendCommand返回的錯誤代碼LPTSTRlpszErrorText,/指向接收返回錯誤信息的文本緩沖區(qū)UINTcchErrorText/上述緩沖區(qū)的長度);如:MCIERRORerr=mciSendString(Lopensample.wavtypewaveaudioaliaswave,NULL,0,NULL

27、);if(err)wchar_terrStr256;if(mciGetErrorString(err,errStr,256)MessageBox(errStr,LError);mciGetDevicelD(獲得設備ID),函數(shù)原型為:MCIDEVICEIDmciGetDeviceID(/出錯返回非零LPCTSTRlpszDevice/已經(jīng)打開的設備別名);如:wDevID=mciGetDeviceID(Lwaveaudio);或wDevID=mciGetDeviceID(Lwave);mciSetYieldProc(設置等待時調(diào)用的過程)UINTmciSetYieldProc(/成功返回非零值

28、MCIDEVICEIDIDDevice,/指定設備IDYIELDPROCyp,/等待時調(diào)用的過程DWORDdwYieldData/傳送給過程的參數(shù));mciGetYieldProc(獲得等待時調(diào)用的過程)YIELDPROCmciGetYieldProc(/成功返回回調(diào)函數(shù),失敗返回NULLMCIDEVICEIDIDDevice,/被監(jiān)控的MCI設備的IDLPDWORDlpdwYieldData/指向傳送給過程的參數(shù)之緩沖區(qū),可為NULL);mciGetCreatorTask(獲取創(chuàng)建任務)HANDLEmciGetCreatorTask(/成功返回創(chuàng)建指定設備的任務句柄,失敗返回NULLMCID

29、EVICEIDIDDevice/已經(jīng)打開的設備ID);其中,后三個函數(shù)少用。命令MCI的命令很多,可以分為如下四類:系統(tǒng)命令直接由MCI系統(tǒng)解釋和處理,不傳送到MCI設備。如break或MCI_BREAK通用命令所有MCI設備都支持的命令。如open或MCI_OPEN可選命令MCI設備可選擇使用的命令。如play或MCI_PLAY專用命令通通為某類MCI設備集專有。如list或MCI_LIST(DV/VCR)前三類中部分命令參見表12-5:表12-5MCI的命令(字母序)類型消息串說明系統(tǒng)MCI_BREAKbreak為指定MCI設備設置終止鍵MCI_SOUNDsound播放Windows指定的

30、系統(tǒng)聲音MCI_SYSINFOsysinfo返回有關MCI設備的信息通用MCI_CLOSEclose關閉MCI設備MCI_GETDEVCAPSgetdevcaps獲得MCI設備的性能參數(shù)MCI_INFOinfo獲得MCI設備的有關信息MCI_OPENopen打開(初始化)MCI設備MCI_STATUSstatus返回MCI設備的狀態(tài)信息可選MCI_LOADload從文件中加載數(shù)據(jù)MCIPAUSEpause暫停播放/記錄MCI_PLAYplay開始播放數(shù)據(jù)MCIRECORDrecord開始記錄數(shù)據(jù)MCIRESUMEresume重新開始播放/記錄MCISAVEsave保存數(shù)據(jù)到文件MCISEEKs

31、eek改變當前位置MCISETset改變控制設置MCISTOPstop停止播放/記錄標志MCIWAITwaitMCI命令執(zhí)行完后才返回MCI_NOTIFYnotifyMCI命令執(zhí)行完后向應用程序發(fā)送MM_MCINOTIFY消息注:接收MM_MCINOTIFY消息的窗口句柄由mciSendString的最后一個輸入?yún)?shù)指定,或由mciSendCommand的最后一個輸入?yún)?shù)一一MCIDEVICEID結構的第一個域指定。附加標志與參數(shù)結構復雜的命令一般都有附加標志,并需要設置相應數(shù)據(jù)結構。如打開命令MCI_OPEN消息的附加標志見表12-6(可以位或|)。表12-6打開命令的部分附加標志標志含義(

32、在MCI_OPEN_PARMS結構的)MCIOPENALIASlpstrAlias域指定了別名MCIOPENELEMENTlpstrElementName域指定了元素(文件)名MCIOPENSHAREABLE按共享方式打開MCI設備MCIOPENTYPElpstrDeviceType域指定了設備類型MCI_OPEN_TYPE_IDwDevicelD域指定了設備類型的ID其中,結構MCI_OPEN_PARMS的定義為:typedefstructDWORDdwCallback;MCIDEVICEIDwDevicelD;LPCSTRIpstrDeviceType;LPCSTRIpstrElement

33、Name;LPCSTRlpstrAlias;MCI_OPEN_PARMS;12.3.3編程下面以播放CD音樂與波形音頻文件為例,介紹簡單與復雜MCI設備的多媒體編程。準備為了使用MCI編程,必須包含多媒體頭文件:#include并在項目屬性中添加對多媒體庫winmm.lib鏈接。命令串CDwchar_tbuf256;MCIERRORerr=mciSendString(Lopencdaudioaliascd,NULL,0,NULL);/打開CDif(err)if(mciGetErrorString(err,buf,256)MessageBox(buf,LError);/獲得并顯示錯誤串retur

34、n;mciSendString(Lstatuscdnumberoftracks,buf,256,NULL);/獲得音軌總數(shù)m_nTracks=wcstol(buf,NULL,10);/這里使用了寬字符版的字符串到整數(shù)的/轉換函數(shù):longwcstol(constwchar_t*nptr,wchar_t*endptr,intbase);wsprintf(buf,Lplaycdfrom%dto%d,m_nFrom,m_nTo);mciSendString(buf,NULL,0,NULL);/從音軌m_nFrom頭播放到音軌m_nTo-1尾其他常用命令:mciSendString(Lsetcdtim

35、eformattmsf,NULL,0,NULL);/設置時間格式為/軌(100):分(100):秒(60):幀(strFilePath);MCIERRORerr=mciSendString(buf,NULL,0,NULL);if(err)if(mciGetErrorString(err,buf,256)MessageBox(buf,L“Error”);return;/t1和t2為用戶指定的起止時間(單位為秒,浮點變量)DWORDstart=(DWORD)(t1*1000+0.5),end=(DWORD)(t2*1000+0.5);wsprintf(buf,Lplaysoundfrom%ldto

36、%ld,start,end);mciSendString(buf,NULL,0,NULL);其他常用命令:mciSendString(Lstatussoundlength,buf,256,NULL);mciSendString(Lpausesound,NULL,0,NULL);mciSendString(Lplaysound,NULL,0,NULL);/從當前位置播放到文件尾mciSendString(Lstopsound,NULL,0,NULL);mciSendString(Lclosesound,NULL,0,NULL);命令消息1)CD/打開CDwchar_tbuf256;MCI_OPE

37、N_PARMSopenParms;openParms.lpstrDeviceType=Lcdaudio;openParms.lpstrAlias=Lcd;MCIERRORerr=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ALIAS,(DWORD)(LPVOID)&playParms);if(err)if(mciGetErrorString(err,buf,256)MessageBox(buf,LError);return;MCIDEVICEIDwDevID=openParms.wDeviceID;/設置時間格式MCI_SET_PAR

38、MSsetParms;setParms.dwTimeFormat=MCI_FORMAT_TMSF;mciSendCommand(wDevID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&setParms);/播放CDMCI_PLAY_PARMSplayParms;playParms.dwFrom=MCI_MAKE_TMSF(m_nFrom,0,0,0);playParms.dwTo=MCI_MAKE_TMSF(m_nTo,0,0,0);mciSendCommand(wDevID,MCI_PLAY,MCI_FROM|MCI_TO,(DWORD)(LPV

39、OID)&playParms);其中,設置結構MCI_SET_PARMS的定義為:typedefstructDWORDdwCallback;DWORDdwTimeFormat;DWORDdwAudio;MCI_SET_PARMS;播放結構MCI_PLAY_PARMS的定義為:typedefstructDWORDdwCallback;DWORDdwFrom;DWORDdwTo;MCI_PLAY_PARMS;2)WAV/打開wchar_tbuf256;MCI_OPEN_PARMSopenParms;openParms.lpstrDeviceType=Lwaveaudio;openParms.lps

40、trElementName=Lsample.wav;openParms.lpstrAlias=Lwave;MCIERRORerr=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT|MCI_OPEN_ALIAS,(DWORD)(LPVOID)&playParms);if(err)if(mciGetErrorString(err,buf,256)MessageBox(buf,LError);return;MCIDEVICEIDwDevID=openParms.wDeviceID;mciSendCommand(wDevID,MCI

41、_PLAY,NULL,NULL);/播放MMAPI簡介MMAPI(MultiMediaAPI)是Windows的底層多媒體編程接口,包括波形音頻處理(45個函數(shù))、MIDI操作(41個函數(shù))、多媒體計時器管理(8個函數(shù))、操作桿控制(8個函數(shù))和多媒體文件I/O(19個函數(shù)),共121個函數(shù)、44條消息和14個數(shù)據(jù)結構。本節(jié)只是列出各類MMAPI函數(shù)的名稱,其中的MMIO和MIDI部分會在后面兩節(jié)中介紹,其他MMAPI的函數(shù)和功能可參見VisualC+的幫助系統(tǒng)。在VisualStudio2005的幫助系統(tǒng)中,MCI和MMAPI的幫助位于“目錄Win32和COM開發(fā)GraphicsandMul

42、timediaWindowsMultimediaSDKDocumentationWindowsMultimedia”的諸子目錄中。波形音頻處理MMAPI中含有45個波形音頻處理函數(shù)(5個aux*+2個*PlaySound+38個waveIn/Out*):auxGetDevCapswaveInCloseauxGetNumDevswaveInGetDevCapsauxGetVolumewaveInGetErrorTextauxOutMessagewaveInGetIDauxSetVolumewaveInGetNumDevsPlaySoundwaveInGetPositionsndPlaySound

43、waveInMessagewaveInAddBufferwaveInOpenwaveInPrepareHeaderwaveInProcwaveInResetwaveInStartwaveInStopwaveInUnprepareHeaderwaveOutBreakLoopwaveOutClosewaveOutGetDevCapswaveOutGetErrorTextwaveOutGetIDwaveOutGetNumDevswaveOutGetPitchwaveOutGetPlaybackRatewaveOutGetPosition12.4.2MIDIMMAPI中含有41個midiConnect

44、midiDisconnectmidiInAddBuffermidiInClosemidiInGetDevCapsmidiInGetErrorTextmidiInGetIDmidiInGetNumDevsmidiInMessagemidiInOpenmidiInPrepareHeadermidiInProcmidiInResetmidiInStart12.4.3計時器waveOutGetVolumewaveOutMessagewaveOutOpenwaveOutPausewaveOutPrepareHeaderwaveOutProcwaveOutResetMIDI函數(shù):midiInStopmid

45、iInUnprepareHeadermidiOutCacheDrumPatchesmidiOutCachePatchesmidiOutClosemidiOutGetDevCapsmidiOutGetErrorTextmidiOutGetIDmidiOutGetNumDevsmidiOutGetVolumemidiOutLongMsgmidiOutMessagemidiOutOpenmidiOutPrepareHeaderwaveOutRestartwaveOutSetPitchwaveOutSetPlaybackRatewaveOutSetVolumewaveOutUnprepareHeade

46、rwaveOutWriteMidiOutProcmidiOutResetmidiOutSetVolumemidiOutShortMsgmidiOutUnprepareHeadermidiStreamClosemidiStreamOpenmidiStreamOutmidiStreamPausemidiStreamPositionmidiStreamPropertymidiStreamRestartmidiStreamStopMMAPI中含有8個多媒體時間函數(shù):timeBeginPeriodtimeGetDevCapstimeEndPeriodtimeGetSystemTime12.4.4操作桿M

47、MAPI中含有8個操作桿(joystick)函數(shù):joyGetDevCapsjoyGetPosjoyGetNumDevsjoyGetPosExtimeGetTimetimeKillEventTimeProctimeSetEventjoyGetThresholdjoyReleaseCapturejoySetCapturejoySetThreshold12.4.5多媒體文件I/O這里只羅列MMIO定義的2個數(shù)據(jù)類型和2個結構,以及它所提供的18個函數(shù)和1個宏,還有7個專用消息。有關MMIO的詳細內(nèi)容,將在后面的12.6節(jié)中作部分介紹。數(shù)據(jù)類型FOURCC;/4字符代碼MMRESULT;/錯誤返回代

48、碼(0表示正確)結構:MMIOINFO;/I/O信息MMCKINFO;/塊信息函數(shù)或宏基本I/O(6個):mmioClose、mmioOpen、mmioRead、mmioRename、mmioSeek、mmioWrite緩沖I/O(5個):mmioAdvance、mmioFlush、mmioGetInfo、mmioSetBuffer、mmioSetInfoRIFFI/O(5個):mmioAscend、mmioCreateChunk、mmioDescend、mmioFOURCC(宏)、mmioStringToFOURCC定制I/O過程(3個):IOProc、mmioInstallIOProc、m

49、mioSendMessage其中,常用的用于讀取和播放波形/AVI文件的函數(shù)有:mmioOpen、mmioClose、mmioRead、mmioDescend、mmioAscend。消息MMIO的專用消息有(字母序):MMIOM_CLOSE、MMIOM_OPEN、MMIOM_READ、MMIOM_RENAME、MMIOM_SEEK、MMIOM_WRITE、MMIOM_WRITEFLUSH,這些消息都用于定制的I/O過程。MIDI編程本節(jié)先介紹使用MCI播放MIDI文件的方法,然后介紹MMAPI中的基本MIDI函數(shù),最后通過一個虛擬電子琴的實例來演示MIDI的功能。用MCI播放MIDI文件MID

50、I所對應的MCI設備名為sequencer(音序器),似12.3節(jié),也可以使用MCI的命令串方式:mciSendString(命令串,NULL,0,NULL);來打開MIDI設備和播放MIDI文件。打開MIDI設備的命令串常用格式為:openMIDI文件路徑alias別名typesequencer播放MIDI文件的命令串一般格式為:play別名from位置1to位置2位置的單位為毫秒。若無“from位置1”則從頭播放,若無“to位置2”則播放到文件尾。如“play別名”是從頭到尾播放。例如:CStringstr;str+=Lopen+ar.GetFile()-GetFilePath()+Lal

51、iasmiditypesequencer;wchar_tbuf256;MCIERRORerr=mciSendString(str,NULL,0,NULL);/打開MIDI文件if(err)if(mciGetErrorString(err,buf,256)MessageBox(NULL,buf,LError,MB_OK);/獲得并顯示錯誤串return;mciSendString(Lplaymidi,NULL,0,NULL);/播放MIDI文件其他常用的命令還有:暫停播放(pause別名)、恢復播放(resume別名)、停止播放(stop別名)、關閉設備(close別名)等。MMAPI中的基本M

52、IDI函數(shù)在12.4.2中已經(jīng)列出了MMAPI中含有的41個MIDI函數(shù)的名稱,下面將介紹其中常用的一些基本MIDI函數(shù)的功能、原型和參數(shù)。查詢MIDI設備可以利用midiOutGetNumDevs和midiOutGetDevCaps函數(shù)來查詢當前系統(tǒng)的MIDI設備和性能:UINTmidiOutGetNumDevs(VOID);/返回MIDI輸出設備的數(shù)目(非0表示支持MIDI)MMRESULTmidiOutGetDevCaps(/檢查MIDI輸出設備的性能UINT_PTRuDeviceID,/設備ID(0設備數(shù)-1)LPMIDIOUTCAPSIpMidiOutCaps,指向MIDI輸出設備的

53、性能結構的指針UINTcbMidiOutCaps/性能結構的大小(字節(jié)數(shù))力成功時返回MMSYSERR_NOERROR(=0)typedefstructMIDI輸出設備的性能結構WORDwMid;/廠商IDWORDwPid;產(chǎn)品IDMMVERSIONvDriverVersion;驅動程序版本號(高/低位字節(jié)分別為主/次版本號)CHARszPnameMAXPNAMELEN;產(chǎn)品名稱WORDwTechnology;/設備類型WORDwVoices;同時音色數(shù)WORDwNotes;復音數(shù)WORDwChannelMask;/通道數(shù)DWORDdwSupport;/支持的可選功能MIDIOUTCAPS;其

54、中,typedefUINTMMVERSION;,設備類型wTechnology的取值見表12-7:表12-7MIDI設備類型wTechnology數(shù)值設備類型MODMIDIPORT1MIDI硬件端口MODSYNTH2合成器MODSQSYNTH3方波合成器MODFMSYNTH4調(diào)頻合成器MODMAPPER5微軟MIDI映射器MODWAVETABLE6硬件波表合成器MODSWSYNTH7軟件合成器支持的可選功能dwSupport的取值可為表12-8中值的組合。表12-8支持的可選功能dwSupport數(shù)值功能MIDICAPSVOLUME1支持音量控制MIDICAPSLRVOLUME2支持分離的左右

55、音量控制MIDICAPSCACHE4支持首,色(patch)緩沖MIDICAPSSTREAM8提供對midiStreamOut函數(shù)的直接支持例如:(查詢并輸出MIDI設備的性能)UINTdn=midiOutGetNumDevs();if(dn=0)MessageBox(LNoMIDIdevice!,LError);else/dn0CStringstr;MIDIOUTCAPSmoc;for(UINTi=0;iTextOut(10,10+i*20,str);輸出結果如:,元標思_Bidj.J匕*交伴山稹庭審葩為m:口jEl上當震UlvNuihD,MinlrrlO】口匕Ver-DbllA.PNhii

56、ic-&SHLIvk!MIDIKynlh,IrchH.Vuhxu非.Nuh:英.ChHimlm骷4弱.Kuppurl:10i:vNum-1.MID-1,PIO1昭二B:LKrFUintRilhrTeth-SrVuktB32.網(wǎng)皿四二支.ChmirndmM用睨機叫什二3Drvtlu(n-2*MID-1PPID-ID?,Ver=OEOA.PNmh-SBUvt!SoflSynlltTech樂Wee*3ZdhtolEB-32Channelt-碼.3口tvNuE=lMID=LPID=ID?,VnrOSflft,PNmt工和1梅川umiU4nTPTcchLVdirmI),hlolrtI,ChnnnnH-S

57、uppE=nDcvNum-4MID=1H產(chǎn)ID=107.Vi?r=nSOKFNmh=HicntotlG0技能技件臺成器.Trh=7,Voice*=4BrM門=46rChnnnch=6553Support=?.哈而i例如,其中設備號為1的MIDI設備:制造商ID為1(創(chuàng)新公司)、產(chǎn)品ID為102、版本號為5.10、產(chǎn)品名為SBLive!MIDISynth、采用硬件波表合成器技術、可同時有32種音色和32個復音、有64K個通道、并支持對主音量和左右音量的控制。播放MIDI數(shù)據(jù)為了播放MIDI數(shù)據(jù),必須首先調(diào)用函數(shù)midiOutOpen打開指定序號的MIDI輸出設備,利用它所返回的設備句柄指針,再來

58、調(diào)用函數(shù)midiOutPrepareHeader來準備信息頭緩沖區(qū),然后才可以調(diào)用函數(shù)midiOutLongMsg來播放MIDI數(shù)據(jù)。在完成播放后,還必須調(diào)用函數(shù)midiOutUnprepareHeader來清除信息頭緩沖區(qū),最后調(diào)用函數(shù)midiOutClose來關閉MIDI輸出設備。在播放MIDI數(shù)據(jù)的過程中,還可以調(diào)用函數(shù)midiOutReset來停止播放。這里所用的MIDI數(shù)據(jù),可以是利用MMIO函數(shù)獲取的MIDI文件中的數(shù)據(jù),也可以是用戶自己動態(tài)創(chuàng)建的定制MIDI數(shù)據(jù)。下面是這些函數(shù)的原型和參數(shù)含義:MMRESULTmidiOutOpen(/打開MIDI輸出設備,成功返回MMSYSER

59、R_NOERRORLPHMIDIOUTlphmo,/設備句柄指針(用于返回值)UINT_PTRuDeviceID,/設備ID(一般取為MIDI_MAPPER=1)DWORD_PTRdwCallback,回調(diào)函數(shù)指針(一般取為NULL0)DWORD_PTRdwCallbackInstance,/回調(diào)函數(shù)使用的數(shù)據(jù)(一般取為NULL0)DWORDdwFlags/打開設備標志(用于回調(diào)函數(shù)參數(shù)的類型,(一般取為0));MMRESULTmidiOutPrepareHeader(/準備輸出MIDI音頻用的信息頭HMIDIOUThmo,/(由midiOutOpen獲得的)設備句柄指針LPMIDIHDRlp

60、MidiOutHdr,/指向頭結構的指針UINTcbMidiOutHdr/頭結構的大小);typedefstruct/MIDI信息頭結構LPSTRlpData;/指向MIDI數(shù)據(jù)緩沖區(qū)的指針DWORDdwBufferLength;/緩沖區(qū)的大小DWORDdwBytesRecorded;/錄音時緩沖區(qū)中數(shù)據(jù)的實際數(shù)量/必須wdwBufferLengthDWORD_PTRdwUser;/用戶定制的數(shù)據(jù)DWORDdwFlags;/關于緩沖區(qū)信息的標志structmidihdr_tagfar*lpNext;DWORD_PTRreserved;DWORDdwOffset;DWORD_PTRdwReser

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論