00001 #include "alutInternal.h" 00002 00003 static enum 00004 { 00005 Unintialized, /* ALUT has not been initialized yet or has been de-initialised */ 00006 ALUTDeviceAndContext, /* alutInit has been called successfully */ 00007 ExternalDeviceAndContext /* alutInitWithoutContext has been called */ 00008 } initialisationState = Unintialized; 00009 00010 /* 00011 * Note: alutContext contains something valid only when initialisationState 00012 * contains ALUTDeviceAndContext. 00013 */ 00014 static ALCcontext *alutContext; 00015 00016 ALboolean 00017 _alutSanityCheck (void) 00018 { 00019 ALCcontext *context; 00020 00021 if (initialisationState == Unintialized) 00022 { 00023 _alutSetError (ALUT_ERROR_INVALID_OPERATION); 00024 return AL_FALSE; 00025 } 00026 00027 context = alcGetCurrentContext (); 00028 if (context == NULL) 00029 { 00030 _alutSetError (ALUT_ERROR_NO_CURRENT_CONTEXT); 00031 return AL_FALSE; 00032 } 00033 00034 if (alGetError () != AL_NO_ERROR) 00035 { 00036 _alutSetError (ALUT_ERROR_AL_ERROR_ON_ENTRY); 00037 return AL_FALSE; 00038 } 00039 00040 if (alcGetError (alcGetContextsDevice (context)) != ALC_NO_ERROR) 00041 { 00042 _alutSetError (ALUT_ERROR_ALC_ERROR_ON_ENTRY); 00043 return AL_FALSE; 00044 } 00045 00046 return AL_TRUE; 00047 } 00048 00049 ALboolean 00050 alutInit(ALCdevice* device, ALCcontext* context) 00051 { 00052 if (initialisationState != Unintialized) 00053 { 00054 _alutSetError (ALUT_ERROR_INVALID_OPERATION); 00055 return AL_FALSE; 00056 } 00057 00058 if (device == NULL) 00059 { 00060 _alutSetError (ALUT_ERROR_OPEN_DEVICE); 00061 return AL_FALSE; 00062 } 00063 00064 if (context == NULL) 00065 { 00066 _alutSetError (ALUT_ERROR_CREATE_CONTEXT); 00067 return AL_FALSE; 00068 } 00069 00070 initialisationState = ALUTDeviceAndContext; 00071 alutContext = context; 00072 return AL_TRUE; 00073 } 00074 00075 ALboolean 00076 alutInitWithoutContext (int *argcp, char **argv) 00077 { 00078 if (initialisationState != Unintialized) 00079 { 00080 _alutSetError (ALUT_ERROR_INVALID_OPERATION); 00081 return AL_FALSE; 00082 } 00083 00084 if ((argcp == NULL) != (argv == NULL)) 00085 { 00086 _alutSetError (ALUT_ERROR_INVALID_VALUE); 00087 return AL_FALSE; 00088 } 00089 00090 initialisationState = ExternalDeviceAndContext; 00091 return AL_TRUE; 00092 } 00093 00094 ALboolean 00095 alutExit (void) 00096 { 00097 if (initialisationState == Unintialized) 00098 { 00099 _alutSetError (ALUT_ERROR_INVALID_OPERATION); 00100 return AL_FALSE; 00101 } 00102 00103 if (initialisationState == ExternalDeviceAndContext) 00104 { 00105 initialisationState = Unintialized; 00106 return AL_TRUE; 00107 } 00108 00109 if (!_alutSanityCheck ()) 00110 { 00111 return AL_FALSE; 00112 } 00113 00114 if (!alcMakeContextCurrent (NULL)) 00115 { 00116 _alutSetError (ALUT_ERROR_MAKE_CONTEXT_CURRENT); 00117 return AL_FALSE; 00118 } 00119 00120 initialisationState = Unintialized; 00121 return AL_TRUE; 00122 }