MCI封装

// Media.h   封装了MCI,封装为类以便重用
#ifndef __MEDIA_H__
#define __MEDIA_H__

#include <mmsystem.h>

class CMedia
{
public:
CMedia();
~CMedia();
public:
bool InitPath(); //初始化路径,取得播放列表中文件的全路径
bool OpenFiles(); //打开CFileDialog,获取歌曲列表
bool OpenList(); //读取文件中的歌曲列表
bool SaveList(); //保存列表

bool Play(); //播放(打开设备并初始化)
void Pause();                //暂停
void Continue();             //继续 
void Stop();                 //停止
void Previous();             //上一首
void Next();                 //下一首
void SpeedForward();         //上一首
void SpeedBackward();        //下一首
void OnTimer(); //循环播放

DWORD Getinfo(DWORD item);   //获取媒体文件信息(播放时间,已播放时间等)
DWORD m_count;               //当前播放的媒体在列表中的位置
DWORD ItemLength,ItemFrom,ItemTo,ItemNow;    //播放总时间,起始时间,结束时间,当前已播放时间
int   iSelected; //保存媒体文件数
int   iPlayed; //当前已播放的媒体文件数
CString m_FileList[256]; //媒体文件路径列表数组
CString m_MusicFilePath; //保存媒体列表文件的路径
bool PlayingFalg; //标志,是否正在播放
};

#endif


Media.cpp

// Media.cpp

#include "stdafx.h"
#include "Media.h"

CMedia::CMedia()
{
iSelected=0;
iPlayed=0;
ItemFrom=0;
m_MusicFilePath="";
PlayingFalg=false;

}

CMedia::~CMedia()
{
}

//----获取信息---------------------------------
DWORD CMedia::Getinfo(DWORD item)  //根据参数获取媒体文件信息
{/* //接受传入的命令参数,命令参数如下:
   MCI_STATUS_LENGTH获取总播放时间,MCI_STATUS_POSITION获取当前已播放时间:
 */
MCI_STATUS_PARMS mcistatusparms;    
mcistatusparms.dwCallback=NULL;   
mcistatusparms.dwItem=item;            
mcistatusparms.dwReturn=0;              //返回值初始化
mciSendCommand(m_count,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)&mcistatusparms);
return mcistatusparms.dwReturn;
}

//--播放---------------------------------------
bool CMedia::Play()
{
PlayingFalg=TRUE;  //置播放标志
MCI_OPEN_PARMS mciopenparms;  //打开
MCI_PLAY_PARMS mciplayparms;  //播放
mciopenparms.lpstrElementName=m_FileList[iPlayed];    //播放路径
mciopenparms.lpstrDeviceType=NULL;                    //NULL为各种类型
mciSendCommand(0,MCI_OPEN,MCI_DEVTYPE_WAVEFORM_AUDIO,
(DWORD)(LPVOID)&mciopenparms);                    //向MCI设备发送命令消息

m_count=mciopenparms.wDeviceID;
mciplayparms.dwCallback=NULL;                         //窗口拥有者句柄

ItemLength=Getinfo(MCI_STATUS_LENGTH);                //得到播放长度                                                                                                                                                                                                                                        
ItemTo=MCI_MAKE_HMS(MCI_HMS_HOUR(ItemLength),
         MCI_HMS_MINUTE(ItemLength),
 MCI_HMS_SECOND(ItemLength));        //根据长度计算出时、分、秒
mciplayparms.dwFrom=MCI_MAKE_HMS(0,0,0);              //播放起点
mciplayparms.dwTo=ItemTo;                             //播放终点
mciSendCommand(m_count,MCI_PLAY,MCI_TO|MCI_FROM,
(DWORD)(LPVOID)& mciplayparms);  //发送播放命令消息
return true;
}
//--暂停------------------------------------
void CMedia::Pause()
{
PlayingFalg=false;
mciSendCommand(m_count,MCI_PAUSE,0,NULL); //发送暂停命令消息
}
//--继续------------------------------------
void CMedia::Continue()
{
PlayingFalg=true;
mciSendCommand(m_count,MCI_RESUME,0,NULL); //发送播放命令消息
}

//-------------------停止-------------------
void CMedia::Stop()
{
PlayingFalg=false; //关闭正在播放标志
ItemFrom=MCI_MAKE_HMS(0,0,0); //播放位置归文件开头
mciSendCommand(m_count,MCI_CLOSE,0,NULL); //发出关闭消息
m_count=0;
}
//----------上一首------------------
void CMedia::Previous()
{
iPlayed--;
if(iPlayed==-1) //若以后退到头,则指向最后一个,iPlayed是从0开始,iSelected从1开始
iPlayed=iSelected-1;
Stop();         
Play();         //播放

}
//-------------------下一首----------------
void CMedia::Next()
{
iPlayed++;
if(iPlayed>=iSelected) //让iPlayed指向下一文件,iPlayed由0开始,iSelected为总文件数
iPlayed=iPlayed%iSelected;
Stop();
Play();
}
//-------------------快进-------------------
void CMedia::SpeedForward()
{
MCI_PLAY_PARMS mciplayparms;            //播放
ItemNow=Getinfo(MCI_STATUS_POSITION);   //获取当前播放位置
if(ItemNow+ItemLength/15 < ItemTo)
mciplayparms.dwFrom=ItemNow + ItemLength/15; //改变播放起点
else
mciplayparms.dwFrom=ItemTo;
mciplayparms.dwTo=ItemTo;               //播放终点
mciSendCommand(m_count,MCI_PLAY,MCI_TO|MCI_FROM,(DWORD)(LPVOID)& mciplayparms);  //发送播放消息
}
//-------------------快退-------------------
void CMedia::SpeedBackward()
{
MCI_PLAY_PARMS mciplayparms;            //播放
ItemNow=Getinfo(MCI_STATUS_POSITION);   //获取当前播放位置 
long pos=ItemNow-ItemLength/15;
if(pos>(long)ItemFrom)
mciplayparms.dwFrom=pos;            //改变播放起点
else
mciplayparms.dwFrom=ItemFrom;
mciplayparms.dwTo=ItemTo;               //播放终点
mciSendCommand(m_count,MCI_PLAY,MCI_TO|MCI_FROM,(DWORD)(LPVOID)& mciplayparms);  //发送播放消息
}

//----------保存曲目列表-----------------
bool CMedia::SaveList()
{
CFile fileList; //文件对象
if(!fileList.Open(m_MusicFilePath,CFile::modeCreate|CFile::modeWrite))
return FALSE; //打开文件,不存在则创建,写文件
char filePathAndName[256];
for(int i=0;i<iSelected;i++)//iSelected为选中的歌曲总数
{
strcpy(filePathAndName,m_FileList[i]);  //取出一条曲目路径
fileList.Write(filePathAndName,strlen(filePathAndName));//写入文件
fileList.Write("\r\n",2);  //写入一行结束和换行符
}
fileList.Write("----",4);                     //写入文件最后标志
fileList.Close();                             //关闭文件
return TRUE;

}

//----------读取曲目路径列表-----------------
bool CMedia::OpenList()
{
CFile fileList;
if(!fileList.Open(m_MusicFilePath,CFile::modeNoTruncate|CFile::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')     //判断是否一行
{
iSelected++; //曲目首数计数
fileList.Read(&ch,1);
break;
}
fileName+=ch;
}
        //将路径加入列表,用字符串数组代替
m_FileList[iSelected-1]=fileName;
}
fileList.Close();
return TRUE;
}

//----打开对话框,获取曲目列表-----------------------
bool CMedia::OpenFiles()
{
CFileDialog dlgFile(true);                         //打开对话框对象
dlgFile.m_ofn.Flags |= OFN_ALLOWMULTISELECT;       //目录列表方式
dlgFile.m_ofn.lpstrFilter="所有媒体类型\0*.*\0\0";

if(dlgFile.DoModal()!=IDOK)
return FALSE;                                  
POSITION pos=dlgFile.GetStartPosition();           //获取第一个文件位置
int i=0;
while(pos)
{
m_FileList[i]=dlgFile.GetNextPathName(pos);    //读取文件到曲目路径列表
i++;
}
iSelected=i;  //保存选中的媒体文件总数
Stop();
Play();               //播放打开的文件
return TRUE;
}

//---获得播放列表文件的路径----------------------------
bool CMedia::InitPath()
{   //初始化路径,取得播放曲目列表文件的全路径
TCHAR path[256];//保存文件路径
GetModuleFileName(NULL,path,sizeof(path)) ;    //获取当前程序路径
TCHAR * p = _tcsrchr(path,_T('\\')) ;          //查找最后一个'\\'字符
if(p) lstrcpy(p,_T("\\MPlayer.mdr"));        //替换为完整路径
m_MusicFilePath=path;                          //保存到路径变量中,用于打开列表文件
return true;
}

//--循环播放--------------------------------------
void CMedia::OnTimer()
if(Getinfo(MCI_STATUS_POSITION)==ItemLength)   //若已经播放完毕
Next();//指向下一首
}

 

你可能感兴趣的:(封装,include,public,void,歌曲列表)