diff options
Diffstat (limited to 'tests/freealut/src/alutInit.c')
-rw-r--r-- | tests/freealut/src/alutInit.c | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/tests/freealut/src/alutInit.c b/tests/freealut/src/alutInit.c new file mode 100644 index 00000000..32080c8b --- /dev/null +++ b/tests/freealut/src/alutInit.c @@ -0,0 +1,154 @@ +#include "alutInternal.h" + +static enum +{ + Unintialized, /* ALUT has not been initialized yet or has been de-initialised */ + ALUTDeviceAndContext, /* alutInit has been called successfully */ + ExternalDeviceAndContext /* alutInitWithoutContext has been called */ +} initialisationState = Unintialized; + +/* + * Note: alutContext contains something valid only when initialisationState + * contains ALUTDeviceAndContext. + */ +static ALCcontext *alutContext; + +ALboolean _alutSanityCheck(void) +{ + ALCcontext *context; + + if (initialisationState == Unintialized) + { + _alutSetError(ALUT_ERROR_INVALID_OPERATION); + return AL_FALSE; + } + + context = alcGetCurrentContext(); + if (context == NULL) + { + _alutSetError(ALUT_ERROR_NO_CURRENT_CONTEXT); + return AL_FALSE; + } + + if (alGetError() != AL_NO_ERROR) + { + _alutSetError(ALUT_ERROR_AL_ERROR_ON_ENTRY); + return AL_FALSE; + } + + if (alcGetError(alcGetContextsDevice(context)) != ALC_NO_ERROR) + { + _alutSetError(ALUT_ERROR_ALC_ERROR_ON_ENTRY); + return AL_FALSE; + } + + return AL_TRUE; +} + +ALboolean alutInit(int *argcp, char **argv) +{ + ALCdevice *device; + ALCcontext *context; + + if (initialisationState != Unintialized) + { + _alutSetError(ALUT_ERROR_INVALID_OPERATION); + return AL_FALSE; + } + + if ((argcp == NULL) != (argv == NULL)) + { + _alutSetError(ALUT_ERROR_INVALID_VALUE); + return AL_FALSE; + } + + device = alcOpenDevice(NULL); + if (device == NULL) + { + _alutSetError(ALUT_ERROR_OPEN_DEVICE); + return AL_FALSE; + } + + context = alcCreateContext(device, NULL); + if (context == NULL) + { + alcCloseDevice(device); + _alutSetError(ALUT_ERROR_CREATE_CONTEXT); + return AL_FALSE; + } + + if (!alcMakeContextCurrent(context)) + { + alcDestroyContext(context); + alcCloseDevice(device); + _alutSetError(ALUT_ERROR_MAKE_CONTEXT_CURRENT); + return AL_FALSE; + } + + initialisationState = ALUTDeviceAndContext; + alutContext = context; + return AL_TRUE; +} + +ALboolean alutInitWithoutContext(int *argcp, char **argv) +{ + if (initialisationState != Unintialized) + { + _alutSetError(ALUT_ERROR_INVALID_OPERATION); + return AL_FALSE; + } + + if ((argcp == NULL) != (argv == NULL)) + { + _alutSetError(ALUT_ERROR_INVALID_VALUE); + return AL_FALSE; + } + + initialisationState = ExternalDeviceAndContext; + return AL_TRUE; +} + +ALboolean alutExit(void) +{ + ALCdevice *device; + + if (initialisationState == Unintialized) + { + _alutSetError(ALUT_ERROR_INVALID_OPERATION); + return AL_FALSE; + } + + if (initialisationState == ExternalDeviceAndContext) + { + initialisationState = Unintialized; + return AL_TRUE; + } + + if (!_alutSanityCheck()) + { + return AL_FALSE; + } + + if (!alcMakeContextCurrent(NULL)) + { + _alutSetError(ALUT_ERROR_MAKE_CONTEXT_CURRENT); + return AL_FALSE; + } + + device = alcGetContextsDevice(alutContext); + alcDestroyContext(alutContext); + if (alcGetError(device) != ALC_NO_ERROR) + { + _alutSetError(ALUT_ERROR_DESTROY_CONTEXT); + return AL_FALSE; + } + + if (!alcCloseDevice(device)) + { + _alutSetError(ALUT_ERROR_CLOSE_DEVICE); + return AL_FALSE; + } + + initialisationState = Unintialized; + return AL_TRUE; +} |