没有合适的资源?快使用搜索试试~ 我知道了~
MCI和MMAPI编程
4星 · 超过85%的资源 需积分: 9 14 下载量 193 浏览量
2008-12-05
11:32:58
上传
评论 1
收藏 470KB DOC 举报
温馨提示
试读
26页
介绍Windows多媒体的两种传统编程接口——高层的MCI和底层的MMAPI,主要讨论MCI的命令串和命令消息方式编程和MMAPI中的MMIO与MIDI编程
资源推荐
资源详情
资源评论
第13章 MCI和MMAPI编程
本章介绍Windows多媒体的两种传统编程接口——高层的MCI和底层的MMAPI,主要
讨论MCI的命令串和命令消息方式编程和MMAPI中的MMIO与MIDI编程。
MCI和MMAPI都没有被封装入MFC,为Windows SDK中的API。在Visual Studio
2005/2008的帮助系统中,MCI和MMAPI的帮助文档位于“目录 / Win32和COM开发 /
G r a p h i c s a n d M u l t i m e d i a / W i n d o w s M u l t i m e d i a / S D K D o c u m e n t a t i o n / W i n d o w s
Multimedia”的各子目录中。
13.1 MCI编程
MCI(Media Control Interface,媒体控制接口)是Windows中控制多媒体设备的高层命令
接口,用于事件协调及与MCI设备驱动程序的通信。
MCI的主要特点是其设备独立性。通过设备驱动程序,MCI提供了与设备无关的虚拟
接口。参见图13-1。MCI的核心是MCI的设备驱动程序,它用于解释 和
执行MCI的命令,可分成如下三类:
直接控制媒体设备硬件,如CD音乐、影碟机;
通过低层MMAPI间接控制目标设备,如MIDI、WAV;
提供DLL高层接口,如AVI/MPEG影片播放器。
13.1.1 MCI设备
MCI设备可分为如下两种类型:
简单设备——不需要提供数据文件,如CD音乐、DVD机;
复合设备——需要提供数据文件,如 MIDI音 序 器 ( . M I D )、波形音频设备
(.WAV)、影片播放器(.AVI/.MPG)。
每类MCI设备都有对应的命令集,但也有若干同类MCI驱动程序共用同一命令集,为
了区分不同的驱动程序,MCI引入设备名:(按字母序排列)
animation——动画播放设备;
cdaudio——CD音乐播放设备;
dat——数字音频磁带机(DAT = Digital Audio Tape数字录音带);
digitalvideo——数字视频(不基于GUI);
mmmovie——多媒体影片播放设备;
other——未定义的MCI设备(扩展用);
MCI 设备驱动程序
MCI 命令
多媒体设备
多媒体应用程序
图 13-1 MCI 的设备独立
性
多媒体技术基础
overlay——窗口中的模拟视频接口(基于GUI);
scanner——图像扫描仪;
sequencer——MIDI音序器;
vcr——盒式磁带录像机(VCR = Video Cassette Recorder);
videodisc——影碟机;
waveaudio——波形音频设备。
13.1.2 接口、函数与命令
多媒体应用程序通过发送命令来控制多媒体设备,MCI有串和消息两种命令接口方式
这些命令接口,又由若干MCI函数来具体实现。
1. 接口
应用程序通过向MCI设备发送命令来控制它,这种命令有两种功能等价的接口方式:
命令串方式——用近似英语的句法与MCI设备通信,直观、面向用户。是一种文
本形式的接口,常用于VB等可视化编程平台和ToolBook等多媒体著作工具。如
mciSendString(L"play cdaudio from 2 to 5", NULL, 0, NULL);
命令消息方式——利用消息和数据结构与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)仅命令串方式
只适用于命令串接口方式的只有如下一个函数:(命令串中的字符不区分大小写)
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)仅命令消息方式
只适用于命令消息接口方式的也只有一个函数:
• 2 •
第 13 章 MCI 和 MMAPI 编程
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";
m c i S e n d C o m m a n d ( N U L L , M C I _ O P E N , M C I _ O P E N _ T Y P E |
MCI_OPEN_ELEMENT
| MCI_OPEN_ALIAS, (DWORD)(LPVOID)&playParms);
MCIDEVICEID wDevID = openParms.wDeviceID;
3)两种接口方式
两种接口方式都支持的函数有五个:
mciGetErrorString(获得出错文本串)
BOOL mciGetErrorString( // 成功返回TRUE
DWORD fdwError, // 由mciSendString或mciSendCommand返回的错误代码
LPTSTR lpszErrorText, // 指向接收返回错误信息的文本缓冲区
UINT cchErrorText // 上述缓冲区的长度
);
如:
M C I E R R O R e r r = m c i S e n d S t r i n g( L"o p e n s a m p l e . w a v t y p e w a v e a u d i o a l i a s
wave",
NULL, 0, NULL);
if (err) { wchar_t errStr[256];
if (mciGetErrorString(err, errStr, 256)) MessageBox(errStr, L"Error"); }
mciGetDeviceID(获得设备ID),函数原型为:
MCIDEVICEID mciGetDeviceID( // 出错返回非零
LPCTSTR lpszDevice // 已经打开的设备[别]名
);
如:wDevID = mciGetDeviceID(L"waveaudio"); 或 wDevID = mciGetDeviceID(L"wave");
MCI中还有3个少用的回调过程函数:mciSetYieldProc(设置等待时调用的过程)、
• 3 •
多媒体技术基础
mciGetYieldProc(获得等待时调用的过程)和mciGetCreatorTask(获取创建任务)。以上
7个MCI函数中,最常用的是mciSendString、mciSendCommand和mciGetErrorString这三个
3. 命令
MCI的命令很多,可以分为如下四类:
系 统 命 令 — — 直 接 由 M C I系 统 解 释 和 处 理 , 不 传 送 到 M C I设 备 。 如 b r e a k或
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的
定义为:
typedef struct {
• 4 •
表 13-2 打开命令的部分附加标志
第 13 章 MCI 和 MMAPI 编程
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中的具体做法:选“项目/Midi属性”菜单项,打开项目的属
性页窗口,先选“所有配置”,再选“配置属性/链接器/输入”项,在右边上部的“附加依赖项”
栏的右边,键入winmm.lib后按“应用”钮,最后按“确定”钮关闭对话框。
1. CD
wchar_t buf[256];
M C I E R R O R e r r = m c i S e n d S t r i n g ( L " o p e n c d a u d i o a l i a s c d " , N U L L , 0 , N U L L ) ; / /
打开CD
if (err) { // 获得并显示错误串后返回
if (mciGetErrorString(err, buf, 256)) MessageBox(buf, L"Error");
return;
}
m c i S e n d S t r i n g ( L " s t a t u s c d n u m b e r o f t r a c k s " , b u f , 2 5 6 , N U L L ) ; / /
获得音轨总数
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头播放到音轨n–1尾
其他常用命令:
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的音轨总长度
标志 含义(在 MCI_OPEN_PARMS 结构中)
MCI_OPEN_ALIAS lpstrAlias 域指定了别名
MCI_OPEN_ELEMENT lpstrElementName 域指定了元素(文件)
名
MCI_OPEN_SHAREABL
E
按共享方式打开 MCI 设备
MCI_OPEN_TYPE lpstrDeviceType 域指定了设备类型
MCI_OPEN_TYPE_ID wDeviceID 域指定了设备类型的 ID
• 5 •
剩余25页未读,继续阅读
资源评论
- lovinglovey2012-11-11写的很详细,可是对我没有用处
- cindyhappy19922012-04-05关于midi文件的编程讲解的较为清楚,但是由于我是在java上编译,不知如何兼容。
UpperJ
- 粉丝: 2
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功