📄 sound.cpp
字号:
// AudioEngineSound.cpp: implementation of the CSound class.
//
//////////////////////////////////////////////////////////////////////
#include "Sound.h"
#include "AudioManager.h"
#include <sstream>
using namespace std;
namespace AudioEngine {
CSoundPtr::CSoundPtr(CSound* p) : CRefCountPtr<CSound>(p)
{
stringstream str;
if (p) {
str << "CSoundPtr::CSoundPtr: constructed for pointer " << p <<
" (count = " << itsCounter->count << ")..." << endl;
OutputDebugString(str.str().c_str());
}
}
void CSoundPtr::Release()
{
stringstream str;
if (itsCounter) {
str << "CSoundPtr::Release(): pointer " << itsCounter->ptr <<
" (count = " << itsCounter->count << ")..." << endl;
OutputDebugString(str.str().c_str());
}
}
CSound::CSound(CAudioManager *mgr)
{
m_Manager = mgr;
m_Segment = NULL;
m_OriginalData = NULL;
}
CSound::~CSound()
{
if (NULL != m_Segment && m_Manager->GetPerformance()) {
m_Segment->Unload(m_Manager->GetPerformance());
}
SAFE_RELEASE(m_Segment);
SAFE_DELETE(m_OriginalData);
}
/****************************************************************************
*
* CSound::IsPlaying: returns true if the sound is playing, false otherwise.
*
****************************************************************************/
bool CSound::IsPlaying()
{
if (NULL == m_Segment) return(false);
if (NULL == m_Manager) return(false);
return(m_Manager->GetPerformance()->IsPlaying(m_Segment, NULL) == S_OK);
}
/****************************************************************************
*
* CSound::IsPlaying: Plays a sound. Returns true if the sound plays.
*
****************************************************************************/
bool CSound::Play(CSoundInstance *newinst)
{
HRESULT hr;
if (NULL == m_Segment || NULL == m_Manager) {
if (newinst) newinst->UnInit();
return(false);
}
static CSoundInstance dummy;
if (NULL == newinst) newinst = &dummy;
IDirectMusicPerformance8 *perf = m_Manager->GetPerformance();
IDirectMusicAudioPath8 * pPath = NULL;
IUnknown *pConfig;
if (SUCCEEDED(m_Segment->GetAudioPathConfig(&pConfig)))
{
// this has an embedded audio path configuration
hr = perf->CreateAudioPath(pConfig, TRUE, &pPath);
pConfig->Release();
ThrowIfFailed(hr, "CSound::Play: Couldn't create audiopath using embedded config.");
}
else {
// no config... make our own!
hr = perf->CreateStandardAudioPath(DMUS_APATH_DYNAMIC_STEREO, CAudioManager::NUMCHANNELS, TRUE, &pPath);
ThrowIfFailed(hr, "CSound::Play: Couldn't create standard audiopath.");
}
m_Segment->Download(perf);
// initialize the sound instance (set volume, etc.)
// this will also set it playing.
newinst->Init(this, pPath);
return(true);
}
bool CSound::Stop(MUSIC_TIME time, DWORD flags)
{
return(SUCCEEDED(m_Manager->GetPerformance()->Stop(m_Segment, NULL, time, flags)));
}
}; // namespace
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -