Initialize OpenAL with a constructor call instead of first-use

This commit is contained in:
Chris Robinson 2009-09-12 17:49:08 -07:00
parent 8b36a9d121
commit d6d1dba3d2

140
Alc/ALc.c
View File

@ -207,20 +207,17 @@ static tls_type LocalContext;
// Context Error // Context Error
static ALCenum g_eLastContextError = ALC_NO_ERROR; static ALCenum g_eLastContextError = ALC_NO_ERROR;
static ALboolean init_done = AL_FALSE;
/////////////////////////////////////////////////////// ///////////////////////////////////////////////////////
/////////////////////////////////////////////////////// ///////////////////////////////////////////////////////
// ALC Related helper functions // ALC Related helper functions
#ifdef _WIN32 #ifdef _WIN32
static void alc_deinit(); static void alc_init(void);
static void alc_deinit(void);
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{ {
int i;
(void)lpReserved; (void)lpReserved;
// Perform actions based on the reason for calling. // Perform actions based on the reason for calling.
@ -228,6 +225,7 @@ BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{ {
case DLL_PROCESS_ATTACH: case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hModule); DisableThreadLibraryCalls(hModule);
alc_init();
break; break;
case DLL_PROCESS_DETACH: case DLL_PROCESS_DETACH:
@ -238,72 +236,16 @@ BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
} }
#else #else
#ifdef HAVE_GCC_DESTRUCTOR #ifdef HAVE_GCC_DESTRUCTOR
static void alc_deinit() __attribute__((destructor)); static void alc_init(void) __attribute__((constructor));
static void alc_deinit(void) __attribute__((destructor));
#endif #endif
#endif #endif
static void alc_deinit() static void alc_init(void)
{
static ALenum once = AL_FALSE;
int i;
if(once || !init_done) return;
once = AL_TRUE;
ReleaseALC();
for(i = 0;BackendList[i].Deinit;i++)
BackendList[i].Deinit();
tls_delete(LocalContext);
FreeALConfig();
ALTHUNK_EXIT();
DeleteCriticalSection(&g_csMutex);
}
static void ProbeDeviceList()
{
ALint i;
free(alcDeviceList); alcDeviceList = NULL;
alcDeviceListSize = 0;
for(i = 0;BackendList[i].Probe;i++)
BackendList[i].Probe(DEVICE_PROBE);
}
static void ProbeAllDeviceList()
{
ALint i;
free(alcAllDeviceList); alcAllDeviceList = NULL;
alcAllDeviceListSize = 0;
for(i = 0;BackendList[i].Probe;i++)
BackendList[i].Probe(ALL_DEVICE_PROBE);
}
static void ProbeCaptureDeviceList()
{
ALint i;
free(alcCaptureDeviceList); alcCaptureDeviceList = NULL;
alcCaptureDeviceListSize = 0;
for(i = 0;BackendList[i].Probe;i++)
BackendList[i].Probe(CAPTURE_DEVICE_PROBE);
}
static void InitAL(void)
{
if(!init_done)
{ {
int i; int i;
const char *devs, *str; const char *devs, *str;
init_done = AL_TRUE;
InitializeCriticalSection(&g_csMutex); InitializeCriticalSection(&g_csMutex);
ALTHUNK_INIT(); ALTHUNK_INIT();
ReadALConfig(); ReadALConfig();
@ -318,7 +260,6 @@ static void InitAL(void)
const char *next = devs; const char *next = devs;
i = 0; i = 0;
do { do {
devs = next; devs = next;
next = strchr(devs, ','); next = strchr(devs, ',');
@ -348,6 +289,8 @@ static void InitAL(void)
BackendList[i].name = NULL; BackendList[i].name = NULL;
BackendList[i].Init = NULL; BackendList[i].Init = NULL;
BackendList[i].Deinit = NULL;
BackendList[i].Probe = NULL;
} }
for(i = 0;BackendList[i].Init;i++) for(i = 0;BackendList[i].Init;i++)
@ -398,6 +341,55 @@ static void InitAL(void)
} while(next++); } while(next++);
} }
} }
static void alc_deinit(void)
{
int i;
ReleaseALC();
for(i = 0;BackendList[i].Deinit;i++)
BackendList[i].Deinit();
tls_delete(LocalContext);
FreeALConfig();
ALTHUNK_EXIT();
DeleteCriticalSection(&g_csMutex);
}
static void ProbeDeviceList()
{
ALint i;
free(alcDeviceList); alcDeviceList = NULL;
alcDeviceListSize = 0;
for(i = 0;BackendList[i].Probe;i++)
BackendList[i].Probe(DEVICE_PROBE);
}
static void ProbeAllDeviceList()
{
ALint i;
free(alcAllDeviceList); alcAllDeviceList = NULL;
alcAllDeviceListSize = 0;
for(i = 0;BackendList[i].Probe;i++)
BackendList[i].Probe(ALL_DEVICE_PROBE);
}
static void ProbeCaptureDeviceList()
{
ALint i;
free(alcCaptureDeviceList); alcCaptureDeviceList = NULL;
alcCaptureDeviceListSize = 0;
for(i = 0;BackendList[i].Probe;i++)
BackendList[i].Probe(CAPTURE_DEVICE_PROBE);
} }
@ -616,8 +608,6 @@ ALCAPI ALCdevice* ALCAPIENTRY alcCaptureOpenDevice(const ALCchar *deviceName, AL
ALCdevice *pDevice = NULL; ALCdevice *pDevice = NULL;
ALCint i; ALCint i;
InitAL();
if(SampleSize <= 0) if(SampleSize <= 0)
{ {
SetALCError(ALC_INVALID_VALUE); SetALCError(ALC_INVALID_VALUE);
@ -777,8 +767,6 @@ ALCAPI const ALCchar* ALCAPIENTRY alcGetString(ALCdevice *pDevice,ALCenum param)
{ {
const ALCchar *value = NULL; const ALCchar *value = NULL;
InitAL();
switch (param) switch (param)
{ {
case ALC_NO_ERROR: case ALC_NO_ERROR:
@ -877,8 +865,6 @@ ALCAPI const ALCchar* ALCAPIENTRY alcGetString(ALCdevice *pDevice,ALCenum param)
*/ */
ALCAPI ALCvoid ALCAPIENTRY alcGetIntegerv(ALCdevice *device,ALCenum param,ALsizei size,ALCint *data) ALCAPI ALCvoid ALCAPIENTRY alcGetIntegerv(ALCdevice *device,ALCenum param,ALsizei size,ALCint *data)
{ {
InitAL();
if(IsDevice(device) && device->IsCaptureDevice) if(IsDevice(device) && device->IsCaptureDevice)
{ {
SuspendContext(NULL); SuspendContext(NULL);
@ -1266,8 +1252,6 @@ ALCAPI ALCvoid ALCAPIENTRY alcDestroyContext(ALCcontext *context)
{ {
ALCcontext **list; ALCcontext **list;
InitAL();
if (IsContext(context)) if (IsContext(context))
{ {
ALCdevice_StopContext(context->Device, context); ALCdevice_StopContext(context->Device, context);
@ -1337,8 +1321,6 @@ ALCcontext * ALCAPIENTRY alcGetThreadContext(void)
{ {
ALCcontext *pContext = NULL; ALCcontext *pContext = NULL;
InitAL();
SuspendContext(NULL); SuspendContext(NULL);
pContext = tls_get(LocalContext); pContext = tls_get(LocalContext);
@ -1363,8 +1345,6 @@ ALCAPI ALCdevice* ALCAPIENTRY alcGetContextsDevice(ALCcontext *pContext)
{ {
ALCdevice *pDevice = NULL; ALCdevice *pDevice = NULL;
InitAL();
SuspendContext(NULL); SuspendContext(NULL);
if (IsContext(pContext)) if (IsContext(pContext))
pDevice = pContext->Device; pDevice = pContext->Device;
@ -1386,8 +1366,6 @@ ALCAPI ALCboolean ALCAPIENTRY alcMakeContextCurrent(ALCcontext *context)
ALCcontext *ALContext; ALCcontext *ALContext;
ALboolean bReturn = AL_TRUE; ALboolean bReturn = AL_TRUE;
InitAL();
SuspendContext(NULL); SuspendContext(NULL);
// context must be a valid Context or NULL // context must be a valid Context or NULL
@ -1428,8 +1406,6 @@ ALCboolean ALCAPIENTRY alcMakeCurrent(ALCcontext *context)
{ {
ALboolean bReturn = AL_TRUE; ALboolean bReturn = AL_TRUE;
InitAL();
SuspendContext(NULL); SuspendContext(NULL);
// context must be a valid Context or NULL // context must be a valid Context or NULL
@ -1485,8 +1461,6 @@ ALCAPI ALCdevice* ALCAPIENTRY alcOpenDevice(const ALCchar *deviceName)
ALCdevice *device; ALCdevice *device;
ALint i; ALint i;
InitAL();
if(deviceName && !deviceName[0]) if(deviceName && !deviceName[0])
deviceName = NULL; deviceName = NULL;