版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
*/
///////////////////////////////////////////////////////////////////////
#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#include"stdafx.h"
#include"Midi.h"CMidi::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;i<M_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_ALLOWMULTISELECT;目录列表方式
f.m_ofn.lpstrFilter="所有媒体类型\0*.*\0\0";
if(f.DoModal()!=IDOK)
returnFALSE;//用户单击了“取消”
POSITIONpos=f.GetStartPosition();//获取第一个文件位置
inti=0;
while(pos)
{
m_FileList[i]=f.GetNextPathName(pos);//读取文件到曲目路径列表
i++;
}
m_totalFiles=i;//保存曲目总数
Stop();
Play();//播放打开的文件
returnTRUE;
}//-------------------获得播放列表文件的路径------------
boolCMidi::InitPath()
{//初始化路径,取得播放曲目列表文件的全路径
TCHARpath[256];//保存文件路径
GetModuleFileName(NULL,path,sizeof(path));//获取当前程序路径
TCHAR*p=_tcsrchr(path,_T('\\'));//查找最后一个'\\'字符
if(p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 规划馆灯光系统施工方案及技术措施
- 水库大坝趾板施工方案及技术措施
- 2025-2026学年三峡教学设计施美婧
- 4.3 光的干涉教学设计高中物理沪教版2019选择性必修第一册-沪教版2019
- 5.2.2导数的四则运算法则教学设计-高二下学期数学人教A版(2019)选择性必修第二册
- 4.4国际合作教学设计 高中地理人教版(2019)选择性必修2
- 学校艾滋病自查报告(3篇)
- 2013年7月国家开放大学法学本科《商法》期末纸质考试试题及答案
- 焊接企业检修员运行操作安全操作规程
- 工厂印刷火灾应急演练脚本
- 2026年浙江省宁波市重点学校高一入学数学分班考试试题及答案
- 2025-2026学年上海宝山区八年级下学期期末数学试卷及答案
- 2026杭州市市级机关事业单位招聘编外人员综合基础知识和综合应用试题附答案
- 2026云南临沧市乡村产业发展集团有限公司招聘工作人员13人考试备考题库及答案详解
- 2026及未来5年中国流动住房市场数据分析及竞争策略研究报告
- 2026年秋季新教材统编版九年级上册道德与法治全册知识点背诵提纲精简版
- 每月(质量)安全调度会议纪要
- 河北英语中考考试说明词汇
- 叙事护理-解构
- 角膜内皮细胞仪说明书
- 沪粤版八年级物理上册单元测试题全套
评论
0/150
提交评论