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