159 lines
3.3 KiB
C
159 lines
3.3 KiB
C
#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;
|
|
}
|