【API】C语言使用mciSendCommand播放MIDI音乐
mciSendCommand可用于播放各种多媒体文件,比如WAV、CD音乐、MP3、AVI、MID等。这个函数在百度和MSDN上已经有很充足的介绍了,键人在此不再赘述。大致参数格式如下:
MMRESULT 返回结果=mciSendCommand(设备ID,命令,参数1,参数2);
返回结果详见MSDN。而设备ID可以通过使用命令MCI_OPEN获取。
直接贴源码。大家看看它是怎么用的就行。//=============================================================================
//作者:0xAA55
//论坛:http://www.0xaa55.com/
//版权所有(C) 2013-2014 技术宅的结界
//请保留原作者信息,否则视为侵权。
//-----------------------------------------------------------------------------
#include<stdio.h>
#include<conio.h>
#include<Windows.h>
void Usage(char*argv0)
{
if(!argv0)
argv0="MidiPlay";
fprintf(stderr,
"Usage\n"
"%s midifile.mid",argv0);
}
int main(int argc,char**argv)
{
MCIERROR result;
MCI_OPEN_PARMS mciOpenParms={0};
MCI_PLAY_PARMS mciPlayParms={0};
MCI_STATUS_PARMS mciStatusParms={0};
MCI_SEQ_SET_PARMS mciSeqSetParms={0};
if(argc<2)
{
Usage(argv);
return 1;
}
//打开MCI设备
mciOpenParms.dwCallback=0;
mciOpenParms.wDeviceID=0;
mciOpenParms.lpstrDeviceType=(LPCSTR)MCI_DEVTYPE_SEQUENCER;//设置文件格式为MIDI序列。改这里,可以使其用于播放其他格式的多媒体文件。
mciOpenParms.lpstrElementName=argv;//文件名
mciOpenParms.lpstrAlias=NULL;//别名
result=mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE_ID|MCI_OPEN_ELEMENT,(DWORD_PTR)(&mciOpenParms));//取得设备ID。
if(result)
goto BadReturn;
//取得状态
mciStatusParms.dwItem=MCI_SEQ_STATUS_PORT;
result=mciSendCommand(mciOpenParms.wDeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD_PTR)(&mciStatusParms));
if(result)
goto BadReturn;
//判断MIDI映射
if(LOWORD(mciStatusParms.dwReturn)!=MIDI_MAPPER)
{
fputs("The MIDI mapper is not available. Continue?\n",stdout);
for(;;)//这样按错键也没关系
{
char ch=_getch();
if(ch=='Y'||ch=='y')
break;
else if(ch=='N'||ch=='n')
{
mciSendCommand(mciOpenParms.wDeviceID,MCI_CLOSE,0,0);
return 0;
}
}
}
//播放
result=mciSendCommand(mciOpenParms.wDeviceID,MCI_PLAY,0,(DWORD_PTR)&mciPlayParms);
if(result)
goto BadReturn;
fputs("Press any key to stop playing.\n",stdout);
_getch();
//停止并结束
mciSendCommand(mciOpenParms.wDeviceID,MCI_CLOSE,0,0);
return 0;
BadReturn:
fprintf(stderr,"MCIERROR=0x%08X\n",result);
if(mciOpenParms.wDeviceID)
mciSendCommand(mciOpenParms.wDeviceID,MCI_CLOSE,0,0);
return 2;
}BIN:
SRC:
这个实例只能用于播放文件,如果要用于播放内存中的MIDI文件,你需要额外的手段。
要编译源码你需要链接winmm.lib,这意味着编译出的程序依赖于winmm.dll运行。winmm是系统DLL,不过也不排除某些GHOST系统缺失这个DLL。 播放MIDI可以使用DirectX的专有套件:DirectMusic
页:
[1]