Andrew Eikum : xaudio2: Always set current OpenAL context before making AL calls.

Alexandre Julliard julliard at winehq.org
Mon Aug 22 07:32:39 CDT 2016


Module: wine
Branch: stable
Commit: 8389f893b9961a839c3cfc287924441eccab11e7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8389f893b9961a839c3cfc287924441eccab11e7

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Wed Jul  6 14:48:18 2016 -0500

xaudio2: Always set current OpenAL context before making AL calls.

Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 49078e00a51876df38d0c572193195be6700bad0)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/xaudio2_7/xaudio_dll.c | 25 +++++++++++++++++++------
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c
index 70ed8d6..05decdd 100644
--- a/dlls/xaudio2_7/xaudio_dll.c
+++ b/dlls/xaudio2_7/xaudio_dll.c
@@ -38,6 +38,7 @@ WINE_DECLARE_DEBUG_CHANNEL(winediag);
 
 static ALCdevice *(ALC_APIENTRY *palcLoopbackOpenDeviceSOFT)(const ALCchar*);
 static void (ALC_APIENTRY *palcRenderSamplesSOFT)(ALCdevice*, ALCvoid*, ALCsizei);
+static ALCboolean (ALC_APIENTRY *palcSetThreadContext)(ALCcontext*);
 
 static HINSTANCE instance;
 
@@ -103,6 +104,12 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD reason, void *pReserved)
             return FALSE;
         }
 
+        if(!alcIsExtensionPresent(NULL, "ALC_EXT_thread_local_context") ||
+                !(palcSetThreadContext = alcGetProcAddress(NULL, "alcSetThreadContext"))){
+            ERR("XAudio2 requires the ALC_EXT_thread_local_context extension (OpenAL-Soft >= 1.12)\n");
+            return FALSE;
+        }
+
         break;
     }
     return TRUE;
@@ -309,6 +316,8 @@ static HRESULT WINAPI XA2SRC_SetVolume(IXAudio2SourceVoice *iface, float Volume,
 
     al_gain = Volume;
 
+    palcSetThreadContext(This->xa2->al_ctx);
+
     alSourcef(This->al_src, AL_GAIN, al_gain);
 
     return S_OK;
@@ -362,6 +371,8 @@ static void WINAPI XA2SRC_DestroyVoice(IXAudio2SourceVoice *iface)
 
     TRACE("%p\n", This);
 
+    palcSetThreadContext(This->xa2->al_ctx);
+
     EnterCriticalSection(&This->lock);
 
     if(!This->in_use){
@@ -722,6 +733,8 @@ static HRESULT WINAPI XA2SRC_SetFrequencyRatio(IXAudio2SourceVoice *iface,
     else
         r = Ratio;
 
+    palcSetThreadContext(This->xa2->al_ctx);
+
     alSourcef(This->al_src, AL_PITCH, r);
 
     return S_OK;
@@ -734,6 +747,8 @@ static void WINAPI XA2SRC_GetFrequencyRatio(IXAudio2SourceVoice *iface, float *p
 
     TRACE("%p, %p\n", This, pRatio);
 
+    palcSetThreadContext(This->xa2->al_ctx);
+
     alGetSourcef(This->al_src, AL_PITCH, &ratio);
 
     *pRatio = ratio;
@@ -1364,6 +1379,8 @@ static HRESULT WINAPI IXAudio2Impl_CreateSourceVoice(IXAudio2 *iface,
 
     dump_fmt(pSourceFormat);
 
+    palcSetThreadContext(This->al_ctx);
+
     EnterCriticalSection(&This->lock);
 
     LIST_FOR_EACH_ENTRY(src, &This->source_voices, XA2SourceImpl, entry){
@@ -1721,12 +1738,6 @@ static HRESULT WINAPI IXAudio2Impl_CreateMasteringVoice(IXAudio2 *iface,
         goto exit;
     }
 
-    if(alcMakeContextCurrent(This->al_ctx) == ALC_FALSE){
-        WARN("alcMakeContextCurrent failed\n");
-        hr = COMPAT_E_DEVICE_INVALIDATED;
-        goto exit;
-    }
-
     hr = IAudioClient_Start(This->aclient);
     if (FAILED(hr))
     {
@@ -2412,6 +2423,8 @@ static DWORD WINAPI engine_threadproc(void *arg)
             continue;
         }
 
+        palcSetThreadContext(This->al_ctx);
+
         do_engine_tick(This);
 
         LeaveCriticalSection(&This->lock);




More information about the wine-cvs mailing list