一个支持所有媒体类型和循环播放的类

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

文章标题:一个支持所有媒体类型和循环播放的类原作者:鲁永军原出处:vczx.com发布者:鲁永军发布类型:原创发布日期:2005-03-11今日浏览:15总浏览:2815下载源代码//Midi.h///////////////////////////////////////////////////////////////////*这篇文章是我第一次在VC在线发表,我应该是只VC的菜鸟。为了找个能循环播放mp3的VC源程序,我搜遍了网上的资源(差点气得要砸电脑),好不容易找到一个,却只有程序中的调用,关键的类的生成文件却没有,有什么用?(主要是自己没有MCI函数的具体的参数资料,不知道怎么调用,如果你有,请发一份给我,字符串的我已经有了,命令方式的没有。)后来找到一个,非常感谢他,作者叫:黄利龙。但他没有单独把类分离出来,且没有保存列表到文件。我把他的程序打印出来,仔细分析了程序语句,然后进行了修改和优化。大家可以从下面的程序看出来,我们菜鸟的人基础不够,很希望了解每一句的确切意思,有些地方我带有猜测的,如果有错的地方,请大家指出,也欢迎大家来信和我交流,我向您学习。我的Email:lyj2008@lajy.com我修改的程序特点如下:1、把它分离出来单独构成一个类,便于以后所有程序的使用。2、提供了接口函数。3、支持所有的媒体类型4、能循环播放音乐5、能保存上次打开的文件。难免会有错,请大家可以不断完善它,然后把它贴出来,这样,以后有类似遭遇的不用这么辛苦了!CMidi类的使用方法:1、直接把MIDI.h和MIDI.cpp文件复制到你程序目录下,工程中加入这两个文件。2、单击“工程-设置-Link”,在“对象/库模块”中连接库winmm.lib3、在你工程的头文件中包含头文件,#includeMIDI.H4、在工程中定义一个CMidi类的对象,如:CMidim_Music;5、在工程的初始化文件中,初始化歌曲列表路径,m_Music.InitPath(),再打开列表,m_Misic.OpenList();下面就可以在各个对应的消息函数中处理它了如:播放:m_Misic.Play();停止:m_Misic.Stop();上一首:m_Misic.Per();下一首:m_Misic.Next();打开:m_Misic.OpenFiles();保存歌曲列表:m_Misic.SaveList();//保存列表我没有放在打开函数中,如果打开的文件比较多,那样会在打开过一会儿才能播放音乐,不舒服,你自己到工程的OnDestroy()中保存吧循环播放:m_Misic.OnTimer();//它需要在主程序中打开一个定时器,SetTimer(0,500,NULL);然后在主程序中重载OnTimer()函数,在该函数体内,先判断是否正在播放,m_Misic.PlayingFalg是否为真,真,则调用循环播放函数。如下:{if(m_Misic.PlayingFalg)m_Misic.OnTimer();}*////////////////////////////////////////////////////////////////////////#ifndef__MIDI_H__#define__MIDI_H__#includeclassCMidi{public:boolPlay();//播放初始化函数(打开设备并初始化)CMidi();~CMidi();public:voidOnTimer();//循环播放函数boolInitPath();//初始化路径,取得播放曲目列表文件的全路径boolOpenFiles();//打开文件对话框,获取歌曲列表boolOpenList();//读取文件中的歌曲列表boolSaveList();//保存列表voidPer();//上一首voidNext();//下一首voidStop();//停止函数,在播放以前先停止DWORDgetinfo(DWORDitem);//获取歌曲长度信息DWORDm_count;DWORDcdlen,cdfrom,cdto;intm_totalFiles;//保存歌曲的首数intfr;//当前已播放的歌曲数CStringm_FileList[256];//歌曲路径列表数组CStringm_MusicFilePath;//保存歌曲列表文件的路径boolPlayingFalg;//正在播放标志,以便定时器判断};#endif////////////////////////////////////////////////////////////////////以下为MIDI.cpp文件///////////////////////////////////////////////////////////////////Midi.cpp#includestdafx.h#includeMidi.hCMidi::CMidi(){m_totalFiles=0;fr=0;cdfrom=0;m_MusicFilePath=;PlayingFalg=false;}CMidi::~CMidi(){}//------------播放---------------------boolCMidi::Play(){if(m_FileList[fr]==){//如果读取路径为空,则弹出打开对话框OpenFiles();}else{PlayingFalg=true;//标志为正在播放MCI_OPEN_PARMSmciopenparms;//打开MCI_PLAY_PARMSmciplayparms;//播放//以下用fr做下标,能在停止再播放时恢复上次的位置mciopenparms.lpstrElementName=m_FileList[fr];//播放路径mciopenparms.lpstrDeviceType=NULL;//文件类型为NULL,就可以支持全部类型mciSendCommand(0,MCI_OPEN,MCI_DEVTYPE_WAVEFORM_AUDIO,(DWORD)(LPVOID)&mciopenparms);//向MCI设备发送命令消息m_count=mciopenparms.wDeviceID;mciplayparms.dwCallback=NULL;//窗口拥有者句柄cdlen=getinfo(MCI_STATUS_LENGTH);//得到曲目长度cdto=MCI_MAKE_HMS(MCI_HMS_HOUR(cdlen),MCI_HMS_MINUTE(cdlen),MCI_HMS_SECOND(cdlen));//根据长度计算出时、分、秒mciplayparms.dwFrom=MCI_MAKE_HMS(0,0,0);//表示从哪儿开始播放吧mciplayparms.dwTo=cdto;//表示放到哪儿为止mciSendCommand(m_count,MCI_PLAY,MCI_TO|MCI_FROM,(DWORD)(LPVOID)&mciplayparms);//发送播放消息}returntrue;}//---------------获取歌曲信息(长度,已播放长度)------DWORDCMidi::getinfo(DWORDitem){MCI_STATUS_PARMSmcistatusparms;mcistatusparms.dwCallback=NULL;/*//接受传入的命令参数,这是关键。命令参数如下:获取歌曲长度:MCI_STATUS_LENGTH获取当前已播放的长度:MCI_STATUS_POSITION*/mcistatusparms.dwItem=item;//接受命令参数的地方mcistatusparms.dwReturn=0;//返回值mciSendCommand(m_count,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)&mcistatusparms);returnmcistatusparms.dwReturn;}//-------------------停止-------------------voidCMidi::Stop(){PlayingFalg=false;//关闭正在播放标志cdfrom=MCI_MAKE_HMS(0,0,0);//播放位置归文件开头mciSendCommand(m_count,MCI_CLOSE,0,NULL);//发出关闭消息m_count=0;}//-------------------下一首----------------voidCMidi::Next(){fr++;if(fr=m_totalFiles){//让fr指向下一个音乐文件,fr是从0下标开始//m_totalFiles为总文件数fr=fr%m_totalFiles;}Stop();Play();}//----------上一首------------------voidCMidi::Per(){fr--;if(fr==-1){//指向最后一首歌,但fr是从0下标开始的,而m_totalFiles是从1开始fr=m_totalFiles-1;}Stop();Play();//播放fr指向的位置}//----------保存曲目列表-----------------boolCMidi::SaveList(){CFilefileList;//文件对象if(!fileList.Open(m_MusicFilePath,CFile::modeCreate|CFile::modeWrite))returnFALSE;//打开文件,不存在则创建,写文件charfileName[256];for(inti=0;iM_TOTALFILES;I++){//m_totalFiles为打开对话框中获取的歌曲总数strcpy(fileName,m_FileList[i]);//取出一条曲目路径fileList.Write(fileName,strlen(fileName));//写入文件fileList.Write(\r\n,2);//写入一行结束和换行符}fileList.Write(----,4);//写入文件最后标志fileList.Close();//关闭文件returnTRUE;}//----------读取曲目路径列表-----------------boolCMidi::OpenList(){CFilefileList;if(!fileList.Open(m_MusicFilePath,CFile::modeNoTruncate|CFile::modeRead))returnFALSE;//以只读模式打开,不覆盖原有文件,m_MusicFilePath为列表文件的路径charch;while(1){CStringfileName;fileList.Read(&ch,1);//读入一个字符if(ch=='-')break;//如文件是最后返回,-是文件最后的标志fileName+=ch;//否则存入while(1){//读入一行fileList.Read(&ch,1);if(ch=='\r'){//这儿可以判断是一行了m_totalFiles++;//曲目首数计数fileList.Read(&ch,1);break;}fileName+=ch;}//下面这句把路径加入列表中,用字符串数组代替//m_totalFiles前面已经加一了,所以这儿要少一个m_FileList[m_totalFiles-1]=fileName;}fileList.Close();returnTRUE;}//----------打开对话框,获取曲目列表-----------------boolCMidi::OpenFiles(){CFileDialogf(true);//打开对话框对象f.m_ofn.Flags|=512;//OFN_ALLOWMULTISELEC

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功