欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    13MCI和MMAPI编程.doc

    • 资源ID:79326530       资源大小:467KB        全文页数:26页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    13MCI和MMAPI编程.doc

    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”的各子目录中。在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 / Windows 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间接控制目标设备,如MIDI、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 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. 接口应用程序通过向MCI设备发送命令来控制它,这种命令有两种功能等价的接口方式:l 命令串方式用近似英语的句法与MCI设备通信,直观、面向用户。是一种文本形式的接口,常用于VB等可视化编程平台和ToolBook等多媒体著作工具。如mciSendString(L"play 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);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获得错误的文本描述 LPCTSTR lpszCommand, / 指向以null结尾的命令字符串:“命令 设备 参数” LPTSTR lpszReturnString,/ 指向接收返回信息的缓冲区,为NULL时不返回信息 UINT cchReturn, / 上述缓冲区的大小 HANDLE hwndCallback / 在命令串中含notify时,它指定一个回调窗口的句柄/ 一般为NULL);如:mciSendString(L"open sample.wav type waveaudio alias wave", NULL, 0, NULL);2)仅命令消息方式只适用于命令消息接口方式的也只有一个函数:l mciSendCommand(发送命令),函数原型为:MCIERROR mciSendCommand( / 出错返回非零值(低字错误代码,高字驱动程序ID) / 也可用mciGetErrorString获得错误的文本描述 MCIDEVICEID IDDevice, / 接收命令消息的MCI设备ID/ 对MCI_OPEN消息为NULL UINT uMsg, / 命令消息 DWORD fdwCommand, / 命令消息的附加标志 DWORD dwParam / 命令消息参数的结构指针(可统一函数形式));如:MCI_OPEN_PARMS openParms;openParms.lpstrDeviceType = L"waveaudio"openParms.lpstrElementName = L"sample.wav"openParms.lpstrAlias = L"wave"mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT | MCI_OPEN_ALIAS, (DWORD)(LPVOID)&playParms);MCIDEVICEID wDevID = openParms.wDeviceID;3)两种接口方式两种接口方式都支持的函数有五个:l mciGetErrorString(获得出错文本串)BOOL mciGetErrorString( / 成功返回TRUE DWORD fdwError, / 由mciSendString或mciSendCommand返回的错误代码 LPTSTR lpszErrorText, / 指向接收返回错误信息的文本缓冲区 UINT cchErrorText / 上述缓冲区的长度 );如:MCIERROR err = mciSendString(L"open sample.wav type waveaudio alias wave", NULL, 0, NULL);if (err) wchar_t errStr256;if (mciGetErrorString(err, errStr, 256) MessageBox(errStr, L"Error"); l mciGetDeviceID(获得设备ID),函数原型为:MCIDEVICEID mciGetDeviceID( / 出错返回非零 LPCTSTR lpszDevice / 已经打开的设备别名);如:wDevID = mciGetDeviceID(L"waveaudio"); 或 wDevID = mciGetDeviceID(L"wave");MCI中还有3个少用的回调过程函数:mciSetYieldProc(设置等待时调用的过程)、mciGetYieldProc(获得等待时调用的过程)和mciGetCreatorTask(获取创建任务)。以上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_BREAKbreak为指定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开始记录数据MCI_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 标志含义(在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 lpstrAlias; 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 = mciSendString(L"open cdaudio alias cd", NULL, 0, NULL); / 打开CDif (err) / 获得并显示错误串后返回if (mciGetErrorString(err, buf, 256) MessageBox(buf, L"Error"); return;mciSendString(L"status cd number of tracks", buf, 256, NULL); / 获得音轨总数m_nTracks = wcstol(buf, NULL, 10); / 这里使用了宽字符版的字符串到整数的/ 转换函数:long wcstol( const wchar_t *nptr, wchar_t *endptr, int base );wsprintf(buf, L"play cd from %d to %d", m, n); / m和n为表示起止音轨的整型变量mciSendString(buf, NULL, 0, NULL); / 从音轨m头播放到音轨n1尾其他常用命令:mciSendString(L"set cd time format tmsf", NULL,0,NULL); / 设置时间格式为/ 轨(<100):分(<100):秒(<60):帧(<75),一秒=75块,一块=98帧mciSendString(L"set cd door open", NULL, 0, NULL); / 打开光驱mciSendString(L"set cd door closed", NULL, 0, NULL); / 关闭光驱mciSendString(L"pause cd", NULL, 0, NULL); / 暂停播放mciSendString(L"resume cd", NULL, 0, NULL); / 恢复播放mciSendString(L"stop cd", NULL, 0, NULL); / 停止播放mciSendString(L"close cd", NULL, 0, NULL); / 关闭CD设备mciSendString(L"status cd length", buf, 256, NULL); / 获得整个CD的音轨总长度mciSendString(L"status cd length track 5", buf, 256, NULL); / 获得第5个音轨的长度mciSendString(L"status cd current track", buf, 256, NULL); / 获得当前音轨号注意,"play cd from m to n"是完整形式,它还有其他形式:"play cd from m"从m播放到盘尾"play cd to n"从当前位置播放到指定音轨"play cd"从当前位置播放到盘尾例如播放最后一首歌:"play cd from m_nLast"2. WAVwchar_t buf256;/ 下面字符串中的转移字符对“"”可用于界定带空格的文件路径,以免MCI系统/ 将空格后的部分路径名,误判成错误的命令参数wsprintf(buf, L"open "%s" alias sound type waveaudio", pDoc->strFilePath);MCIERROR err = mciSendString(buf, NULL, 0, NULL);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, L"play sound from %ld to %ld", start, end);mciSendString(buf, NULL, 0, NULL);其他常用命令有:mciSendString(L"status sound length", buf, 256, NULL); / 获取声音长度mciSendString(L"pause sound", NULL, 0, NULL); / 暂停声音播放mciSendString(L"resume sound", NULL, 0, NULL); / 恢复声音播放mciSendString(L"play sound", NULL, 0, NULL); / 从当前位置播放到文件尾mciSendString(L"stop sound", NULL, 0, NULL); / 停止声音播放mciSendString(L"close sound", NULL, 0, NULL); / 关闭波形音频设备3. MIDIMIDI所对应的MCI设备名为sequencer(音序器),打开MIDI设备的命令串常用格式为:L"open MIDI文件路径 alias 别名 type sequencer";播放MIDI文件的命令串一般格式为:L"play 别名 from 位置1 to 位置2",其中位置的单位为毫秒。若无“from 位置1”则从头播放,若无“to 位置2”则播放到文件尾。如“play 别名”是从头到尾播放。例如:CString str = L"open "" + ar.GetFile()->GetFilePath() + L""type sequencer alias midi"wchar_t buf256;MCIERROR err = mciSendString(str, NULL, 0, NULL); / 打开MIDI文件和设备if (err) / 获得并显示错误串后返回if (mciGetErrorString(err, buf, 256) MessageBox(NULL, buf, L"Error", MB_OK);return;mciSendString(L"play midi", NULL, 0, NULL); / 播放MIDI文件其他常用的命令还有:暂停播放(pause)、恢复播放(resume)、停止播放(stop)、关闭设备(close)等。13.2 MMAPI简介MMAPI(MultiMedia API)是Windows的底层多媒体编程接口,包括波形音频处理(44个函数)、MIDI操作(41个函数)、多媒体计时器管理(8个函数)、操作杆控制(8个函数)和多媒体文件I/O(19个函数),共120个函数、44条消息和14个数据结构。本节只是列出各类MMAPI函数的名称,其中的MMIO和MIDI部分会在后面两节中介绍,其他MMAPI的函数和功能可参见Visual C+的帮助系统。13.2.1 波形音频处理函数MMAPI中含有44个波形音频处理函数(5个aux*+2个* PlaySound+37个waveIn/Out*):auxGetDevCapsauxGetNumDevsauxGetVolumeauxOutMessageauxSetVolumePlaySoundsndPlaySoundwaveInAddBufferwaveInClosewaveInGetDevCapswaveInGetErrorTextwaveInGetIDwaveInGetNumDevswaveInGetPositionwaveInMessagewaveInOpenwaveInPrepareHeaderwaveInProcwaveInResetwaveInStartwaveInStopwaveInUnprepareHeaderwaveOutBreakLoopwaveOutClosewaveOutGetDevCapswaveOutGetErrorTextwaveOutGetIDwaveOutGetNumDevswaveOutGetPitchwaveOutGetPlaybackRatewaveOutGetPositionwaveOutGetVolumewaveOutMessagewaveOutOpenwaveOutPausewaveOutPrepareHeaderwaveOutProcwaveOutResetwaveOutRestartwaveOutSetPitchwaveOutSetPlaybackRatewaveOutSetVolumewaveOutUnprepareHeaderwaveOutWrite13.2.2 MIDI函数MMAPI中含有41个MIDI函数:midiConnect midiDisconnectmidiInAddBuffermidiInClosemidiInGetDevCapsmidiInGetErrorTextmidiInGetIDmidiInGetNumDevsmidiInMessagemidiInOpenmidiInPrepareHeadermidiInProcmidiInResetmidiInStartmidiInStopmidiInUnprepareHeadermidiOutCacheDrumPatchesmidiOutCachePatchesmidiOutClosemidiOutGetDevCapsmidiOutGetErrorTextmidiOutGetIDmidiOutGetNumDevsmidiOutGetVolumemidiOutLongMsgmidiOutMessagemidiOutOpenmidiOutPrepareHeaderMidiOutProcmidiOutResetmidiOutSetVolumemidiOutShortMsgmidiOutUnprepareHeadermidiStreamClosemidiStreamOpenmidiStreamOutmidiStreamPausemidiStreamPositionmidiStreamPropertymidiStreamRestartmidiStreamStop13.2.3 计时器函数MMAPI中含有8个多媒体时间函数:timeBeginPeriodtimeEndPeriodtimeGetDevCapstimeGetSystemTimetimeGetTimetimeKillEventTimeProctimeSetEvent13.2.4 操作杆函数MMAPI中含有8个操作杆(joystick)函数:joyGetDevCapsjoyGetNumDevsjoyGetPosjoyGetPosExjoyGetThresholdjoyReleaseCapturejoySetCapturejoySetThreshold13.2.5 多媒体文件I/O函数这里只罗列MMIO定义的2个数据类型和2个结构,以及它所提供的18个函数和1个宏,还有7个专用消息。有关MMIO的详细内容,将在后面的13.4节中作部分介绍。l 数据类型:FOURCC; / 4字符代码MMRESULT; / 错误返回代码(0表示正确)l 结构:MMIOINFO; / I/O信息MMCKINFO; / 块信息l 函数或宏:n 基本I/O(6个):mmioClose、mmioOpen、mmioRead、mmioRename、mmioSeek、mmioWriten 缓冲I/O(5个):mmioAdvance、mmioFlush、mmioGetInfo、mmioSetBuffer、mmioSetInfon RIFF I/O(5个):mmioAscend、mmioCreateChunk、mmioDescend、mmioFOURCC(宏)、mmioStringToFOURCCn 定制I/O 过程(3个):IOProc、mmioInstallIOProc、mmioSendMessage其中,常用的用于读取和播放波形/AVI文件的函数有:mmioOpen、mmioClose、mmioRead、mmioDescend、mmioAscend。l 消息MMIO的专用消息有(字母序):MMIOM_CLOSE、MMIOM_OPEN、MMIOM_READ、MMIOM_RENAME、MMIOM_SEEK、MMIOM_WRITE、MMIOM_WRITEFLUSH,这些消息都用于定制的I/O过程。13.3 MIDI编程本节先介绍MMAPI中的基本MIDI函数,然后通过一个虚拟电子琴的实例来演示MIDI的功能和使用。13.3.1 MMAPI中的基本MIDI函数在13.2.2中已经列出了MMAPI中含有的41个MIDI函数的名称,下面将介绍其中常用的一些基本MIDI函数的功能、原型和参数。1. 查询MIDI设备可以利用midiOutGetNumDevs和midiOutGetDevCaps函数来查询当前系统的MIDI设备和性能:UINT midiOutGetNumDevs(VOID); / 返回MIDI输出设备的数目(非0表示支持MIDI)MMRESULT midiOutGetDevCaps( / 检查MIDI输出设备的性能 UINT_PTR uDeviceID, / 设备ID(0 设备数-1) LPMIDIOUTCAPS lpMidiOutCaps, / 指向MIDI输出设备的性能结构的指针 UINT cbMidiOutCaps / 性能结构的大小(字节数)); / 成功时返回MMSYSERR_NOERROR(=0)typedef struct / MIDI输出设备的性能结构 WORD wMid; / 厂商ID WORD wPid; / 产品ID MMVERSION vDriverVersion; / 驱动程序版本号(高/低位字节分别为主/次版本号) CHAR szPnameMAXPNAMELEN; / 产品名称表13-3 MIDI设备类型 WORD wTechnology; / 设备类型wTechnology数值设备类型MOD_MIDIPORT1MIDI硬件端口 MOD_SYNTH2合成器MOD_SQSYNTH3方波合成器MOD_FMSYNTH4调频合成器MOD_MAPPER5微软MIDI映射器MOD_WAVETABLE6硬件波表合成器 MOD_SWSYNTH7软件合成器 WORD wVoices; / 同时音色数 WORD wNotes; / 复音数 WORD wChannelMask; / 通道数 DWORD dwSupport; / 支持的可选功能 MIDIOUTCAPS;dwSupport数值功能MIDICAPS_VOLUME1支持音量控制MIDICAPS_LRVOLUME2支持分离左右音量控制MIDICAPS_CACHE4支持音色(patch)缓冲MIDICAPS_STREAM8提供对midiStreamOut函数的直接支持表13-4 支持的可选功能其中,typedef UINT MMVERSION;,设备类型wTechnology的取值见表13-3。支持的可选功能dwSupport的取值可为表13-4中值的组合。例如:(查询并显示MIDI设备的性能,输出结果如图13-2所示)UINT dn = midiOutGetNumDevs();if (dn = 0) MessageBox(L"No MIDI device!", L"Error");else / dn > 0CString str;MIDIOUTCAPS moc;for (UINT i = 0; i < dn; i+)if (midiOutGetDevCaps(i, &moc, sizeof(moc) = MMSYSERR_NOERROR) str.Format(L"DevNum = %d, M-ID = %d, P-ID = %d, Ver = %.4X, P-Name = %s, Tech = %d, Voices = %d, Notes = %d, Channels = %d, Support = %lX",i, moc.wMid, moc.wPid, moc.vDriverVersion,moc.szPname, moc.wTechnology,moc.wVoices, moc.wNotes, moc.wChannelMask, moc.dwSupport); pDC->TextOut(10, 10 + i*20, str);图13-2 查询并显示MIDI设备性能程序的输出结果例如,其中设备号为1的MIDI设备:制造商ID为1(创新公司)、产品ID为102、版本号为5.10、产品名为SB Live! MIDI Synth、采用硬件波表合成器技术、可同时有32种音色和32个复音、有64K个通道、并支持对主音量和左右音量的控制。2. 打开和关闭MIDI设备为了播放MIDI数据,必须首先调用函数midiOutOpen打开指定序号的MIDI输出设备,利用它所返回的设备句柄指针,再来调用其它函数来播放MIDI数据,最后调用函数midiOutClose来关闭MIDI输出设备。在播放MIDI数据的过程中,还可以调用函数midiOutReset来停止播放。下面是这两个函数的原型和参数含义:MMRESULT midiOutOpen( / 打开MIDI输出设备,成功返回MMSYSERR_NOERROR LPHMIDIOUT lphmo, / 设备句柄指针(用于返回值) UINT_PTR uDeviceID, / 设备ID(一般取为MIDI_MAPPER=1) DWORD_PTR dwCallback, / 回调函数指针(一般取为NULL0) DWORD_PTR dwCallbackInstance, / 回调函数使用的数据(一般取为NULL0) DWORD dwFlags / 打开设备标志(用于回调函数参数的类型,(一般取为0));MMRESULT midiOutClose(HMIDIOUT hmo); / 关闭MIDI输出设备MMRESULT midiOutReset(HMIDIOUT hmo); / 停止播放例如:HMIDIOUT hmo; / MIDI输出设备的句柄midiOutOpen(&hmo, MIDI_MAPPER, NULL, NULL, 0); / 打开MIDI输出设备midiOutReset(hmo); / 停止MIDI输出设备的播放midiOutClose(hmo); / 关闭MIDI输出设备3. 播放MIDI数据在打开MIDI输出设备后,可以调用函数midiOutShortMsg来发送短消息,从而能够动态控制MIDI输出设备和播放乐音。其函数的原型和参数含义为:MMRESULT midiOutShortMsg( / 发送短MIDI消息到指定的MIDI输出设备 HMIDIOUT hmo, / 设备句柄指针 DWORD dwMsg / MIDI消息 );字节序号0123字节内容状态值数据1数据2保留为0图13-3 MIDI消息的字节其中,MIDI消息为4字节无符号整数,其高字的高位字节保留为0、低位字节为MIDI数据的第2个字节,低字的高位字节MIDI数据的第1个字节、低位字节为MIDI的状态。因为在Intel CPU中,多字节整数的低位字节在前,所以实际的MIDI消息的字节顺序见图13-3。可定义双字与4字节数组的联合,前者用于函数调用,后者用于按字节赋值,例如:union DWORD dwData; BYTE bData4; midi;midi.bData0 = status;midi.bData1 = data1;midi.bData2 = data2;midi.bData3 = 0;midiOutShortMsg(hmo, midi.dwData); 至于MIDI消息的具体内容,会在下面的13.3.3小节中进行介绍。4. 设置音量MMRESULT midiOutSetVolume( / 设置MIDI输出设备的音量 HMIDIOUT hmo, / 设备句柄指针 DWORD dwVolume / 低/高字为左单/右声道的音

    注意事项

    本文(13MCI和MMAPI编程.doc)为本站会员(asd****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开