blob: 32080c8b93f3fd49a82493f9cf1b5b0dab2c5579 [file] [log] [blame] [edit]
#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;
}