diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c index e83bc22377f..b2a5e3b71e7 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);