#pragma once #include <mmsystem.h> #include <Digitalv.h> #pragma comment(lib, "winmm.lib") #define MCI_ERROR 0xFFFFFFFF #ifndef ERROR_SUCCESS #define ERROR_SUCCESS 0 #endif class CPlayer { public: CPlayer(void); ~CPlayer(void); private: DWORD m_dwCallBack; //执行的结果 MCIDEVICEID m_mciDeviceID; //播放的ID private: MCIERROR OpenFileA(LPCSTR); public: MCIERROR OpenFile(LPCTSTR); MCIERROR Close(); MCIERROR PlayA(LPCSTR); MCIERROR Play(LPCTSTR); MCIERROR Play(DWORD dwFrom=MCI_ERROR, DWORD dwTo=MCI_ERROR); //默认值是从当前位置到末尾 MCIERROR Pause(); MCIERROR Seek(DWORD dwTo); //毫秒为单位//Seek之后,播放会停止. MCIERROR Seek(DWORD dwHr,DWORD dwMn,DWORD dwSc,DWORD dwMl=0); //时分秒毫秒//Seek之后,播放会停止. MCIERROR Stop(); DWORD GetVolume()const; MCIERROR AddVolume(int dwVol); //dwVol为负表示减小音量 MCIERROR SetVolume(DWORD dwVol); //0-1000 DWORD GetMusicTimeLength()const;//返回毫秒数 DWORD GetPlayStatus()const; }; #include "StdAfx.h" #include "Player.h" CPlayer::CPlayer(void) { m_mciDeviceID = MCI_ERROR; m_dwCallBack = 0; } CPlayer::~CPlayer(void) { Close(); } //打开的文件夹路径 MCIERROR CPlayer::OpenFileA(LPCSTR _szStr) { if(0==_szStr) return MCIERR_INVALID_DEVICE_ID;//Invalid device ID. MCIERROR mciERR = ERROR_SUCCESS; MCI_OPEN_PARMSA mciOpen = {0}; mciOpen.lpstrDeviceType = NULL; //文件设备ID mciOpen.lpstrElementName = _szStr; //存放路径 mciOpen.dwCallback = m_dwCallBack; mciERR = Close(); if(mciERR) return mciERR; mciERR = mciSendCommandA( NULL, MCI_OPEN, MCI_NOTIFY|MCI_OPEN_ELEMENT, (DWORD)&mciOpen); if (mciERR == ERROR_SUCCESS) { m_mciDeviceID = mciOpen.wDeviceID; { MCI_SET_PARMS mciOpen = {0}; mciOpen.dwCallback = m_dwCallBack; mciOpen.dwTimeFormat = MCI_FORMAT_MILLISECONDS; DWORD dw = mciSendCommandA( m_mciDeviceID, MCI_SET, MCI_NOTIFY|MCI_SET_TIME_FORMAT, (DWORD)&mciOpen); } } return mciERR; } MCIERROR CPlayer::OpenFile(LPCTSTR _szStr) { return OpenFileA(_szStr); } MCIERROR CPlayer::PlayA(LPCSTR _szStr) { MCIERROR mciErr=this->OpenFileA(_szStr); if(mciErr) return mciErr; mciErr=this->Play(); return mciErr; } MCIERROR CPlayer::Play(LPCTSTR _szStr) { return this->PlayA(_szStr); } /* Func:播放 */ MCIERROR CPlayer::Play(DWORD dwFrom, DWORD dwTo) { if(MCI_ERROR == m_mciDeviceID) return MCIERR_INVALID_DEVICE_ID;//Invalid device ID. if(GetPlayStatus() == MCI_MODE_PLAY) return ERROR_SUCCESS; MCIERROR mciERR = ERROR_SUCCESS; MCI_PLAY_PARMS mciPlay = {0}; DWORD dwFlag = MCI_NOTIFY; mciPlay.dwFrom = dwFrom; mciPlay.dwTo = dwTo; mciPlay.dwCallback = m_dwCallBack; if (dwFrom != MCI_ERROR) dwFlag |= MCI_FROM; if (dwTo != MCI_ERROR) dwFlag |= MCI_TO; mciERR = mciSendCommand( m_mciDeviceID, MCI_PLAY, dwFlag, (DWORD)&mciPlay); return mciERR; } //暂停播放 MCIERROR CPlayer::Pause() { if(MCI_ERROR == m_mciDeviceID) return MCIERR_INVALID_DEVICE_ID;//Invalid device ID. MCIERROR mciERR = ERROR_SUCCESS; MCI_GENERIC_PARMS mciPause= {0}; mciPause.dwCallback = m_dwCallBack; mciERR = mciSendCommand( m_mciDeviceID, MCI_PAUSE, MCI_NOTIFY, (DWORD)&mciPause); return mciERR; } //停止播放 MCIERROR CPlayer::Stop() { if(MCI_ERROR == m_mciDeviceID) return MCIERR_INVALID_DEVICE_ID;//Invalid device ID. MCIERROR mciERR = ERROR_SUCCESS; MCI_GENERIC_PARMS mciStop = {0}; mciStop.dwCallback = m_dwCallBack; mciERR = mciSendCommand( m_mciDeviceID, MCI_STOP, MCI_NOTIFY, (DWORD)&mciStop); mciERR = mciSendCommand( m_mciDeviceID, MCI_SEEK, MCI_SEEK_TO_START, (DWORD)&mciStop); return mciERR; } /* Func:取得音量 */ DWORD CPlayer::GetVolume()const { if(MCI_ERROR==m_mciDeviceID) return 0;//Invalid device ID. MCI_STATUS_PARMS mciGetVolume = {0}; mciGetVolume.dwCallback = m_dwCallBack; mciGetVolume.dwItem = MCI_DGV_STATUS_VOLUME; mciSendCommand( m_mciDeviceID, MCI_STATUS, MCI_NOTIFY|MCI_STATUS_ITEM, (DWORD)&mciGetVolume); return mciGetVolume.dwReturn; } /* Func:增加音量,dwVol为负表示减小音量 */ MCIERROR CPlayer::AddVolume(int dwVol) { int newVol=(int)GetVolume()+dwVol; if(newVol<0) newVol=0; return SetVolume(newVol); } /* Func:设置音量 */ MCIERROR CPlayer::SetVolume(DWORD dwVol) { //ASSERT_TRUE(m_mci_DID); if(MCI_ERROR == m_mciDeviceID) return MCIERR_INVALID_DEVICE_ID;//Invalid device ID. MCIERROR mciERR = ERROR_SUCCESS; MCI_DGV_SETAUDIO_PARMS mciSetVolume = {0}; if(dwVol<0) dwVol=0; if(dwVol>1000) dwVol=1000; mciSetVolume.dwCallback = m_dwCallBack; mciSetVolume.dwItem = MCI_DGV_SETAUDIO_VOLUME; mciSetVolume.dwValue = dwVol; mciERR = mciSendCommand( m_mciDeviceID, MCI_SETAUDIO, MCI_NOTIFY|MCI_DGV_SETAUDIO_ITEM|MCI_DGV_SETAUDIO_VALUE, (DWORD)&mciSetVolume); return mciERR; } /* Func:关闭 */ MCIERROR CPlayer::Close() { if(m_mciDeviceID != MCI_ERROR) { MCIERROR mciERR = ERROR_SUCCESS; MCI_GENERIC_PARMS mciClose = {0}; mciClose.dwCallback = m_dwCallBack; mciERR = mciSendCommand( m_mciDeviceID, MCI_CLOSE, MCI_NOTIFY, (DWORD)&mciClose); if(0==mciERR) m_mciDeviceID = MCI_ERROR; return mciERR; } else { return ERROR_SUCCESS; } } /* Func:跳转 */ MCIERROR CPlayer::Seek(DWORD dwTo)//毫秒为单位//Seek之后,播放会停止. { if(MCI_ERROR == m_mciDeviceID) return MCIERR_INVALID_DEVICE_ID;//Invalid device ID. MCIERROR mciERR = ERROR_SUCCESS; MCI_SEEK_PARMS mciSeek = {0}; DWORD dwLen = GetMusicTimeLength(); if(dwTo>dwLen) dwTo = dwLen; mciSeek.dwCallback = m_dwCallBack; mciSeek.dwTo = dwTo; mciERR = mciSendCommand( m_mciDeviceID, MCI_SEEK, MCI_NOTIFY|MCI_TO, (DWORD)&mciSeek); return mciERR; } /* Func:按照时间跳转 */ MCIERROR CPlayer::Seek(DWORD dwHr,DWORD dwMn,DWORD dwSc,DWORD dwMl)//时分秒毫秒//Seek之后,播放会停止. { DWORD dwTo =dwHr*3600000+dwMn*60000+dwSc*1000+dwMl; return Seek(dwTo); } /* Func:获取音乐播放时间 */ DWORD CPlayer::GetMusicTimeLength()const { if(MCI_ERROR==m_mciDeviceID) return 0; MCI_STATUS_PARMS mciTimeLength = {0}; mciTimeLength.dwCallback = m_dwCallBack; mciTimeLength.dwItem = MCI_STATUS_LENGTH; mciSendCommand( m_mciDeviceID, MCI_STATUS, MCI_NOTIFY|MCI_STATUS_ITEM, (DWORD)&mciTimeLength); return mciTimeLength.dwReturn; } /* Func:获取播放状态 */ DWORD CPlayer::GetPlayStatus()const { if(MCI_ERROR==m_mciDeviceID) return MCI_MODE_NOT_READY;//Invalid device ID. MCI_STATUS_PARMS mciStatus = {0}; mciStatus.dwCallback = m_dwCallBack; mciStatus.dwItem = MCI_STATUS_MODE; mciSendCommand( m_mciDeviceID, MCI_STATUS, MCI_NOTIFY|MCI_STATUS_ITEM, (DWORD)&mciStatus); return mciStatus.dwReturn; }