⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 klmusic.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
字号:
#include "klmusic.h"
#define CHECKERR(x) {if(FAILED(hr)){MessageBox(GetActiveWindow(),x,"ERROR",MB_OK);return false;}}
#define SAFE_RELEASE(x) {if(x){x->Release();x=NULL;}}
KGDMusic::KGDMusic()
{
	m_pLoader=NULL;
	m_pSeg=NULL;
	m_pPerf=NULL;
	m_lPauseTime=0;
}
KGDMusic::~KGDMusic()
{
	Release();
}
void KGDMusic::Release()
{
	if(m_pPerf)
	{
		m_pPerf->CloseDown();
	}
	SAFE_RELEASE(m_pSeg);
	SAFE_RELEASE(m_pPerf);
	SAFE_RELEASE(m_pLoader);
}
BOOL KGDMusic::InitDirectMusic(HWND hWnd)
{
	HRESULT hr=CoInitialize(NULL);
	CHECKERR("CoInitalize");
	hr=CoCreateInstance(CLSID_DirectMusicLoader,	//组件的GUID
					NULL,							//不是创建集合
					CLSCTX_INPROC,					//创建的环境
					IID_IDirectMusicLoader8,		//接口的GUID
					(void**)&m_pLoader);			//被创建的接口指针
	CHECKERR("CoCreate pLoader");
	hr=CoCreateInstance(CLSID_DirectMusicPerformance,	//组件的GUID
					NULL,								//不是创建集合
					CLSCTX_INPROC,						//创建的环境
					IID_IDirectMusicPerformance8,		//接口的GUID
					(void**)&m_pPerf);					//被创建的接口指针
	CHECKERR("CoCreate pPerf");
	hr=m_pPerf->InitAudio( 
					NULL,							//DirectMusic对象的指针,因为不需要我们管理,所以让它自动进行
					NULL,							//DirectSound对象的指针,同上
					hWnd,							//窗口句柄
					DMUS_APATH_SHARED_STEREOPLUSREVERB,//声音通道(AudioPath)类型:立体声+混响
					64,								//音乐通道数
					DMUS_AUDIOF_ALL,				//声卡的所有特性
					NULL							// DMUS_AUDIOPARAMS对象的指针
					);
	CHECKERR("Init Audio");
	return true;
}
BOOL KGDMusic::LoadMusic(char*lpszMusic)
{
	if(NULL==m_pLoader)
		return false;
	SAFE_RELEASE(m_pSeg);
	WCHAR UnicodeFile[MAX_FILE_LENGTH];
	MultiByteToWideChar(
						CP_ACP,						//ASCII码
					    0,							// 
					    lpszMusic,					//要转换的ascii字符串
						-1,							//要转换的字节数,-1表示以'\0'结尾的字符串
						UnicodeFile,				//转换后UNICODE存放的地方
						MAX_FILE_LENGTH);
	if(FAILED(m_pLoader->LoadObjectFromFile(
       									 CLSID_DirectMusicSegment, //组件的GUID
   										 IID_IDirectMusicSegment8, //接口的GUID
  		 								 UnicodeFile,				//文件名,注意用Unicode
  		  								 (void**)&m_pSeg			//音乐要装到的段
										 )))
		return false;
	return true;
}
BOOL KGDMusic::Play(DWORD dwLoop)
{
	if(NULL==m_pSeg)
		return false;
	m_pSeg->SetRepeats(dwLoop);						//重复的次数,如果是DMUS_SEG_REPEAT_INFINITE则为无限
	m_pSeg->Download(m_pPerf);						//使用DLS,把MID数据转换成数字化的音乐数据
	m_pSeg->SetStartPoint(0);
	m_pPerf->PlaySegmentEx(m_pSeg, 
				NULL, 
				NULL, 
				DMUS_SEGF_REFTIME, 
				0, 
				NULL, 
				NULL, 
				NULL 
				);
	return true;
}
BOOL KGDMusic::Stop()
{
	if(NULL==m_pPerf)
		return false;
	m_pPerf->Stop(NULL,NULL,0,0);
	return true;
}
BOOL KGDMusic::Pause()
{
	if(NULL==m_pSeg)
		return false;
	m_pPerf->GetTime(NULL,&m_lPauseTime);
	m_pPerf->Stop(NULL,NULL,0,0);
	return true;
}

BOOL KGDMusic::Resume()
{
	if(NULL==m_pSeg)
		return false;
	m_pSeg->SetStartPoint(m_lPauseTime);
	m_pPerf->PlaySegment(m_pSeg,DMUS_SEGF_REFTIME,0,NULL);
	m_pSeg->SetStartPoint(0);
	return true;
}

BOOL KGDMusic::IsPlaying()
{
	if(NULL==m_pSeg)
		return false;
	if(S_OK==m_pPerf->IsPlaying(m_pSeg,NULL))
		return true;
	return false;
}

#undef CHECKERR

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -