// 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();//指向下一首
}