13MCI和MMAPI编程.docx

上传人:b****4 文档编号:3812476 上传时间:2022-11-25 格式:DOCX 页数:42 大小:135.92KB
下载 相关 举报
13MCI和MMAPI编程.docx_第1页
第1页 / 共42页
13MCI和MMAPI编程.docx_第2页
第2页 / 共42页
13MCI和MMAPI编程.docx_第3页
第3页 / 共42页
13MCI和MMAPI编程.docx_第4页
第4页 / 共42页
13MCI和MMAPI编程.docx_第5页
第5页 / 共42页
点击查看更多>>
下载资源
资源描述

13MCI和MMAPI编程.docx

《13MCI和MMAPI编程.docx》由会员分享,可在线阅读,更多相关《13MCI和MMAPI编程.docx(42页珍藏版)》请在冰豆网上搜索。

13MCI和MMAPI编程.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1