Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/freealut-1.1.0/src/alutInit.c @ 14

Last change on this file since 14 was 14, checked in by landauf, 16 years ago

added freealut

File size: 3.3 KB
Line 
1#include "alutInternal.h"
2
3static enum
4{
5  Unintialized,                 /* ALUT has not been initialized yet or has been de-initialised */
6  ALUTDeviceAndContext,         /* alutInit has been called successfully */
7  ExternalDeviceAndContext      /* alutInitWithoutContext has been called */
8} initialisationState = Unintialized;
9
10/*
11 * Note: alutContext contains something valid only when initialisationState
12 * contains ALUTDeviceAndContext.
13 */
14static ALCcontext *alutContext;
15
16ALboolean
17_alutSanityCheck (void)
18{
19  ALCcontext *context;
20
21  if (initialisationState == Unintialized)
22    {
23      _alutSetError (ALUT_ERROR_INVALID_OPERATION);
24      return AL_FALSE;
25    }
26
27  context = alcGetCurrentContext ();
28  if (context == NULL)
29    {
30      _alutSetError (ALUT_ERROR_NO_CURRENT_CONTEXT);
31      return AL_FALSE;
32    }
33
34  if (alGetError () != AL_NO_ERROR)
35    {
36      _alutSetError (ALUT_ERROR_AL_ERROR_ON_ENTRY);
37      return AL_FALSE;
38    }
39
40  if (alcGetError (alcGetContextsDevice (context)) != ALC_NO_ERROR)
41    {
42      _alutSetError (ALUT_ERROR_ALC_ERROR_ON_ENTRY);
43      return AL_FALSE;
44    }
45
46  return AL_TRUE;
47}
48
49ALboolean
50alutInit (int *argcp, char **argv)
51{
52  ALCdevice *device;
53  ALCcontext *context;
54
55  if (initialisationState != Unintialized)
56    {
57      _alutSetError (ALUT_ERROR_INVALID_OPERATION);
58      return AL_FALSE;
59    }
60
61  if ((argcp == NULL) != (argv == NULL))
62    {
63      _alutSetError (ALUT_ERROR_INVALID_VALUE);
64      return AL_FALSE;
65    }
66
67  device = alcOpenDevice (NULL);
68  if (device == NULL)
69    {
70      _alutSetError (ALUT_ERROR_OPEN_DEVICE);
71      return AL_FALSE;
72    }
73
74  context = alcCreateContext (device, NULL);
75  if (context == NULL)
76    {
77      alcCloseDevice (device);
78      _alutSetError (ALUT_ERROR_CREATE_CONTEXT);
79      return AL_FALSE;
80    }
81
82  if (!alcMakeContextCurrent (context))
83    {
84      alcDestroyContext (context);
85      alcCloseDevice (device);
86      _alutSetError (ALUT_ERROR_MAKE_CONTEXT_CURRENT);
87      return AL_FALSE;
88    }
89
90  initialisationState = ALUTDeviceAndContext;
91  alutContext = context;
92  return AL_TRUE;
93}
94
95ALboolean
96alutInitWithoutContext (int *argcp, char **argv)
97{
98  if (initialisationState != Unintialized)
99    {
100      _alutSetError (ALUT_ERROR_INVALID_OPERATION);
101      return AL_FALSE;
102    }
103
104  if ((argcp == NULL) != (argv == NULL))
105    {
106      _alutSetError (ALUT_ERROR_INVALID_VALUE);
107      return AL_FALSE;
108    }
109
110  initialisationState = ExternalDeviceAndContext;
111  return AL_TRUE;
112}
113
114ALboolean
115alutExit (void)
116{
117  ALCdevice *device;
118
119  if (initialisationState == Unintialized)
120    {
121      _alutSetError (ALUT_ERROR_INVALID_OPERATION);
122      return AL_FALSE;
123    }
124
125  if (initialisationState == ExternalDeviceAndContext)
126    {
127      initialisationState = Unintialized;
128      return AL_TRUE;
129    }
130
131  if (!_alutSanityCheck ())
132    {
133      return AL_FALSE;
134    }
135
136  if (!alcMakeContextCurrent (NULL))
137    {
138      _alutSetError (ALUT_ERROR_MAKE_CONTEXT_CURRENT);
139      return AL_FALSE;
140    }
141
142  device = alcGetContextsDevice (alutContext);
143  alcDestroyContext (alutContext);
144  if (alcGetError (device) != ALC_NO_ERROR)
145    {
146      _alutSetError (ALUT_ERROR_DESTROY_CONTEXT);
147      return AL_FALSE;
148    }
149
150  if (!alcCloseDevice (device))
151    {
152      _alutSetError (ALUT_ERROR_CLOSE_DEVICE);
153      return AL_FALSE;
154    }
155
156  initialisationState = Unintialized;
157  return AL_TRUE;
158}
Note: See TracBrowser for help on using the repository browser.