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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章