#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; }