13MCI和MMAPI编程.docx
- 文档编号:3812476
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:42
- 大小:135.92KB
13MCI和MMAPI编程.docx
《13MCI和MMAPI编程.docx》由会员分享,可在线阅读,更多相关《13MCI和MMAPI编程.docx(42页珍藏版)》请在冰豆网上搜索。
13MCI和MMAPI编程
第13章MCI和MMAPI编程
本章介绍Windows多媒体的两种传统编程接口——高层的MCI和底层的MMAPI,主要讨论MCI的命令串和命令消息方式编程和MMAPI中的MMIO与MIDI编程。
MCI和MMAPI都没有被封装入MFC,为WindowsSDK中的API。
在VisualStudio2008的帮助系统中,MCI和MMAPI的帮助文档位于“目录/Win32和COM开发/GraphicsandMultimedia/WindowsMultimedia/SDKDocumentation/WindowsMultimedia”的各子目录中。
13.1MCI编程
MCI(MediaControlInterface,媒体控制接口)是Windows中控制多媒体设备的高层命令接口,用于事件协调及与MCI设备驱动程序的通信。
MCI的主要特点是其设备独立性。
通过设备驱动程序,MCI提供了与设备无关的虚拟接口。
参见图13-1。
MCI的核心是MCI的设备驱动程序,它用于解释和执行MCI的命令,可分成如下三类:
●
直接控制媒体设备硬件,如CD音乐、影碟机;
●通过低层MMAPI间接控制目标设备,如MIDI、WAV;
●提供DLL高层接口,如AVI/MPEG影片播放器。
13.1.1MCI设备
图13-1MCI的设备独立性
MCI设备可分为如下两种类型:
●简单设备——不需要提供数据文件,如CD音乐、DVD机;
●复合设备——需要提供数据文件,如MIDI音序器(.MID)、波形音频设备(.WAV)、影片播放器(.AVI/.MPG)。
每类MCI设备都有对应的命令集,但也有若干同类MCI驱动程序共用同一命令集,为了区分不同的驱动程序,MCI引入设备名:
(按字母序排列)
●animation——动画播放设备;
●cdaudio——CD音乐播放设备;
●dat——数字音频磁带机(DAT=DigitalAudioTape数字录音带);
●digitalvideo——数字视频(不基于GUI);
●mmmovie——多媒体影片播放设备;
●other——未定义的MCI设备(扩展用);
●overlay——窗口中的模拟视频接口(基于GUI);
●scanner——图像扫描仪;
●sequencer——MIDI音序器;
●vcr——盒式磁带录像机(VCR=VideoCassetteRecorder);
●videodisc——影碟机;
●waveaudio——波形音频设备。
13.1.2接口、函数与命令
多媒体应用程序通过发送命令来控制多媒体设备,MCI有串和消息两种命令接口方式。
这些命令接口,又由若干MCI函数来具体实现。
1.接口
应用程序通过向MCI设备发送命令来控制它,这种命令有两种功能等价的接口方式:
●命令串方式——用近似英语的句法与MCI设备通信,直观、面向用户。
是一种文本形式的接口,常用于VB等可视化编程平台和ToolBook等多媒体著作工具。
如
mciSendString(L"playcdaudiofrom2to5",NULL,0,NULL);
●命令消息方式——利用消息和数据结构与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_FROM|MCI_TO,
(DWORD)(LPVOID)&playParms);
2.函数
MCI函数中,有些只适用于一种接口方式,有些则两种接口都可以用。
1)仅命令串方式
只适用于命令串接口方式的只有如下一个函数:
(命令串中的字符不区分大小写)
●mciSendString(发送命令串),函数原型为:
MCIERRORmciSendString(//出错返回非零值(错误代码)
//可用mciGetErrorString获得错误的文本描述
LPCTSTRlpszCommand,//指向以null结尾的命令字符串:
”命令设备[参数]”
LPTSTRlpszReturnString,//指向接收返回信息的缓冲区,为NULL时不返回信息
UINTcchReturn,//上述缓冲区的大小
HANDLEhwndCallback//在命令串中含notify时,它指定一个回调窗口的句柄
//一般为NULL
);
如:
mciSendString(L"opensample.wavtypewaveaudioaliaswave",NULL,0,NULL);
2)仅命令消息方式
只适用于命令消息接口方式的也只有一个函数:
●mciSendCommand(发送命令),函数原型为:
MCIERRORmciSendCommand(//出错返回非零值(低字错误代码,高字驱动程序ID)
//也可用mciGetErrorString获得错误的文本描述
MCIDEVICEIDIDDevice,//接收命令消息的MCI设备ID
//对MCI_OPEN消息为NULL
UINTuMsg,//命令消息
DWORDfdwCommand,//命令消息的附加标志
DWORDdwParam//命令消息参数的结构指针(可统一函数形式)
);
如:
MCI_OPEN_PARMSopenParms;
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);
MCIDEVICEIDwDevID=openParms.wDeviceID;
3)两种接口方式
两种接口方式都支持的函数有五个:
●mciGetErrorString(获得出错文本串)
BOOLmciGetErrorString(//成功返回TRUE
DWORDfdwError,//由mciSendString或mciSendCommand返回的错误代码
LPTSTRlpszErrorText,//指向接收返回错误信息的文本缓冲区
UINTcchErrorText//上述缓冲区的长度
);
如:
MCIERRORerr=mciSendString(L"opensample.wavtypewaveaudioaliaswave",
NULL,0,NULL);
if(err){wchar_terrStr[256];
if(mciGetErrorString(err,errStr,256))MessageBox(errStr,L"Error");}
●mciGetDeviceID(获得设备ID),函数原型为:
MCIDEVICEIDmciGetDeviceID(//出错返回非零
LPCTSTRlpszDevice//已经打开的设备[别]名
);
如:
wDevID=mciGetDeviceID(L"waveaudio");或wDevID=mciGetDeviceID(L"wave");
MCI中还有3个少用的回调过程函数:
mciSetYieldProc(设置等待时调用的过程)、mciGetYieldProc(获得等待时调用的过程)和mciGetCreatorTask(获取创建任务)。
以上7个MCI函数中,最常用的是mciSendString、mciSendCommand和mciGetErrorString这三个。
3.命令
MCI的命令很多,可以分为如下四类:
⏹系统命令——直接由MCI系统解释和处理,不传送到MCI设备。
如break或MCI_BREAK
⏹通用命令——所有MCI设备都支持的命令。
如open或MCI_OPEN
⏹可选命令——MCI设备可选择使用的命令。
如play或MCI_PLAY
⏹专用命令——为某类MCI设备[集]专有。
如list或MCI_LIST(DV/VCR)
前三类中部分命令参见表13-1:
表13-1部分MCI命令(字母序)
类型
消息
串
说明
系统
MCI_BREAK
break
为指定MCI设备设置终止键
MCI_SOUND
sound
播放Windows指定的系统声音
MCI_SYSINFO
sysinfo
返回有关MCI设备的信息
通用
MCI_CLOSE
close
关闭MCI设备
MCI_GETDEVCAPS
getdevcaps
获得MCI设备的性能参数
MCI_INFO
info
获得MCI设备的有关信息
MCI_OPEN
open
打开(初始化)MCI设备
MCI_STATUS
status
返回MCI设备的状态信息
可选
MCI_LOAD
load
从文件中加载数据
MCI_PAUSE
pause
暂停播放/记录
MCI_PLAY
play
开始播放数据
MCI_RECORD
record
开始记录数据
MCI_RESUME
resume
重新开始播放/记录
MCI_SAVE
save
保存数据到文件
MCI_SEEK
seek
改变当前位置
MCI_SET
set
改变控制设置
MCI_STOP
stop
停止播放/记录
标志
MCI_WAIT
wait
MCI命令执行完后才返回
MCI_NOTIFY
notify
MCI命令执行完后向应用程序发送MM_MCINOTIFY消息
4.附加标志与参数结构
复杂的命令消息一般都有附加标志,并需要设置相应数据结构。
如打开命令MCI_OPEN消息的附加标志见表13-2(可以位或“|”)。
其中,结构MCI_OPEN_PARMS的定义为:
表13-2打开命令的部分附加标志
typedefstruct{
标志
含义(在MCI_OPEN_PARMS结构中)
MCI_OPEN_ALIAS
lpstrAlias域指定了别名
MCI_OPEN_ELEMENT
lpstrElementName域指定了元素(文件)名
MCI_OPEN_SHAREABLE
按共享方式打开MCI设备
MCI_OPEN_TYPE
lpstrDeviceType域指定了设备类型
MCI_OPEN_TYPE_ID
wDeviceID域指定了设备类型的ID
DWORDdwCallback;
MCIDEVICEIDwDeviceID;
LPCSTRlpstrDeviceType;
LPCSTRlpstrElementName;
LPCSTRlpstrAlias;
}MCI_OPEN_PARMS;
13.1.3编程
下面以播放CD音乐、波形音频文件与MIDI为例,介绍简单与复杂MCI设备的多媒体命令串编程。
为了使用MCI编程,必须包含多媒体头文件mmsystem.h,并在项目属性中添加对多媒体库winmm.lib链接。
在VS05/08中的具体做法:
选“项目/Midi属性”菜单项,打开项目的属性页窗口,先选“所有配置”,再选“配置属性/链接器/输入”项,在右边上部的“附加依赖项”栏的右边,键入winmm.lib后按“应用”钮,最后按“确定”钮关闭对话框。
1.CD
wchar_tbuf[256];
MCIERRORerr=mciSendString(L"opencdaudioaliascd",NULL,0,NULL);//打开CD
if(err){//获得并显示错误串后返回
if(mciGetErrorString(err,buf,256))MessageBox(buf,L"Error");
return;
}
mciSendString(L"statuscdnumberoftracks",buf,256,NULL);//获得音轨总数
m_nTracks=wcstol(buf,NULL,10);//这里使用了宽字符版的字符串到整数的
//转换函数:
longwcstol(constwchar_t*nptr,wchar_t**endptr,intbase);
wsprintf(buf,L"playcdfrom%dto%d",m,n);//m和n为表示起止音轨的整型变量
mciSendString(buf,NULL,0,NULL);//从音轨m头播放到音轨n–1尾
其他常用命令:
mciSendString(L"setcdtimeformattmsf",NULL,0,NULL);//设置时间格式为
//轨(<100):
分(<100):
秒(<60):
帧(<75),一秒=75块,一块=98帧
mciSendString(L"setcddooropen",NULL,0,NULL);//打开光驱
mciSendString(L"setcddoorclosed",NULL,0,NULL);//关闭光驱
mciSendString(L"pausecd",NULL,0,NULL);//暂停播放
mciSendString(L"resumecd",NULL,0,NULL);//恢复播放
mciSendString(L"stopcd",NULL,0,NULL);//停止播放
mciSendString(L"closecd",NULL,0,NULL);//关闭CD设备
mciSendString(L"statuscdlength",buf,256,NULL);//获得整个CD的音轨总长度
mciSendString(L"statuscdlengthtrack5",buf,256,NULL);//获得第5个音轨的长度
mciSendString(L"statuscdcurrenttrack",buf,256,NULL);//获得当前音轨号
注意,"playcdfrommton"是完整形式,它还有其他形式:
"playcdfromm"——从m播放到盘尾
"playcdton"——从当前位置播放到指定音轨
"playcd"——从当前位置播放到盘尾
例如播放最后一首歌:
"playcdfromm_nLast"
2.WAV
wchar_tbuf[256];
//下面字符串中的转移字符对“\"”可用于界定带空格的文件路径,以免MCI系统
//将空格后的部分路径名,误判成错误的命令参数
wsprintf(buf,L"open\"%s\"aliassoundtypewaveaudio",pDoc->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,L"playsoundfrom%ldto%ld",start,end);
mciSendString(buf,NULL,0,NULL);
其他常用命令有:
mciSendString(L"statussoundlength",buf,256,NULL);//获取声音长度
mciSendString(L"pausesound",NULL,0,NULL);//暂停声音播放
mciSendString(L"resumesound",NULL,0,NULL);//恢复声音播放
mciSendString(L"playsound",NULL,0,NULL);//从当前位置播放到文件尾
mciSendString(L"stopsound",NULL,0,NULL);//停止声音播放
mciSendString(L"closesound",NULL,0,NULL);//关闭波形音频设备
3.MIDI
MIDI所对应的MCI设备名为sequencer(音序器),打开MIDI设备的命令串常用格式为:
L"openMIDI文件路径alias别名typesequencer";播放MIDI文件的命令串一般格式为:
L"play别名from位置1to位置2",其中位置的单位为毫秒。
若无“from位置1”则从头播放,若无“to位置2”则播放到文件尾。
如“play别名”是从头到尾播放。
例如:
CStringstr=L"open\""+ar.GetFile()->GetFilePath()+L"\"typesequenceraliasmidi"
wchar_tbuf[256];
MCIERRORerr=mciSendString(str,NULL,0,NULL);//打开MIDI文件和设备
if(err){//获得并显示错误串后返回
if(mciGetErrorString(err,buf,256))MessageBox(NULL,buf,L"Error",MB_OK);
return;
}
mciSendString(L"playmidi",NULL,0,NULL);//播放MIDI文件
其他常用的命令还有:
暂停播放(pause)、恢复播放(resume)、停止播放(stop)、关闭设备(close)等。
13.2MMAPI简介
MMAPI(MultiMediaAPI)是Windows的底层多媒体编程接口,包括波形音频处理(44个函数)、MIDI操作(41个函数)、多媒体计时器管理(8个函数)、操作杆控制(8个函数)和多媒体文件I/O(19个函数),共120个函数、44条消息和14个数据结构。
本节只是列出各类MMAPI函数的名称,其中的MMIO和MIDI部分会在后面两节中介绍,其他MMAPI的函数和功能可参见VisualC++的帮助系统。
13.2.1波形音频处理函数
MMAPI中含有44个波形音频处理函数(5个aux*+2个*PlaySound+37个waveIn/Out*):
auxGetDevCaps
auxGetNumDevs
auxGetVolume
auxOutMessage
auxSetVolume
PlaySound
sndPlaySound
waveInAddBuffer
waveInClose
waveInGetDevCaps
waveInGetErrorText
waveInGetID
waveInGetNumDevs
waveInGetPosition
waveInMessage
waveInOpen
waveInPrepareHeader
waveInProc
waveInReset
waveInStart
waveInStop
waveInUnprepareHeader
waveOutBreakLoop
waveOutClose
waveOutGetDevCaps
waveOutGetErrorText
waveOutGetID
waveOutGetNumDevs
waveOutGetPitch
waveOutGetPlaybackRate
waveOutGetPosition
waveOutGetVolume
waveOutMessage
waveOutOpen
waveOutPause
waveOutPrepareHeader
waveOutProc
waveOutReset
waveOutRestart
waveOutSetPitch
waveOutSetPlaybackRate
waveOutSetVolume
waveOutUnprepareHeader
waveOutWrite
13.2.2MIDI函数
MMAPI中含有41个MIDI函数:
midiConnect
midiDisconnect
midiInAddBuffer
midiInClose
midiInGetDevCaps
midiInGetErrorText
midiInGetID
midiInGetNumDevs
midiInMessage
midiInOpen
midiInPrepareHeader
midiInProc
midiInReset
midiInStart
midiInStop
midiInUnprepareHeader
midiOutCacheDrumPatches
midiOutCachePatches
midiOutClose
midiOutGetDevCaps
midiOutGetErrorText
midiOutGetID
midiOutGetNumDevs
midiOutGetVolume
midiOutLongMsg
midiOutMessage
midiOutOpen
midiOutPrepareHeader
MidiOutProc
midiOutReset
midiOutSetVolume
midiOutShortMsg
midiOutUnprepareHeader
midiStreamClose
midiStreamOpen
midiStreamOut
midiStreamPause
midiStreamPosition
midiStreamProperty
midiStreamRestart
midiStreamStop
13.2.3计时器函数
MMAPI中含有8个多媒体时间函数:
timeBeginPeriod
timeEndPeriod
timeGetDevCaps
timeGetSystemTime
timeGetTime
timeKillEvent
TimeProc
timeSetEvent
13.2.4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 13 MCI MMAPI 编程
![提示](https://static.bdocx.com/images/bang_tan.gif)