c语言mcisendstring函数,mciSendString用法

使用MCI API,源文件中需要包含头文件 Mmsystem.h,在Project->Settings->Link->Object/libray module中加入库 Winmm.lib。 VS2008在源文件加上#include "mmsystem.h" #pragma comment(lib,"winmm.lib")

1、MCI简介

MCI(Media Control Interface,媒体控制接口)向Windows程序提供了在高层次上控制媒体设备接口的能力。程序不必关心具体设备,就可以对激光唱机(CD)、视盘机、波形音频设备、视频播放设备和MIDI设备等媒体设备进行控制。

对于程序员来说,可以把MCI理解为设备面板上的一排按键,通过选择不同的按键(发送不同的MCI命令)可以让设备完成各种功能,而不必关心设备内部实现。

比如,对于play,视盘机和CD机有不同的反应(一个是播放视频,一个播放音频),而对用户来说却只需要按同一按钮。

应用程序通过向MCI发送命令来控制媒体设备。MCI命令接口分命令字符串和命令消息两种,两者具有相同的功能。命令字符串具有使用简单的特点,但是它的执行效率不如命令消息。

所有的MCI命令字符串都是通过多媒体API函数mciSendString传递给MCI的,该函数的声明为:

MCIERROR mciSendString(

LPCTSTR lpszCommand,    //MCI命令字符串

LPTSTR lpszReturnString, //存放反馈信息的缓冲区

UINT  cchReturn,     //缓冲区的长度

HANDLE hwndCallback    //回调窗口的句柄,一般为NULL

); //若成功则返回0,否则返回错误码。

该函数返回的错误码可以用mciGetErrorString函数进行分析,该函数的声明为:

BOOL mciGetErrorString(

DWORD fdwError,   //函数mciSendString返回的错误码

LPTSTR lpszErrorText, //接收描述错误的字符串的缓冲区

UINT  cchErrorText  //缓冲区的长度

);

下面是使用mciSendString函数的一个简单例子:

char buf[50];

MCIERROR mciError;

mciError=mciSendString("open cdaudio",buf,strlen(buf),NULL);

if(mciError)

{

mciGetErrorString(mciError,buf,strlen(buf));

AfxMessageBox(buf);

return;

}

open cdaudio命令打开CD播放器,如果出错(如驱动器内没有CD)则返回错误码,此时可以用mciGetErrorString函数取得错误信息字符串。

2、MCI设备

open是MCI打开设备的命令,cdaudio是MCI设备名。MCI的设备类型如下:

animation  动画设备

cdaudio   CD播放器

dat     数字音频磁带机

digitalvideo 某一窗口中的数字视频(不基于GDI)

other    未定义的MCI设备

overlay   重叠设备(窗口中的模拟视频)

scanner   图象扫描仪

sequencer  MIDI序列器

videodisc  视盘机

waveaudio  播放数字波形文件的音频设备

设备名是在注册表或SYSTEM.INI的[mci]部分定义的,典型的[mci]段如下:

[mci]

cdaudio=mcicda.drv

sequencer=mciseq.drv

waveaudio=mciwave.drv

avivideo=mciavi.drv

videodisc=mcipionr.drv

等号的左边是设备名,右边是对应的MCI驱动程序。当安装了新的MCI驱动程序时,系统要用不同的设备名来区分。

3、MCI命令

使用MCI设备一般包括打开、使用和关闭三个过程,常用的MCI命令有:

open    打开设备

close    关闭设备

play    开始设备播放

stop    停止设备的播放或记录

record   开始记录

save    保存设备内容

pause    暂停设备的播放或记录

resume   恢复暂停播放或记录的设备

seek    改变媒体的当前位置

capacility 查询设备能力

info    查询设备的信息

status   查询设备状态信息

MCI的大部分命令可以控制不同的媒体设备,但其中record和save命令并不是所有MCI设备都可以使用。

MCI命令的使用是很随意的,只要先打开,最后关闭,中间可以随意调用各种命令。

(1) open 打开设备

MCI设备使用前必须先打开,当然,使用后也必须要关闭,以免影响他人的使用。

open device_name type device_type alias device_alias

device_name     要使用的设备名,通常是文件名。

type device_type  设备类型,例如waveaudio或sequencer,可省略。

alias device_alias 设备别名,指定后可在其他命令中代替设备名。

(2) play 开始设备播放

MCI设备打开后即可以播放,可使用设备名或别名。

play device_alias from pos1 to pos2 wait repeat

若省略from则从当前磁道开始播放,若省略to则播放到结束。

若指明wait则等到播放完毕命令才返回。

若指明repeat则会不停的重复播放。

若同时指明wait和repeat则命令不会返回,本线程产生堵塞,通常会引起程序失去响应。

(3) 播放CD

void CTttView::OnOpenCD()

{

mciSendString("open cdaudio",NULL,0,NULL);

mciSendString("play cdaudio",NULL,0,NULL);

);

void CTttView::OnStopCD()

{

mciSendString("stop cdaudio",NULL,0,NULL);

mciSendString("close cdaudio",NULL,0,NULL);

);

还可以:

pause cdaudio  暂停播放。

resume cdaudio 继续被暂停的播放。

seek cdaudio to  移动到指定磁道。

set cdaudio door open/closed 弹出或缩进CD盘。

(4) 播放多媒体文件

void CTttView::OnMyMenu()

{

mciSendString("open myfolder\\tada.wav alias aa",NULL,0,NULL);

或 mciSendString("open myfolder\\flourish.mid alias aa",NULL,0,NULL);

或 mciSendString("open myfolder\\clock.avi alias aa",NULL,0,NULL);

mciSendString("play aa wait",NULL,0,NULL);

mciSendString("close aa",NULL,0,m_hWnd);

);

(5) 录制声音

void CTttView::OnStartRecord()

{

mciSendString("open new type waveaudio alias aa",NULL,0,NULL);

mciSendString("record aa",NULL,0,NULL);

);

void CTttView::OnStopRecord()

{

mciSendString("save aa c:\\aaa.wav wait",NULL,0,NULL);

mciSendString("close aa",NULL,0,NULL);

);

4、MCI命令消息

到目前为止,我们使用的都是MCI命令字符串。可以发现,命令字符串具有简单易学的优点,但这种接口与C/C++的风格相去甚远,如果程序要查询和设置大量数据,那么用字符串的形式将很不方便。

MCI的命令消息接口提供了C语言接口,它速度更快,并且更能符合C/C++程序员的需要。

所有MCI命令消息都是通过mciSendCommand函数发送的,函数声明为:

MCIERROR mciSendCommand(

MCIDEVICEID wIDDevice,  //设备的ID,在打开设备时不用该参数

UINT    uMsg,    //命令消息

DWORD    fdwCommand, //命令消息的标志

DWORD    dwParam   //指向包含命令消息参数的结构

); //若成功则返回0,否则返回错误码

命令消息uMsg与命令字符串是对应的,例如,open与MCI_OPEN完成的是一样的功能。

变量wDeviceID用来保存设备的ID,系统用ID来标识不同的设备,以保证命令发给正确的对象。

void CTttView::OnMyMenu()

{

MCI_OPEN_PARMS mciOpen;

UINT wDeviceID;

mciOpen.lpstrDeviceType = "avivideo";

mciOpen.lpstrElementName = "myfolder\\clock.avi";

mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);

wDeviceID=mciOpen.wDeviceID;

MCI_PLAY_PARMS mciPlay;

mciSendCommand(wDeviceID, MCI_PLAY, MCI_WAIT, (DWORD)&mciPlay);

);

可以看出,用命令消息比用命令字符串要复杂的多,但它的执行效率高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

整合

如何进行资源的整合,,,,, 如何进行网络资源的整合,,,, 如何将很多的积分进行整合,,,,,貌似第三季赢在中国的那个老外做了一个整合很多网站积分的项目,,,,,, 健康信息如何实现整合,,,,,貌似这也是第三季赢在中国里面一个人的项目,,,,, 好好反思下,如何整合,,,,,,,,将自己的学习资…

Tech·Ed 2009

今年是我第一次以讲师身份参加TechEd,碰巧TechEd所在的周末我们要搬家到百度大厦,所以我星期四早上搞掂打包工作后就赶到了会场。凭着《讲师指南》进入会场后,我直奔讲师休息室领取证件和衣服,然后再跑到MVP站台领取印章&#xff…

c语言1e3和1e3,自考“高级语言程序设计”习题答案详解(33)

6.1 单项选择题1.函数调用语句“f((el,e2),(e3,e4,e5));”中参数的个数是( )①1 ②2③4 ④5「解」上述函数调用中,(e1,e2)和(e3,e4,e5)是两个带括号的表达式,…

python实现实时监控_基于 Python 的交换机实时监控系统的设计与实现

从高校校园网运维工作实际出发,论文提出了一种基于 Python 语言SNMP协议的网络交换机监测系统设计思路与实现方法。整个系统系统采用B/S模式,基于轻量级的web开发框架web.py实现。后端采用Python编程语言实现对交换机各项数据的获取,实时数据…

兰州交通大学C语言课程设计,兰州交通大学C语言课程设计报告(完整版).doc

您所在位置:网站首页 > 海量文档&nbsp>&nbsp高等教育&nbsp>&nbsp实验设计兰州交通大学C语言课程设计报告(完整版).doc12页本文档一共被下载:次,您可全文免费在线阅读后下载本文档。下载提示1.本站不保证该用户上传的文档完整…

python manager与basemanager_使用Python多处理管理器(BaseManager/SyncManager)与远程计算机共享队列时出现管道中断...

在上个月,当我们试图使用Python2.6.x多处理包在几个不同的(linux)计算机之间共享队列时,我们遇到了一个持久的问题。我也直接向Jesse Noller提出了这个问题,因为我们还没有找到任何解释StackOverflow、Python文档、源代码或其他在线问题的东西…

Lucene 工作原理

Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构。该结构及相应的生成算法如下:0)设有两篇文章1和2文章1的内容为:Tom lives in Guangzhou,I live in Guangzhou too.文章2的内容为:He once lived …

导出excel数字前面的0消失_EXCEL文本之王TEXT函数的4个运用

转自EXCEL不加班今天分享文本之王TEXT函数的4个运用,跟着卢子一起来操作。1.发票号都是8位,从系统导出后前面的0消失,如何补齐?常规格式发票号前面的0都会消失,只有文本格式情况下的0才不会消失。事先录入的话&#xf…

c 语言读取注册表信息,C++读取注册表的实现方法

C读取注册表GetRegValue.h:#ifndef __GETREGVALUE_H__#define __GETREGVALUE_H__#include //---------------------------------------------------------------//function:// GetRegValue 获取注册表中指定键的值//Access:// public//Parameter:// [in] int nKeyType - 注册表…

java传值问题.

Java传递参数只有一种 :值传递 而没有引用传递 一般根据传递类型来分类 可以分为 值类型数据 和 引用数据类型 值类型是原始数据类型 包括 int,byte,char short long,boolean,float,double 引用类型就是一般的class类 当然也包括原始数据的封装类型 比如int的 封装类…

stm32按键矩阵代码_STM32 学习笔记---1

既然打算学,基础的东西元件的得知道是什么,这样写代码的时候才能知道自己在干什么!ROM 和Flash 断电后都能储存数据,RAM则不能其实闪存(flash)是ROM的一种它的全名---FLASH EEPROM EEPROM---电可擦除可编程…

c语言 包络算法,包络检测C程序

最近做项目要提取一个声音信号的包络波形,所以花了点时间研究各种包络提取的算法。所谓包络检测又叫幅度解调,在许多领域都有重要的应用。如果载波信号是确定的,那么通常可以采用同步解调的方式,这种方式的信噪比最好,…

SQL Server 2005 DTS导入平面数据

SQL Server 2005 DTS导入平面数据源时,总是被截断,无法执行的错误解决方案 1 典型的错误信息如下: 消息 * 错误 0xc02020a1: 数据流任务: 数据转换失败。列“列 2”的数据转换返回状态值 4 和状态文本“文本被截断,或者一个或多个…

python交换数组中的两个元素_[Python]华为面试题,交换两个数组的元素使之总和的差值最小。...

看看写了个 &#xff0c;实现不需数组长度一致&#xff0c;复杂度O(n^2),求好的算法/** arr1{1,2,3};* arr2{22,33,44,55};* 交换两个矩阵数据*/public void exchange(){int index0;int lenarr1.length;int currMinusgetMinus();while(true){for (int i 0; i < arr2.length…

c语言switch为什么要加break,c语言学习笔记 switch case语句为什么要加break

先来看一个没有break的例子&#xff1a;int main(){int a 1;switch (a){case 1:printf("1");case 2:printf("2");}}我们看一下它的汇编代码&#xff1a;switch (a)0137181F mov eax,dword ptr [a]01371822 mov dword ptr [ebp-0D0h],eax01371828 cmp dwor…

VC中ADO连接SQLSERVER的几种标准方式?

VC用ADO访问数据库全攻略,介绍了VC用ADO来访问数据库的各个对象及各方法&#xff0c;很经典&#xff0c;也很实用&#xff0c;很值得一看。 正文 一、ADO概述 ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的&#xff0c;是一个便于使用的应用程序层接口。ADO 使您…

usb转ttl_[开源]双TYPEC转TTL串口模块

在工作中经常会用到USB转TTL串口调试工具。网上买的用的不顺手&#xff0c;所以做了一个。最终效果:渲染图实物图学习目的做一个USB转串口模块&#xff0c;使用学习渲染软件keyshot使用到的工具:立创EDA&#xff0c;keyshot等电烙铁&#xff0c;万用表等1.需要实现的功能4.根据…

linux smb 启动失败,[已解决]windows能看到smb,但是打不开

xiadao_81 于 2010-01-15 16:32:31发表:还是不行啊&#xff01;郁闷&#xff01;还会哪里原因的&#xff1f;我把配置中没有注释的全拿出来了74 workgroup mshome75 server string Samba Server76 guest okyes77 guest accountroot102 security share103 passdb backend td…

String类的构造与析构相关处理

String类原型&#xff1a; 1 Class String2 {3 Public:4 String(constchar*str);5 String(constString &other);6 ~String(void);7 String&operator(constString &other);8 Private:9 char*m_data;10 };String的析构函数 1 String::~String(void)2 {3 delete []m_d…

cocos2dx 字体外发光_在电致发光研发领域,选择有机材料是基于哪些原因?

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以免费收到最新内容了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。声明&#xff1a;本文转载自网络&#xff0c;如有侵权&#xff0c;请在后台留言联系…