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

📄 soundengine.cpp

📁 在iPhone OS上使用用Objective-C语言开发的Demo程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
        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 + -