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