现在的位置: 首页 > 综合 > 正文

简单音乐播放器

2018年06月06日 ⁄ 综合 ⁄ 共 5513字 ⁄ 字号 评论关闭
 #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;
} 

抱歉!评论已关闭.