13MCI和MMAPI编程.doc
《13MCI和MMAPI编程.doc》由会员分享,可在线阅读,更多相关《13MCI和MMAPI编程.doc(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 7 第13章 MCI和MMAPI编程第13章 MCI和MMAPI编程本章介绍Windows多媒体的两种传统编程接口高层的MCI和底层的MMAPI,主要讨论MCI的命令串和命令消息方式编程和MMAPI中的MMIO与MIDI编程。MCI和MMAPI都没有被封装入MFC,为Windows SDK中的API。在Visual Studio 2008的帮助系统中,MCI和MMAPI的帮助文档位于“目录 / Win32和COM开发 / Graphics and Multimedia / Windows Multimedia / SDK Documentation / Windows Multimedia”
2、的各子目录中。在Visual Studio 2010的帮助系统中,MCI和MMAPI的帮助文档位于“库主页 / Win32 and COM Development / Graphics and Multimedia / Audio and Video / Windows Multimedia”的各子目录中。在Visual Studio 2012的帮助系统中,MCI和MMAPI的帮助文档位于微软msdn网站的“MSDN Library / Windows Desktop App Development / Audio and Video / Legacy Audio and Video / Wi
3、ndows Multimedia”的MCI和Multimedia Reference等子目录中。13.1 MCI编程MCI(Media Control Interface,媒体控制接口)是Windows中控制多媒体设备的高层命令接口,用于事件协调及与MCI设备驱动程序的通信。MCI的主要特点是其设备独立性。通过设备驱动程序,MCI提供了与设备无关的虚拟接口。参见图13-1。MCI的核心是MCI的设备驱动程序,它用于解释和执行MCI的命令,可分成如下三类:MCI设备驱动程序MCI命令多媒体设备多媒体应用程序l 直接控制媒体设备硬件,如CD音乐、影碟机;l 通过低层MMAPI间接控制目标设备,如M
4、IDI、WAV;l 提供DLL高层接口,如AVI/MPEG影片播放器。13.1.1 MCI设备图13-1 MCI的设备独立性MCI设备可分为如下两种类型:l 简单设备不需要提供数据文件,如CD音乐、DVD机;l 复合设备需要提供数据文件,如MIDI音序器(.MID)、波形音频设备(.WAV)、影片播放器(.AVI/.MPG)。每类MCI设备都有对应的命令集,但也有若干同类MCI驱动程序共用同一命令集,为了区分不同的驱动程序,MCI引入设备名:(按字母序排列)l animation动画播放设备;l cdaudioCD音乐播放设备;l dat数字音频磁带机(DAT = Digital Audio
5、Tape数字录音带);l digitalvideo数字视频(不基于GUI);l mmmovie多媒体影片播放设备;l other未定义的MCI设备(扩展用);l overlay窗口中的模拟视频接口(基于GUI);l scanner图像扫描仪;l sequencerMIDI音序器;l vcr盒式磁带录像机(VCR = Video Cassette Recorder);l videodisc影碟机;l waveaudio波形音频设备。13.1.2 接口、函数与命令多媒体应用程序通过发送命令来控制多媒体设备,MCI有串和消息两种命令接口方式。这些命令接口,又由若干MCI函数来具体实现。1. 接口应用
6、程序通过向MCI设备发送命令来控制它,这种命令有两种功能等价的接口方式:l 命令串方式用近似英语的句法与MCI设备通信,直观、面向用户。是一种文本形式的接口,常用于VB等可视化编程平台和ToolBook等多媒体著作工具。如mciSendString(Lplay cdaudio from 2 to 5, NULL, 0, NULL);l 命令消息方式利用消息和数据结构与MCI设备通信,快速、面向程序员。常用于C/C+语言的应用程序,以直接控制多媒体设备。如:MCI_PLAY_PARMS playParms;playParms.dwFrom = MCI_MAKE_TMSF(2, 0, 0, 0);
7、playParms.dwTo = MCI_MAKE_TMSF(6, 0, 0, 0);mciSendCommand(wDevID, MCI_PLAY, MCI_FROM | MCI_TO, (DWORD)(LPVOID)&playParms); 2. 函数MCI函数中,有些只适用于一种接口方式,有些则两种接口都可以用。1)仅命令串方式只适用于命令串接口方式的只有如下一个函数:(命令串中的字符不区分大小写)l mciSendString(发送命令串),函数原型为:MCIERROR mciSendString( / 出错返回非零值(错误代码)/ 可用mciGetErrorString获得错误的文本
8、描述 LPCTSTR lpszCommand, / 指向以null结尾的命令字符串:“命令 设备 参数” LPTSTR lpszReturnString,/ 指向接收返回信息的缓冲区,为NULL时不返回信息 UINT cchReturn, / 上述缓冲区的大小 HANDLE hwndCallback / 在命令串中含notify时,它指定一个回调窗口的句柄/ 一般为NULL);如:mciSendString(Lopen sample.wav type waveaudio alias wave, NULL, 0, NULL);2)仅命令消息方式只适用于命令消息接口方式的也只有一个函数:l mci
9、SendCommand(发送命令),函数原型为:MCIERROR mciSendCommand( / 出错返回非零值(低字错误代码,高字驱动程序ID) / 也可用mciGetErrorString获得错误的文本描述 MCIDEVICEID IDDevice, / 接收命令消息的MCI设备ID/ 对MCI_OPEN消息为NULL UINT uMsg, / 命令消息 DWORD fdwCommand, / 命令消息的附加标志 DWORD dwParam / 命令消息参数的结构指针(可统一函数形式));如:MCI_OPEN_PARMS openParms;openParms.lpstrDeviceT
10、ype = 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 wDevID = openParms.wDeviceID;3)两种接口方式两种接口方式都支持的函数有五个:l mciGetErrorString(获得出错文本串)BOOL mciGet
11、ErrorString( / 成功返回TRUE DWORD fdwError, / 由mciSendString或mciSendCommand返回的错误代码 LPTSTR lpszErrorText, / 指向接收返回错误信息的文本缓冲区 UINT cchErrorText / 上述缓冲区的长度 );如:MCIERROR err = mciSendString(Lopen sample.wav type waveaudio alias wave, NULL, 0, NULL);if (err) wchar_t errStr256;if (mciGetErrorString(err, errSt
12、r, 256) MessageBox(errStr, LError); l mciGetDeviceID(获得设备ID),函数原型为:MCIDEVICEID mciGetDeviceID( / 出错返回非零 LPCTSTR lpszDevice / 已经打开的设备别名);如:wDevID = mciGetDeviceID(Lwaveaudio); 或 wDevID = mciGetDeviceID(Lwave);MCI中还有3个少用的回调过程函数:mciSetYieldProc(设置等待时调用的过程)、mciGetYieldProc(获得等待时调用的过程)和mciGetCreatorTask(
13、获取创建任务)。以上7个MCI函数中,最常用的是mciSendString、mciSendCommand和mciGetErrorString这三个。3. 命令MCI的命令很多,可以分为如下四类:n 系统命令直接由MCI系统解释和处理,不传送到MCI设备。如break或MCI_BREAKn 通用命令所有MCI设备都支持的命令。如open或MCI_OPENn 可选命令MCI设备可选择使用的命令。如play或MCI_PLAYn 专用命令为某类MCI设备集专有。如list或MCI_LIST(DV/VCR)前三类中部分命令参见表13-1:表13-1 部分MCI命令(字母序)类型消息串说明系统MCI_BR
14、EAKbreak为指定MCI设备设置终止键MCI_SOUNDsound播放Windows指定的系统声音MCI_SYSINFOsysinfo返回有关MCI设备的信息通用MCI_CLOSEclose关闭MCI设备MCI_GETDEVCAPSgetdevcaps获得MCI设备的性能参数MCI_INFOinfo获得MCI设备的有关信息MCI_OPENopen打开(初始化)MCI设备MCI_STATUSstatus返回MCI设备的状态信息可选MCI_LOADload从文件中加载数据MCI_PAUSEpause暂停播放/记录MCI_PLAYplay开始播放数据MCI_RECORDrecord开始记录数据M
15、CI_RESUMEresume重新开始播放/记录MCI_SAVEsave保存数据到文件MCI_SEEKseek改变当前位置MCI_SETset改变控制设置MCI_STOPstop停止播放/记录标志MCI_WAITwaitMCI命令执行完后才返回MCI_NOTIFYnotifyMCI命令执行完后向应用程序发送MM_MCINOTIFY消息4. 附加标志与参数结构复杂的命令消息一般都有附加标志,并需要设置相应数据结构。如打开命令MCI_OPEN消息的附加标志见表13-2(可以位或“|”)。其中,结构MCI_OPEN_PARMS的定义为:表13-2 打开命令的部分附加标志typedef struct
16、标志含义(在MCI_OPEN_PARMS结构中)MCI_OPEN_ALIASlpstrAlias域指定了别名MCI_OPEN_ELEMENTlpstrElementName域指定了元素(文件)名MCI_OPEN_SHAREABLE按共享方式打开MCI设备MCI_OPEN_TYPElpstrDeviceType域指定了设备类型MCI_OPEN_TYPE_IDwDeviceID域指定了设备类型的ID DWORD dwCallback; MCIDEVICEID wDeviceID; LPCSTR lpstrDeviceType; LPCSTR lpstrElementName; LPCSTR lps
17、trAlias; MCI_OPEN_PARMS;13.1.3 编程下面以播放CD音乐、波形音频文件与MIDI为例,介绍简单与复杂MCI设备的多媒体命令串编程。为了使用MCI编程,必须包含多媒体头文件mmsystem.h,并在项目属性中添加对多媒体库winmm.lib链接。在VS05/08/10中的具体做法:选“项目/Midi属性”菜单项,打开项目的属性页窗口,先选“所有配置”,再选“配置属性/链接器/输入”项,在右边上部的“附加依赖项”栏的右边,键入winmm.lib后按“应用”钮,最后按“确定”钮关闭对话框。1. CDwchar_t buf256;MCIERROR err = mciSend
18、String(Lopen cdaudio alias cd, NULL, 0, NULL); / 打开CDif (err) / 获得并显示错误串后返回if (mciGetErrorString(err, buf, 256) MessageBox(buf, LError); return;mciSendString(Lstatus cd number of tracks, buf, 256, NULL); / 获得音轨总数m_nTracks = wcstol(buf, NULL, 10); / 这里使用了宽字符版的字符串到整数的/ 转换函数:long wcstol( const wchar_t
19、*nptr, wchar_t *endptr, int base );wsprintf(buf, Lplay cd from %d to %d, m, n); / m和n为表示起止音轨的整型变量mciSendString(buf, NULL, 0, NULL); / 从音轨m头播放到音轨n1尾其他常用命令:mciSendString(Lset cd time format tmsf, NULL,0,NULL); / 设置时间格式为/ 轨(100):分(100):秒(60):帧(strFilePath);MCIERROR err = mciSendString(buf, NULL, 0, NUL
20、L);if (err) if (mciGetErrorString(err, buf, 256) MessageBox(buf, L“Error”);return;/ t1和t2为用户指定的起止时间(单位为秒,浮点变量)DWORD start = (DWORD)(t1 * 1000 + 0.5), end = (DWORD)(t2 * 1000 + 0.5);wsprintf(buf, Lplay sound from %ld to %ld, start, end);mciSendString(buf, NULL, 0, NULL);其他常用命令有:mciSendString(Lstatus
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 13 MCI MMAPI 编程
限制150内