Files
commandergenius/project/jni/openal/src/freealut/alutInit.c
2011-09-02 16:32:06 +03:00

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