📄 klmusic.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 + -