《一个支持所有媒体类型与循环播放的类》由会员分享,可在线阅读,更多相关《一个支持所有媒体类型与循环播放的类(7页珍藏版)》请在金锄头文库上搜索。
1、*/#ifndef _MIDI_H_#define _MIDI_H_#include class CMidipublic:bool Play();/播放初始化函数(打开设备并初始化)CMidi();CMidi();public:void OnTimer();/循环播放函数bool InitPath();/初始化路径,取得播放曲目列表文件的全路径bool OpenFiles();/打开文件对话框,获取歌曲列表bool OpenList();/读取文件中的歌曲列表bool SaveList();/保存列表void Per();/上一首void Next();/下一首void Stop();/停止函
2、数,在播放以前先停止DWORD getinfo(DWORD item);/获取歌曲长度信息DWORD m_count;DWORD cdlen,cdfrom,cdto;int m_totalFiles;/保存歌曲的首数int fr;/当前已播放的歌曲数CString m_FileList256;/歌曲路径列表数组CString m_MusicFilePath;/保存歌曲列表文件的路径bool PlayingFalg;/正在播放标志,以便定时器判断;#endif/以下为MIDI.cpp文件/ Midi.cpp#include stdafx.h#include Midi.hCMidi:CMidi()
3、m_totalFiles=0;fr=0;cdfrom=0;m_MusicFilePath=;PlayingFalg=false;CMidi:CMidi()/-播放-bool CMidi:Play()if(m_FileListfr=)/如果读取路径为空,则弹出打开对话框OpenFiles();else PlayingFalg=true;/标志为正在播放MCI_OPEN_PARMS mciopenparms;/打开MCI_PLAY_PARMS mciplayparms;/播放/以下用fr做下标,能在停止再播放时恢复上次的位置mciopenparms.lpstrElementName=m_FileL
4、istfr;/播放路径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
5、(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);/发送播放消息return true;/-获取歌曲信息(长度,已播放长度)-DWORD CMidi:getinfo(DWORD item)MCI_
6、STATUS_PARMS mcistatusparms;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);return mcistatus
7、parms.dwReturn;/-停止-void CMidi:Stop()PlayingFalg=false;/关闭正在播放标志cdfrom=MCI_MAKE_HMS(0,0,0);/播放位置归文件开头mciSendCommand(m_count,MCI_CLOSE,0,NULL);/发出关闭消息m_count=0;/-下一首-void CMidi:Next()fr+;if(fr=m_totalFiles)/让fr指向下一个音乐文件,fr是从0下标开始/m_totalFiles为总文件数fr=fr%m_totalFiles;Stop();Play();/-上一首-void CMidi:Per(
8、)fr-;if(fr=-1)/指向最后一首歌,但fr是从0下标开始的,而m_totalFiles是从1开始fr=m_totalFiles-1;Stop();Play();/播放fr指向的位置/-保存曲目列表-bool CMidi:SaveList()CFile fileList;/文件对象if(!fileList.Open(m_MusicFilePath,CFile:modeCreate|CFile:modeWrite)return FALSE;/打开文件,不存在则创建,写文件char fileName256;for(int i=0;iM_TOTALFILES;I+)/m_totalFiles
9、为打开对话框中获取的歌曲总数strcpy(fileName,m_FileListi);/取出一条曲目路径fileList.Write(fileName,strlen(fileName);/写入文件fileList.Write(rn,2);/写入一行结束和换行符fileList.Write(-,4);/写入文件最后标志fileList.Close();/关闭文件return TRUE;/-读取曲目路径列表-bool CMidi:OpenList()CFile fileList;if(!fileList.Open(m_MusicFilePath,CFile:modeNoTruncate|CFile
10、:modeRead)return FALSE;/以只读模式打开,不覆盖原有文件,m_MusicFilePath为列表文件的路径char ch;while(1)CString fileName;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; /下面这句把路径
11、加入列表中,用字符串数组代替/m_totalFiles前面已经加一了,所以这儿要少一个m_FileListm_totalFiles-1=fileName;fileList.Close();return TRUE;/-打开对话框,获取曲目列表-bool CMidi:OpenFiles()CFileDialog f(true);/打开对话框对象f.m_ofn.Flags |=512;/OFN_ALLOWMULTISELECT;目录列表方式f.m_ofn.lpstrFilter=所有媒体类型0*.*00; if(f.DoModal()!=IDOK)return FALSE;/用户单击了“取消”POSITION pos=f.GetStartPosition();/获取第一个文件位置int i=0;while(pos)m_FileListi=f.GetNextPathName(pos);/读取文件到曲目路径列表i+;m_totalFiles=i;/保存曲目总数Stop();Play();/播放打开的文件return TRUE;/-获得播放列表文件的路径-bool CMidi:InitPath()/初始化路径,取得播放曲目列表文件的全路径