📄 soundengine.cpp
字号:
iterator it = find(inSourceToken); if (it != end()) erase(it); } SoundEngineEffect* GetEffectByIndex(UInt32 inIndex) { iterator it = begin(); for (UInt32 i = 0; i < inIndex; i++) { if (it != end()) ++it; else i = inIndex; } if (it != end()) return ((*it).second); return (NULL); } iterator GetIterator() { return begin(); } UInt32 Size () const { return size(); } bool Empty () const { return empty(); }};#pragma mark ***** OpenALObject *****//==================================================================================================// OpenALObject class//==================================================================================================class OpenALObject{ public: OpenALObject(Float32 inMixerOutputRate) : mOutputRate(inMixerOutputRate), mGain(1.0), mContext(NULL), mDevice(NULL), mEffectsMap(NULL) { mEffectsMap = new SoundEngineEffectMap(); } ~OpenALObject() { Teardown(); } OSStatus Initialize() { OSStatus result = noErr; mDevice = alcOpenDevice(NULL); AssertNoOALError("Error opening output device", end) if(mDevice == NULL) { return kSoundEngineErrDeviceNotFound; } // if a mixer output rate was specified, set it here // must be done before the alcCreateContext() call if (mOutputRate) alcMacOSXMixerOutputRateProc(mOutputRate); // Create an OpenAL Context mContext = alcCreateContext(mDevice, NULL); AssertNoOALError("Error creating OpenAL context", end) alcMakeContextCurrent(mContext); AssertNoOALError("Error setting current OpenAL context", end) end: return result; } void Teardown() { if (mEffectsMap) { for (UInt32 i = 0; i < mEffectsMap->Size(); i++) { SoundEngineEffect *theEffect = mEffectsMap->GetEffectByIndex(0); if (theEffect) { mEffectsMap->Remove(theEffect->GetEffectID()); delete theEffect; } } delete mEffectsMap; } if (mContext) alcDestroyContext(mContext); if (mDevice) alcCloseDevice(mDevice); } OSStatus SetListenerPosition(Float32 inX, Float32 inY, Float32 inZ) { alListener3f(AL_POSITION, inX, inY, inZ); return alGetError(); } OSStatus SetListenerGain(Float32 inValue) { alListenerf(AL_GAIN, inValue); return alGetError(); } OSStatus SetMaxDistance(Float32 inValue) { OSStatus result = 0; for (UInt32 i=0; i < mEffectsMap->Size(); i++) { SoundEngineEffect *theEffect = mEffectsMap->GetEffectByIndex(i); if ((result = theEffect->SetMaxDistance(inValue)) != AL_NO_ERROR) return result; } return result; } OSStatus SetReferenceDistance(Float32 inValue) { OSStatus result = 0; for (UInt32 i=0; i < mEffectsMap->Size(); i++) { SoundEngineEffect *theEffect = mEffectsMap->GetEffectByIndex(i); if ((result = theEffect->SetReferenceDistance(inValue)) != AL_NO_ERROR) return result; } return result; } OSStatus SetEffectsVolume(Float32 inValue) { OSStatus result = 0; for (UInt32 i=0; i < mEffectsMap->Size(); i++) { SoundEngineEffect *theEffect = mEffectsMap->GetEffectByIndex(i); if ((result = theEffect->SetLevel(inValue)) != AL_NO_ERROR) return result; } return result; } OSStatus UpdateGain() { return SetEffectsVolume(mGain); } OSStatus LoadEffect(const char *inFilePath, UInt32 *outEffectID) { SoundEngineEffect *theEffect = new SoundEngineEffect(inFilePath, NULL, NULL, false); OSStatus result = theEffect->AttachFilesToSource(); if (result == noErr) { *outEffectID = theEffect->GetEffectID(); mEffectsMap->Add(*outEffectID, &theEffect); } return result; } OSStatus LoadLoopingEffect(const char *inLoopFilePath, const char *inAttackFilePath, const char *inDecayFilePath, UInt32 *outEffectID) { SoundEngineEffect *theEffect = new SoundEngineEffect(inLoopFilePath, inAttackFilePath, inDecayFilePath, true); OSStatus result = theEffect->AttachFilesToSource(); if (result == noErr) { *outEffectID = theEffect->GetEffectID(); mEffectsMap->Add(*outEffectID, &theEffect); } return result; } OSStatus UnloadEffect(UInt32 inEffectID) { mEffectsMap->Remove(inEffectID); return 0; } OSStatus StartEffect(UInt32 inEffectID) { SoundEngineEffect *theEffect = mEffectsMap->Get(inEffectID); return (theEffect) ? theEffect->Start() : kSoundEngineErrInvalidID; } OSStatus StopEffect(UInt32 inEffectID, Boolean inDoDecay) { SoundEngineEffect *theEffect = mEffectsMap->Get(inEffectID); return (theEffect) ? theEffect->Stop(inDoDecay) : kSoundEngineErrInvalidID; } OSStatus SetEffectPitch(UInt32 inEffectID, Float32 inValue) { SoundEngineEffect *theEffect = mEffectsMap->Get(inEffectID); return (theEffect) ? theEffect->SetPitch(inValue) : kSoundEngineErrInvalidID; } OSStatus SetEffectVolume(UInt32 inEffectID, Float32 inValue) { SoundEngineEffect *theEffect = mEffectsMap->Get(inEffectID); return (theEffect) ? theEffect->SetLevel(inValue) : kSoundEngineErrInvalidID; } OSStatus SetEffectPosition(UInt32 inEffectID, Float32 inX, Float32 inY, Float32 inZ) { SoundEngineEffect *theEffect = mEffectsMap->Get(inEffectID); return (theEffect) ? theEffect->SetPosition(inX, inY, inZ) : kSoundEngineErrInvalidID; } private: Float32 mOutputRate; Float32 mGain; ALCcontext* mContext; ALCdevice* mDevice; SoundEngineEffectMap* mEffectsMap;};#pragma mark ***** API *****//==================================================================================================// Sound Engine//==================================================================================================extern "C"OSStatus SoundEngine_Initialize(Float32 inMixerOutputRate){ if (sOpenALObject) delete sOpenALObject; if (sBackgroundTrackMgr) delete sBackgroundTrackMgr; sOpenALObject = new OpenALObject(inMixerOutputRate); sBackgroundTrackMgr = new BackgroundTrackMgr(); return sOpenALObject->Initialize(); }extern "C"OSStatus SoundEngine_Teardown(){ if (sOpenALObject) { delete sOpenALObject; sOpenALObject = NULL; } if (sBackgroundTrackMgr) { delete sBackgroundTrackMgr; sBackgroundTrackMgr = NULL; } return 0; }extern "C"OSStatus SoundEngine_SetMasterVolume(Float32 inValue){ OSStatus result = noErr; gMasterVolumeGain = inValue; if (sBackgroundTrackMgr) result = sBackgroundTrackMgr->UpdateGain(); if (result) return result; if (sOpenALObject) return sOpenALObject->UpdateGain(); return result;}extern "C"OSStatus SoundEngine_SetListenerPosition(Float32 inX, Float32 inY, Float32 inZ){ return (sOpenALObject) ? sOpenALObject->SetListenerPosition(inX, inY, inZ) : kSoundEngineErrUnitialized;}extern "C"OSStatus SoundEngine_SetListenerGain(Float32 inValue){ return (sOpenALObject) ? sOpenALObject->SetListenerGain(inValue) : kSoundEngineErrUnitialized;}extern "C"OSStatus SoundEngine_LoadBackgroundMusicTrack(const char* inPath, Boolean inAddToQueue, Boolean inLoadAtOnce){ if (sBackgroundTrackMgr == NULL) sBackgroundTrackMgr = new BackgroundTrackMgr(); return sBackgroundTrackMgr->LoadTrack(inPath, inAddToQueue, inLoadAtOnce);}extern "C"OSStatus SoundEngine_UnloadBackgroundMusicTrack(){ if (sBackgroundTrackMgr) { delete sBackgroundTrackMgr; sBackgroundTrackMgr = NULL; } return 0;}extern "C"OSStatus SoundEngine_StartBackgroundMusic(){ return (sBackgroundTrackMgr) ? sBackgroundTrackMgr->Start() : kSoundEngineErrUnitialized;}extern "C"OSStatus SoundEngine_StopBackgroundMusic(Boolean stopAtEnd){ return (sBackgroundTrackMgr) ? sBackgroundTrackMgr->Stop(stopAtEnd) : kSoundEngineErrUnitialized;}extern "C"OSStatus SoundEngine_SetBackgroundMusicVolume(Float32 inValue){ return (sBackgroundTrackMgr) ? sBackgroundTrackMgr->SetVolume(inValue) : kSoundEngineErrUnitialized;}extern "C"OSStatus SoundEngine_LoadEffect(const char* inPath, UInt32* outEffectID){ OSStatus result = noErr; if (sOpenALObject == NULL) { sOpenALObject = new OpenALObject(0.0); result = sOpenALObject->Initialize(); } return (result) ? result : sOpenALObject->LoadEffect(inPath, outEffectID);}extern "C"OSStatus SoundEngine_LoadLoopingEffect(const char* inLoopFilePath, const char* inAttackFilePath, const char* inDecayFilePath, UInt32* outEffectID){ OSStatus result = noErr; if (sOpenALObject == NULL) { sOpenALObject = new OpenALObject(0.0); result = sOpenALObject->Initialize(); } return (result) ? result : sOpenALObject->LoadLoopingEffect(inLoopFilePath, inAttackFilePath, inDecayFilePath, outEffectID);}extern "C"OSStatus SoundEngine_UnloadEffect(UInt32 inEffectID){ return (sOpenALObject) ? sOpenALObject->UnloadEffect(inEffectID) : kSoundEngineErrUnitialized;}extern "C"OSStatus SoundEngine_StartEffect(UInt32 inEffectID){ return (sOpenALObject) ? sOpenALObject->StartEffect(inEffectID) : kSoundEngineErrUnitialized;}extern "C"OSStatus SoundEngine_StopEffect(UInt32 inEffectID, Boolean inDoDecay){ return (sOpenALObject) ? sOpenALObject->StopEffect(inEffectID, inDoDecay) : kSoundEngineErrUnitialized;} extern "C"OSStatus SoundEngine_SetEffectPitch(UInt32 inEffectID, Float32 inValue){ return (sOpenALObject) ? sOpenALObject->SetEffectPitch(inEffectID, inValue) : kSoundEngineErrUnitialized;}extern "C"OSStatus SoundEngine_SetEffectLevel(UInt32 inEffectID, Float32 inValue){ return (sOpenALObject) ? sOpenALObject->SetEffectVolume(inEffectID, inValue) : kSoundEngineErrUnitialized;}extern "C"OSStatus SoundEngine_SetEffectPosition(UInt32 inEffectID, Float32 inX, Float32 inY, Float32 inZ){ return (sOpenALObject) ? sOpenALObject->SetEffectPosition(inEffectID, inX, inY, inZ) : kSoundEngineErrUnitialized; }extern "C"OSStatus SoundEngine_SetEffectsVolume(Float32 inValue){ return (sOpenALObject) ? sOpenALObject->SetEffectsVolume(inValue) : kSoundEngineErrUnitialized;}extern "C"OSStatus SoundEngine_SetMaxDistance(Float32 inValue){ return (sOpenALObject) ? sOpenALObject->SetMaxDistance(inValue) : kSoundEngineErrUnitialized;}extern "C"OSStatus SoundEngine_SetReferenceDistance(Float32 inValue){ return (sOpenALObject) ? sOpenALObject->SetReferenceDistance(inValue) : kSoundEngineErrUnitialized;}#endif#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -