Commit 61fe7b3f authored by Chris Robinson's avatar Chris Robinson Committed by Alexandre Julliard

openal32: Add support for ALC_EXT_thread_local_context.

parent 0540af5b
...@@ -39,6 +39,9 @@ ...@@ -39,6 +39,9 @@
WINE_DEFAULT_DEBUG_CHANNEL(openal32); WINE_DEFAULT_DEBUG_CHANNEL(openal32);
static ALCboolean (ALC_APIENTRY*alcSetThreadContext)(ALCcontext *context);
static ALCcontext* (ALC_APIENTRY*alcGetThreadContext)(ALCvoid);
static ALboolean loaded_procs; static ALboolean loaded_procs;
static ALvoid (AL_APIENTRY*alBufferDataStatic)(const ALuint bid, ALenum format, const ALvoid* data, ALsizei size, ALsizei freq); static ALvoid (AL_APIENTRY*alBufferDataStatic)(const ALuint bid, ALenum format, const ALvoid* data, ALsizei size, ALsizei freq);
...@@ -103,6 +106,10 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) ...@@ -103,6 +106,10 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
{ {
case DLL_PROCESS_ATTACH: case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hinst); DisableThreadLibraryCalls(hinst);
#define LOADFUNC(x) x = alcGetProcAddress(NULL, #x)
LOADFUNC(alcSetThreadContext);
LOADFUNC(alcGetThreadContext);
#undef LOADFUNC
break; break;
} }
...@@ -110,6 +117,46 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) ...@@ -110,6 +117,46 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
} }
static void LoadProcs(void)
{
#define LOADFUNC(x) x = alGetProcAddress(#x)
LOADFUNC(alBufferDataStatic);
LOADFUNC(alGenFilters);
LOADFUNC(alDeleteFilters);
LOADFUNC(alIsFilter);
LOADFUNC(alFilterf);
LOADFUNC(alFilterfv);
LOADFUNC(alFilteri);
LOADFUNC(alFilteriv);
LOADFUNC(alGetFilterf);
LOADFUNC(alGetFilterfv);
LOADFUNC(alGetFilteri);
LOADFUNC(alGetFilteriv);
LOADFUNC(alGenEffects);
LOADFUNC(alDeleteEffects);
LOADFUNC(alIsEffect);
LOADFUNC(alEffectf);
LOADFUNC(alEffectfv);
LOADFUNC(alEffecti);
LOADFUNC(alEffectiv);
LOADFUNC(alGetEffectf);
LOADFUNC(alGetEffectfv);
LOADFUNC(alGetEffecti);
LOADFUNC(alGetEffectiv);
LOADFUNC(alGenAuxiliaryEffectSlots);
LOADFUNC(alDeleteAuxiliaryEffectSlots);
LOADFUNC(alIsAuxiliaryEffectSlot);
LOADFUNC(alAuxiliaryEffectSlotf);
LOADFUNC(alAuxiliaryEffectSlotfv);
LOADFUNC(alAuxiliaryEffectSloti);
LOADFUNC(alAuxiliaryEffectSlotiv);
LOADFUNC(alGetAuxiliaryEffectSlotf);
LOADFUNC(alGetAuxiliaryEffectSlotfv);
LOADFUNC(alGetAuxiliaryEffectSloti);
LOADFUNC(alGetAuxiliaryEffectSlotiv);
#undef LOADFUNC
}
/*********************************************************************** /***********************************************************************
* OpenAL thunk routines * OpenAL thunk routines
*/ */
...@@ -133,43 +180,7 @@ ALCboolean CDECL wine_alcMakeContextCurrent(ALCcontext *context) ...@@ -133,43 +180,7 @@ ALCboolean CDECL wine_alcMakeContextCurrent(ALCcontext *context)
if(context && !loaded_procs) if(context && !loaded_procs)
{ {
loaded_procs = AL_TRUE; loaded_procs = AL_TRUE;
LoadProcs();
#define LOADFUNC(x) x = alGetProcAddress(#x)
LOADFUNC(alBufferDataStatic);
LOADFUNC(alGenFilters);
LOADFUNC(alDeleteFilters);
LOADFUNC(alIsFilter);
LOADFUNC(alFilterf);
LOADFUNC(alFilterfv);
LOADFUNC(alFilteri);
LOADFUNC(alFilteriv);
LOADFUNC(alGetFilterf);
LOADFUNC(alGetFilterfv);
LOADFUNC(alGetFilteri);
LOADFUNC(alGetFilteriv);
LOADFUNC(alGenEffects);
LOADFUNC(alDeleteEffects);
LOADFUNC(alIsEffect);
LOADFUNC(alEffectf);
LOADFUNC(alEffectfv);
LOADFUNC(alEffecti);
LOADFUNC(alEffectiv);
LOADFUNC(alGetEffectf);
LOADFUNC(alGetEffectfv);
LOADFUNC(alGetEffecti);
LOADFUNC(alGetEffectiv);
LOADFUNC(alGenAuxiliaryEffectSlots);
LOADFUNC(alDeleteAuxiliaryEffectSlots);
LOADFUNC(alIsAuxiliaryEffectSlot);
LOADFUNC(alAuxiliaryEffectSlotf);
LOADFUNC(alAuxiliaryEffectSlotfv);
LOADFUNC(alAuxiliaryEffectSloti);
LOADFUNC(alAuxiliaryEffectSlotiv);
LOADFUNC(alGetAuxiliaryEffectSlotf);
LOADFUNC(alGetAuxiliaryEffectSlotfv);
LOADFUNC(alGetAuxiliaryEffectSloti);
LOADFUNC(alGetAuxiliaryEffectSlotiv);
#undef LOADFUNC
} }
LeaveCriticalSection(&openal_cs); LeaveCriticalSection(&openal_cs);
...@@ -846,6 +857,33 @@ ALvoid CDECL wine_alGetAuxiliaryEffectSlotiv(ALuint sid, ALenum param, ALint* va ...@@ -846,6 +857,33 @@ ALvoid CDECL wine_alGetAuxiliaryEffectSlotiv(ALuint sid, ALenum param, ALint* va
} }
/* Thread-local context functions */
ALCboolean CDECL wine_alcSetThreadContext(ALCcontext *context)
{
EnterCriticalSection(&openal_cs);
if(alcSetThreadContext(context) == ALC_FALSE)
{
WARN("Failed to make context %p current\n", context);
LeaveCriticalSection(&openal_cs);
return ALC_FALSE;
}
if(context && !loaded_procs)
{
loaded_procs = AL_TRUE;
LoadProcs();
}
LeaveCriticalSection(&openal_cs);
return ALC_TRUE;
}
ALCcontext* CDECL wine_alcGetThreadContext(ALCvoid)
{
return alcGetThreadContext();
}
static const struct FuncList ALCFuncs[] = { static const struct FuncList ALCFuncs[] = {
{ "alcCreateContext", wine_alcCreateContext }, { "alcCreateContext", wine_alcCreateContext },
{ "alcMakeContextCurrent", wine_alcMakeContextCurrent }, { "alcMakeContextCurrent", wine_alcMakeContextCurrent },
...@@ -867,6 +905,8 @@ static const struct FuncList ALCFuncs[] = { ...@@ -867,6 +905,8 @@ static const struct FuncList ALCFuncs[] = {
{ "alcCaptureStart", wine_alcCaptureStart }, { "alcCaptureStart", wine_alcCaptureStart },
{ "alcCaptureStop", wine_alcCaptureStop }, { "alcCaptureStop", wine_alcCaptureStop },
{ "alcCaptureSamples", wine_alcCaptureSamples }, { "alcCaptureSamples", wine_alcCaptureSamples },
{ "alcSetThreadContext", wine_alcSetThreadContext },
{ "alcGetThreadContext", wine_alcGetThreadContext },
{ NULL, NULL } { NULL, NULL }
}; };
static const struct FuncList ALFuncs[] = { static const struct FuncList ALFuncs[] = {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment