Chris Robinson : openal32: Add support for ALC_EXT_thread_local_context.
Alexandre Julliard
julliard at winehq.org
Fri Apr 2 10:17:10 CDT 2010
Module: wine
Branch: master
Commit: 61fe7b3f1d6b1cf6df1901521eb0ab4d2162ef67
URL: http://source.winehq.org/git/wine.git/?a=commit;h=61fe7b3f1d6b1cf6df1901521eb0ab4d2162ef67
Author: Chris Robinson <chris.kcat at gmail.com>
Date: Thu Apr 1 12:38:24 2010 -0700
openal32: Add support for ALC_EXT_thread_local_context.
---
dlls/openal32/openal.c | 114 ++++++++++++++++++++++++++++++++---------------
1 files changed, 77 insertions(+), 37 deletions(-)
diff --git a/dlls/openal32/openal.c b/dlls/openal32/openal.c
index ab6bbbd..784fbb5 100644
--- a/dlls/openal32/openal.c
+++ b/dlls/openal32/openal.c
@@ -39,6 +39,9 @@
WINE_DEFAULT_DEBUG_CHANNEL(openal32);
+static ALCboolean (ALC_APIENTRY*alcSetThreadContext)(ALCcontext *context);
+static ALCcontext* (ALC_APIENTRY*alcGetThreadContext)(ALCvoid);
+
static ALboolean loaded_procs;
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 )
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hinst);
+#define LOADFUNC(x) x = alcGetProcAddress(NULL, #x)
+ LOADFUNC(alcSetThreadContext);
+ LOADFUNC(alcGetThreadContext);
+#undef LOADFUNC
break;
}
@@ -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
*/
@@ -133,43 +180,7 @@ ALCboolean CDECL wine_alcMakeContextCurrent(ALCcontext *context)
if(context && !loaded_procs)
{
loaded_procs = AL_TRUE;
-
-#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
+ LoadProcs();
}
LeaveCriticalSection(&openal_cs);
@@ -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[] = {
{ "alcCreateContext", wine_alcCreateContext },
{ "alcMakeContextCurrent", wine_alcMakeContextCurrent },
@@ -867,6 +905,8 @@ static const struct FuncList ALCFuncs[] = {
{ "alcCaptureStart", wine_alcCaptureStart },
{ "alcCaptureStop", wine_alcCaptureStop },
{ "alcCaptureSamples", wine_alcCaptureSamples },
+ { "alcSetThreadContext", wine_alcSetThreadContext },
+ { "alcGetThreadContext", wine_alcGetThreadContext },
{ NULL, NULL }
};
static const struct FuncList ALFuncs[] = {
More information about the wine-cvs
mailing list