Initialize OpenAL with a constructor call instead of first-use
This commit is contained in:
parent
8b36a9d121
commit
d6d1dba3d2
140
Alc/ALc.c
140
Alc/ALc.c
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user