Andrew Eikum : xaudio2: Always set current OpenAL context before making AL calls.
Module: wine Branch: stable Commit: 8389f893b9961a839c3cfc287924441eccab11e7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8389f893b9961a839c3cfc2879... Author: Andrew Eikum <aeikum(a)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(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> (cherry picked from commit 49078e00a51876df38d0c572193195be6700bad0) Signed-off-by: Michael Stefaniuc <mstefani(a)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);
participants (1)
-
Alexandre Julliard