关于MCI播放音乐测试(不能跨线程操作)

MCI大致介绍

媒体控制接口(Media Control Interface,缩写MCI)是由微软和IBM开发的一个高级应用程序接口(API),功能是控制连接到一台Microsoft Windows或OS/2计算机的多媒体外部设备(例如CD-ROM播放机、音频控制器)。

1、mciSendCommand函数

MCIERROR mciSendCommand(MCIDEVICEID IDDevice, UINT uMsg, DWORD fdwCommand, DWORD dwParam);

  • IDDevice:用来表示一个MCI设备。

  • umsg:表示要发出的消息(MCI_OPEN(打开设备)、MCI_CLOSE(关闭设备)、MCI_PLAY(播放音频)、MCI_STOP(停止播放))

  • fdwCommand:消息指定标志。

  • dwParam:指定一个指向消息数据结构的指针。

返回值:调用成功则返回0,否则返回错误代码消息。

例如:

mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD) & (mymci->OpenParms));
mciSendCommand(data->OpenParms.wDeviceID, MCI_PLAY, MCI_FROM, (DWORD)&(data->PlayParms));
mciSendCommand(mymci->OpenParms.wDeviceID, MCI_CLOSE, MCI_FROM, (DWORD)&(data->PlayParms));

2.mciSendString函数。

MCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);

  1. lpszCommand:一个以NULL结尾的定义MCI控制命令的字符串,格式为:command device_name argument

  2. lpszReturnString:一个远指针,它指向由应用程序返回的字符串缓冲区。

  3. cchReturn:指定了缓冲区大小。

  4. hwndCallback:用来指定接收并处理MCI向应用程序发出的MM_MCINOTIFY消息窗口的句柄。

返回值:函数成功调用,则返回0,否则返回错误代码。

例如:

mciSendString("open F:\\Vs_2019\\vs_project\\test\\Debug\\1.mp3 alias bkmusic", NULL, 0, NULL);
mciSendString("play bkmusic ", NULL, 0, NULL);//播放
mciSendString("pause bkmusic ", NULL, 0, NULL);//暂停
mciSendString("stop bkmusic ", NULL, 0, NULL);//停止
mciSendString("close bkmusic ", NULL, 0, NULL);//关闭设备


3.MMSYSTEM.H头文件中还定义了MCI命令所需要的数据结构类型。以下是MCI命令常用的数据结构。

    MCI_OPEN_PARMS     MCI_OPEN命令消息参数的数据结构 

    MCI_PLAY_PARMS     MCI_PLAY命令消息参数的数据结构 

    MCI_RECORD_PARMS   MCI_RECORD命令消息参数的数据结构

MCI_OPEN_PARMS

typedef struct _MCI_OPEN_PARMS    { 

DWORD dwCallback;         //设置MCI_NOTIFY标志时的回调窗口句柄 

MCIDEVICEID wDeviceID;    //打开设备成功时返回的设备标识号 

LPCSTR lpstrDeviceType;   //指定所要打开设备类型 

LPCSTR lpstrElementName;  //对于复合设备,指定设备元素 

LPCSTR lpstrAlias;        //设备别名    
} MCI_OPEN_PARMS;

MCI_PLAY_PARMS

typedef struc{ 

DWORD dwCallback;    //设置MCI_NOTIFY标志时回调窗口句柄 

DWORD dwFrom;        //播放的起始位置 

DWORD dwTo;          //播放的结束位置   
 } MCI_PLAY_PARMS;

MCI_RECORD_PARMS

typedef struct {
DWORD_PTR dwCallback; 
DWORD     dwFrom; 
DWORD     dwTo;  
} MCI_RECORD_PARMS;

例如:

MCI_OPEN_PARMS OpenParms;
OpenParms.lpstrDeviceType = NULL;// "mpegvideo";
OpenParms.lpstrElementName = "F:\\Vs_2019\\vs_project\\test\\Debug\\1.mp3";
OpenParms.wDeviceID = NULL;
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD) & (mymci->OpenParms));
//打开设备,会自动将设备号存储在wDeviceID
MCI_PLAY_PARMS PlayParms;
PlayParms.dwFrom = 0;
mciSendCommand(OpenParms.wDeviceID, MCI_PLAY, MCI_FROM, (DWORD)&PlayParms);

注意:MCI不能跨线程操作,这是折磨一天得到的结果!!

参考文章链接: 媒体控制接口(MCI)的学习与使用.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值