VC程序播放音乐必备---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的,该函数的声明为:

[cpp]  view plain copy print ?
  1. MCIERROR mciSendString(  
  2.   LPCTSTR lpszCommand,    //MCI命令字符串  
  3.   LPTSTR lpszReturnString, //存放反馈信息的缓冲区  
  4.   UINT  cchReturn,     //缓冲区的长度  
  5.   HANDLE hwndCallback    //回调窗口的句柄,一般为NULL  
  6. ); //若成功则返回0,否则返回错误码。  

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

[cpp]  view plain copy print ?
  1. BOOL mciGetErrorString(  
  2.   DWORD fdwError,   //函数mciSendString返回的错误码  
  3.   LPTSTR lpszErrorText, //接收描述错误的字符串的缓冲区  
  4.   UINT  cchErrorText  //缓冲区的长度  
  5. );  

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

[cpp]  view plain copy print ?
  1. char buf[50];  
  2. MCIERROR mciError;  
  3. mciError=mciSendString("open cdaudio",buf,strlen(buf),NULL);  
  4. if(mciError)  
  5. {  
  6.   mciGetErrorString(mciError,buf,strlen(buf));  
  7.   AfxMessageBox(buf);  
  8.   return;  
  9. }  

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


2、MCI设备


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

[plain]  view plain copy print ?
  1.   animation  动画设备  
  2. cdaudio   CD播放器  
  3. dat     数字音频磁带机  
  4. digitalvideo 某一窗口中的数字视频(不基于GDI)  
  5. other    未定义的MCI设备  
  6. overlay   重叠设备(窗口中的模拟视频)  
  7. scanner   图象扫描仪  
  8. sequencer  MIDI序列器  
  9. videodisc  视盘机  
  10. waveaudio  播放数字波形文件的音频设备  

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

[plain]  view plain copy print ?
  1.   [mci]  
  2. cdaudio=mcicda.drv  
  3. sequencer=mciseq.drv  
  4. waveaudio=mciwave.drv  
  5. avivideo=mciavi.drv  
  6. videodisc=mcipionr.drv  

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


3、MCI命令


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

[plain]  view plain copy print ?
  1.   open    打开设备  
  2. close    关闭设备  
  3. play    开始设备播放  
  4. stop    停止设备的播放或记录  
  5. record   开始记录  
  6. save    保存设备内容  
  7. pause    暂停设备的播放或记录  
  8. resume   恢复暂停播放或记录的设备  
  9. seek    改变媒体的当前位置  
  10. capacility 查询设备能力  
  11. info    查询设备的信息  
  12. status   查询设备状态信息  

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

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


(1) open 打开设备


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

[plain]  view plain copy print ?
  1.   open device_name type device_type alias device_alias  
  2. device_name     要使用的设备名,通常是文件名。  
  3. type device_type  设备类型,例如waveaudio或sequencer,可省略。  
  4. alias device_alias 设备别名,指定后可在其他命令中代替设备名。  

(2) play 开始设备播放


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

[plain]  view plain copy print ?
  1.   play device_alias from pos1 to pos2 wait repeat  
  2. 若省略from则从当前磁道开始播放,若省略to则播放到结束。  
  3. 若指明wait则等到播放完毕命令才返回。  
  4. 若指明repeat则会不停的重复播放。  
  5. 若同时指明wait和repeat则命令不会返回,本线程产生堵塞,通常会引起程序失去响应。  

(3) 播放CD

[cpp]  view plain copy print ?
  1.   void CTttView::OnOpenCD()  
  2. {  
  3.   mciSendString("open cdaudio",NULL,0,NULL);  
  4.   mciSendString("play cdaudio",NULL,0,NULL);  
  5. );  
  6. void CTttView::OnStopCD()  
  7. {  
  8.   mciSendString("stop cdaudio",NULL,0,NULL);  
  9.   mciSendString("close cdaudio",NULL,0,NULL);  
  10. );  

  还可以:

[plain]  view plain copy print ?
  1.   pause cdaudio  暂停播放。  
  2. resume cdaudio 继续被暂停的播放。  
  3. seek cdaudio to <位置> 移动到指定磁道。  
  4. set cdaudio door open/closed 弹出或缩进CD盘。  


(4) 播放多媒体文件

[cpp]  view plain copy print ?
  1.   void CTttView::OnMyMenu()  
  2. {  
  3.   mciSendString("open myfolder\\tada.wav alias aa",NULL,0,NULL);  
  4. 或 mciSendString("open myfolder\\flourish.mid alias aa",NULL,0,NULL);  
  5. 或 mciSendString("open myfolder\\clock.avi alias aa",NULL,0,NULL);  
  6.   mciSendString("play aa wait",NULL,0,NULL);  
  7.   mciSendString("close aa",NULL,0,m_hWnd);  
  8. );  


(5) 录制声音

[cpp]  view plain copy print ?
  1.  void CTttView::OnStartRecord()  
  2. {  
  3.   mciSendString("open new type waveaudio alias aa",NULL,0,NULL);  
  4.   mciSendString("record aa",NULL,0,NULL);  
  5. );  
  6. void CTttView::OnStopRecord()  
  7. {  
  8.   mciSendString("save aa c:\\aaa.wav wait",NULL,0,NULL);  
  9.   mciSendString("close aa",NULL,0,NULL);  
  10. );  


4、MCI命令消息


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

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

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

[cpp]  view plain copy print ?
  1. MCIERROR mciSendCommand(  
  2.  MCIDEVICEID wIDDevice,  //设备的ID,在打开设备时不用该参数  
  3.  UINT    uMsg,    //命令消息  
  4.  DWORD    fdwCommand, //命令消息的标志  
  5.  DWORD    dwParam   //指向包含命令消息参数的结构  
  6. //若成功则返回0,否则返回错误码  

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

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

[plain]  view plain copy print ?
  1.   void CTttView::OnMyMenu()  
  2. {  
  3.   MCI_OPEN_PARMS mciOpen;  
  4.   UINT wDeviceID;  
  5.   mciOpen.lpstrDeviceType = "avivideo";  
  6.   mciOpen.lpstrElementName = "myfolder\\clock.avi";  
  7.   mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);  
  8.   wDeviceID=mciOpen.wDeviceID;  
  9.   MCI_PLAY_PARMS mciPlay;  
  10.   mciSendCommand(wDeviceID, MCI_PLAY, MCI_WAIT, (DWORD)&mciPlay);  
  11. );  

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


参考网站 http://baike.baidu.com/view/1622810.htm?fr=ala0_1 和http://msdn.microsoft.com/en-us/library/dd743572(VS.85).aspx

你可能感兴趣的:(VC程序播放音乐必备---mciSendString用法)