Module: wine Branch: master Commit: 49078e00a51876df38d0c572193195be6700bad0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=49078e00a51876df38d0c57219...
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
---
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 e83bc22..b2a5e3b 100644 --- a/dlls/xaudio2_7/xaudio_dll.c +++ b/dlls/xaudio2_7/xaudio_dll.c @@ -36,6 +36,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;
@@ -101,6 +102,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; @@ -313,6 +320,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; @@ -366,6 +375,8 @@ static void WINAPI XA2SRC_DestroyVoice(IXAudio2SourceVoice *iface)
TRACE("%p\n", This);
+ palcSetThreadContext(This->xa2->al_ctx); + EnterCriticalSection(&This->lock);
if(!This->in_use){ @@ -728,6 +739,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; @@ -740,6 +753,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; @@ -1377,6 +1392,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){ @@ -1752,12 +1769,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)) { @@ -2415,6 +2426,8 @@ static DWORD WINAPI engine_threadproc(void *arg) continue; }
+ palcSetThreadContext(This->al_ctx); + do_engine_tick(This);
LeaveCriticalSection(&This->lock);