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