#pragma once
class CPlayer
{
public:
CPlayer();
~CPlayer();
public:
BOOL Open(LPCWSTR lpFileName);//打开文件
BOOL Play();//播放
BOOL Close();//关闭
BOOL Stop();//停止
BOOL Pause();//暂停
BOOL SetVolume(DWORD dSize);
BOOL SetPos(DWORD dwPos);
BOOL SetAudioOnOff(bool AudioOff);
BOOL SetSpeed(DWORD Speed);
DWORD GetLength(DWORD dwItem);//获取歌曲长度
BOOL GetError(LPTSTR pszText, UINT cchText);
void SetWindowHwnd(HWND hWnd);//设置主窗口句柄
private:
MCI_OPEN_PARMS m_ciOpen;//打开设备参数
HWND m_hWnd;//主窗口句柄
DWORD m_dwFrom;//播放起始点
MCIERROR m_dwError;
};
#include "stdafx.h"
#include "Player.h"
CPlayer::CPlayer()
: m_hWnd(nullptr)
, m_dwFrom(0)
, m_dwError(0)
{
ZeroMemory(&m_ciOpen,sizeof(MCI_OPEN_PARMS));
}
CPlayer::~CPlayer()
{
}
// 打开设备
BOOL CPlayer::Open(LPCTSTR lpFileName)
{
#ifdef _USER_MCI_COMMAND
if (m_ciOpen.wDeviceID)//如果有打开的MCI设备就关闭
Close();
m_ciOpen.lpstrDeviceType = NULL;
m_ciOpen.lpstrElementName = lpFileName;//播放文件路径
m_ciOpen.lpstrAlias = _T("MusicAlias");
if (mciSendCommand(0, MCI_OPEN, MCI_DEVTYPE_WAVEFORM_AUDIO, (DWORD)&m_ciOpen))//打开设备时,设备号为0
return FALSE;
m_dwFrom = MCI_MAKE_HMS(0, 0, 0);
return TRUE;
#else
TCHAR lpszShortPath[MAX_PATH] = { 0 };
GetShortPathName(lpFileName, lpszShortPath,sizeof (lpszShortPath));// 获得短路经
mciSendString(_T("Stop MusicAlias"), nullptr, 0, m_hWnd);
CDuiString lpstrCommand = _T("");
lpstrCommand.Format(_T("Open %s Alias MusicAlias"), lpszShortPath);// MusicAlias 是设备别名
return !(m_dwError = mciSendString(lpstrCommand.GetData(), nullptr, 0, m_hWnd));
#endif
}
// 播放音乐
BOOL CPlayer::Play()
{
#ifdef _USER_MCI_COMMAND
MCI_PLAY_PARMS mciplayparms;//播放参数结构
DWORD cdlen = GetLength(MCI_STATUS_LENGTH);//得到文件大小
DWORD cdto = MCI_MAKE_HMS(MCI_HMS_HOUR(cdlen), MCI_HMS_MINUTE(cdlen), MCI_HMS_SECOND(cdlen));//把文件中读出的大小转换为时间数量
mciplayparms.dwCallback = NULL;
mciplayparms.dwFrom = m_dwFrom;//设置起始位置
mciplayparms.dwTo = cdto;//设置终止位置
if (m_ciOpen.wDeviceID != 0)//判断是否打开文件
return !(m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_PLAY, MCI_TO | MCI_FROM, (DWORD)(LPVOID)&mciplayparms));
#else
return !(m_dwError = mciSendString(_T("Play MusicAlias"), nullptr, 0, m_hWnd));
#endif
}
// 执行MCI_CLOSE操作,关闭MCI设备
BOOL CPlayer::Close()
{
#ifdef _USER_MCI_COMMAND
if (m_ciOpen.wDeviceID)
return !(m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_CLOSE, 0, 0));
#else
return !(m_dwError = mciSendString(_T("Close MusicAlias"), nullptr, 0, m_hWnd));
#endif
}
// 执行MCI_STOP操作,停止播放音乐
BOOL CPlayer::Stop()
{
#ifdef _USER_MCI_COMMAND
if (m_ciOpen.wDeviceID)
{
if( 0 == mciSendCommand(m_ciOpen.wDeviceID, MCI_STOP, 0, 0) )
return !(m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0));//把播放位置设定为音乐文件的开头(下一次播放操作从文件开头位置开始)
}
m_dwFrom = MCI_MAKE_HMS(0, 0, 0);
#else
return !(m_dwError = mciSendString(_T("Stop MusicAlias"), nullptr, 0, m_hWnd));
#endif
}
// 执行MCI_PAUSE操作,暂停播放音乐
BOOL CPlayer::Pause()
{
#ifdef _USER_MCI_COMMAND
if (m_ciOpen.wDeviceID)
{
DWORD dwsf = GetLength(MCI_STATUS_POSITION);
m_dwFrom = MCI_MAKE_MSF(MCI_MSF_MINUTE(dwsf), MCI_MSF_SECOND(dwsf), MCI_MSF_FRAME(dwsf));
return !(m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_PAUSE, 0, 0));
}
#else
return !(m_dwError = mciSendString(_T("Pause MusicAlias"), nullptr, 0, m_hWnd));
#endif
}
// 得到当前文件状态
DWORD CPlayer::GetLength(DWORD dwItem)
{
#ifdef _USER_MCI_COMMAND
MCI_STATUS_PARMS mcistatusparms;
mcistatusparms.dwCallback = (DWORD)m_hWnd;
mcistatusparms.dwItem = dwItem;
mcistatusparms.dwReturn = 0;
m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&mcistatusparms);
return mcistatusparms.dwReturn;
#else
TCHAR sPosition[256];
DWORD lLength;
if(MCI_STATUS_LENGTH == dwItem)
mciSendString(_T("Status MusicAlias length"), sPosition, 255, m_hWnd);
else if(MCI_STATUS_POSITION == dwItem)
mciSendString(_T("Status MusicAlias position"), sPosition, 255, m_hWnd);
lLength = _tcstol(sPosition, nullptr, 10);
return lLength;// 单位是毫秒 mm
#endif
}
void CPlayer::SetWindowHwnd(HWND hWnd)
{
m_hWnd = hWnd;
}
// 设置音量 0-1000
BOOL CPlayer::SetVolume(DWORD dSize)
{
#ifdef _USER_MCI_COMMAND
#else
CDuiString lpstrCommand = _T("");
lpstrCommand.Format(_T("setaudio MusicAlias volume to %ld"), dSize);
return !(m_dwError = mciSendString(lpstrCommand.GetData(), nullptr, 0, m_hWnd));
#endif
}
// 设置进度 单位是毫秒 mm
BOOL CPlayer::SetPos(DWORD dwPos)
{
#ifdef _USER_MCI_COMMAND
#else
CDuiString lpstrCommand;
lpstrCommand.Format(_T("seek MusicAlias to %ld"), dwPos);
return !(m_dwError = mciSendString(lpstrCommand.GetData(), nullptr, 0, m_hWnd));
#endif
}
// 静音True为静音,FALSE为取消静音
BOOL CPlayer::SetAudioOnOff(bool AudioOff)
{
#ifdef _USER_MCI_COMMAND
#else
if (AudioOff)
return !(m_dwError = mciSendString(_T("setaudio MusicAlias off"), nullptr, 0, m_hWnd));
else
return !(m_dwError = mciSendString(_T("setaudio MusicAlias on"), nullptr, 0, m_hWnd));
#endif
}
// 设置播放速度1-2000
BOOL CPlayer::SetSpeed(DWORD Speed)
{
#ifdef _USER_MCI_COMMAND
#else
CDuiString lpstrCommand;
lpstrCommand.Format(_T("set MusicAlias speed %ld"), Speed);
return !(m_dwError = mciSendString(lpstrCommand.GetData(), nullptr, 0, m_hWnd));
#endif
}
// 获得错误描述
BOOL CPlayer::GetError(LPTSTR pszText, UINT cchText)
{
return mciGetErrorString(m_dwError, pszText, cchText);
}