aboutsummaryrefslogtreecommitdiff
path: root/tests/freealut/src/alutInit.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/freealut/src/alutInit.c')
-rw-r--r--tests/freealut/src/alutInit.c154
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;
+}