📄 audiomanager.cpp
字号:
// AudioManager.cpp: implementation of the CAudioManager class.
//
//////////////////////////////////////////////////////////////////////
#include "AudioManager.h"
namespace AudioEngine {
void CAudioManager::Init(HWND hwnd, bool stereo, int perfchannels)
{
HRESULT hr;
// initialize COM
hr = CoInitialize(NULL);
ThrowIfFailed(hr, "CAudioManager::Init: CoInitialize failed.");
// Create the loader
hr = CoCreateInstance(CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC,
IID_IDirectMusicLoader8, (void**)&m_Loader);
ThrowIfFailed(hr, "CAudioManager::Init: CoCreateInstance for loader failed.");
// Create performance object
hr = CoCreateInstance( CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC,
IID_IDirectMusicPerformance8, (void**)&m_Performance);
ThrowIfFailed(hr, "CAudioManager::Init: CoCreateInstance for performance failed.");
hr = m_Performance->InitAudio(NULL, NULL, hwnd, stereo ? DMUS_APATH_DYNAMIC_STEREO : DMUS_APATH_DYNAMIC_MONO,
perfchannels, DMUS_AUDIOF_ALL, NULL);
if (hr == DSERR_NODRIVER) {
// output a warning message, then continue as usual
MessageBox(hwnd, "The program could not locate your audio hardware. Make sure your driver supports DirectX 8.", "Audio Engine", MB_ICONSTOP);
return; // notice we didn't set m_InitGood true
}
else ThrowIfFailed(hr, "CAudioManager::Init: m_Performance->InitAudio failed.");
m_InitGood = true;
}
void CAudioManager::UnInit()
{
if(m_Performance != NULL) {
m_Performance->Stop( NULL, NULL, 0, 0 );
m_Performance->CloseDown();
SAFE_RELEASE( m_Performance );
}
SAFE_RELEASE( m_Loader );
m_InitGood = false;
}
CSoundPtr CAudioManager::LoadSound(const CWAVFile &wavfile)
{
unsigned char *savedata = wavfile.Save();
// when you load a wave from memory, DirectMusic owns the memory pointer...
// do NOT delete!
return(LoadSound(savedata, wavfile.GetTotalSize()));
}
CSoundPtr CAudioManager::LoadSound(unsigned char *data, int datalen)
{
HRESULT hr;
CSound *snd = new CSound(this);
DMUS_OBJECTDESC desc;
memset(&desc, 0, sizeof(DMUS_OBJECTDESC));
desc.dwSize = sizeof(DMUS_OBJECTDESC);
desc.dwValidData = DMUS_OBJ_MEMORY | DMUS_OBJ_CLASS;
desc.guidClass = CLSID_DirectMusicSegment;
desc.llMemLength = datalen;
desc.pbMemData = data;
hr = m_Loader->GetObject(&desc, IID_IDirectMusicSegment8, (void **)&snd->m_Segment);
ThrowIfFailed(hr, "CAudioManager::LoadSound(unsigned char *data): GetObject failed.");
snd->m_OriginalData = data;
return(CSoundPtr(snd));
}
CSoundPtr CAudioManager::LoadSound(HMODULE hmod, char *type, WORD resID)
{
CSound *snd = new CSound(this);
HRESULT hr;
DMUS_OBJECTDESC ObjDesc;
HRSRC hFound = FindResource(hmod, MAKEINTRESOURCE(resID), type);
if (NULL == hFound) {
Throw("CAudioManager::LoadSoundFromResource: couldn't find resource!");
}
HGLOBAL hRes = LoadResource(hmod, hFound);
ObjDesc.dwSize = sizeof(DMUS_OBJECTDESC);
ObjDesc.guidClass = CLSID_DirectMusicSegment;
ObjDesc.dwValidData = DMUS_OBJ_CLASS | DMUS_OBJ_MEMORY;
ObjDesc.pbMemData = (BYTE *) LockResource(hRes);
ObjDesc.llMemLength = SizeofResource(hmod, hFound);
hr = m_Loader->GetObject(&ObjDesc, IID_IDirectMusicSegment8,
(void**) &snd->m_Segment);
ThrowIfFailed(hr, "CAudioManager::LoadSoundFromResource(HMODULE hmod, WORD resID): GetObject failed.");
return(CSoundPtr(snd));
}
void CAudioManager::SetSearchDirectory(std::string dirname)
{
}
CSoundPtr CAudioManager::LoadSound(std::string filename)
{
HRESULT hr;
CSound *snd = new CSound(this);
// convert filename to wide-string
WCHAR widefilename[MAX_PATH];
DXUtil_ConvertGenericStringToWideCch( widefilename, filename.c_str(), MAX_PATH);
// tell loader to load this file
hr = m_Loader->LoadObjectFromFile(
CLSID_DirectMusicSegment,
IID_IDirectMusicSegment8,
widefilename,
(void**) &snd->m_Segment);
ThrowIfFailed(hr, "CAudioManager::LoadSound(std::string filename): LoadObjectFromFile failed.");
return(CSoundPtr(snd));
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CAudioManager::CAudioManager()
{
m_InitGood = false;
m_Performance = NULL;
m_Loader = NULL;
}
CAudioManager::~CAudioManager()
{
}
}; // namespace
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -