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