Commit 49078e00 authored by Andrew Eikum's avatar Andrew Eikum Committed by Alexandre Julliard

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

parent d72d6403
...@@ -36,6 +36,7 @@ WINE_DECLARE_DEBUG_CHANNEL(winediag); ...@@ -36,6 +36,7 @@ WINE_DECLARE_DEBUG_CHANNEL(winediag);
static ALCdevice *(ALC_APIENTRY *palcLoopbackOpenDeviceSOFT)(const ALCchar*); static ALCdevice *(ALC_APIENTRY *palcLoopbackOpenDeviceSOFT)(const ALCchar*);
static void (ALC_APIENTRY *palcRenderSamplesSOFT)(ALCdevice*, ALCvoid*, ALCsizei); static void (ALC_APIENTRY *palcRenderSamplesSOFT)(ALCdevice*, ALCvoid*, ALCsizei);
static ALCboolean (ALC_APIENTRY *palcSetThreadContext)(ALCcontext*);
static HINSTANCE instance; static HINSTANCE instance;
...@@ -101,6 +102,12 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD reason, void *pReserved) ...@@ -101,6 +102,12 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD reason, void *pReserved)
return FALSE; 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; break;
} }
return TRUE; return TRUE;
...@@ -313,6 +320,8 @@ static HRESULT WINAPI XA2SRC_SetVolume(IXAudio2SourceVoice *iface, float Volume, ...@@ -313,6 +320,8 @@ static HRESULT WINAPI XA2SRC_SetVolume(IXAudio2SourceVoice *iface, float Volume,
al_gain = Volume; al_gain = Volume;
palcSetThreadContext(This->xa2->al_ctx);
alSourcef(This->al_src, AL_GAIN, al_gain); alSourcef(This->al_src, AL_GAIN, al_gain);
return S_OK; return S_OK;
...@@ -366,6 +375,8 @@ static void WINAPI XA2SRC_DestroyVoice(IXAudio2SourceVoice *iface) ...@@ -366,6 +375,8 @@ static void WINAPI XA2SRC_DestroyVoice(IXAudio2SourceVoice *iface)
TRACE("%p\n", This); TRACE("%p\n", This);
palcSetThreadContext(This->xa2->al_ctx);
EnterCriticalSection(&This->lock); EnterCriticalSection(&This->lock);
if(!This->in_use){ if(!This->in_use){
...@@ -728,6 +739,8 @@ static HRESULT WINAPI XA2SRC_SetFrequencyRatio(IXAudio2SourceVoice *iface, ...@@ -728,6 +739,8 @@ static HRESULT WINAPI XA2SRC_SetFrequencyRatio(IXAudio2SourceVoice *iface,
else else
r = Ratio; r = Ratio;
palcSetThreadContext(This->xa2->al_ctx);
alSourcef(This->al_src, AL_PITCH, r); alSourcef(This->al_src, AL_PITCH, r);
return S_OK; return S_OK;
...@@ -740,6 +753,8 @@ static void WINAPI XA2SRC_GetFrequencyRatio(IXAudio2SourceVoice *iface, float *p ...@@ -740,6 +753,8 @@ static void WINAPI XA2SRC_GetFrequencyRatio(IXAudio2SourceVoice *iface, float *p
TRACE("%p, %p\n", This, pRatio); TRACE("%p, %p\n", This, pRatio);
palcSetThreadContext(This->xa2->al_ctx);
alGetSourcef(This->al_src, AL_PITCH, &ratio); alGetSourcef(This->al_src, AL_PITCH, &ratio);
*pRatio = ratio; *pRatio = ratio;
...@@ -1377,6 +1392,8 @@ static HRESULT WINAPI IXAudio2Impl_CreateSourceVoice(IXAudio2 *iface, ...@@ -1377,6 +1392,8 @@ static HRESULT WINAPI IXAudio2Impl_CreateSourceVoice(IXAudio2 *iface,
dump_fmt(pSourceFormat); dump_fmt(pSourceFormat);
palcSetThreadContext(This->al_ctx);
EnterCriticalSection(&This->lock); EnterCriticalSection(&This->lock);
LIST_FOR_EACH_ENTRY(src, &This->source_voices, XA2SourceImpl, entry){ LIST_FOR_EACH_ENTRY(src, &This->source_voices, XA2SourceImpl, entry){
...@@ -1752,12 +1769,6 @@ static HRESULT WINAPI IXAudio2Impl_CreateMasteringVoice(IXAudio2 *iface, ...@@ -1752,12 +1769,6 @@ static HRESULT WINAPI IXAudio2Impl_CreateMasteringVoice(IXAudio2 *iface,
goto exit; 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); hr = IAudioClient_Start(This->aclient);
if (FAILED(hr)) if (FAILED(hr))
{ {
...@@ -2415,6 +2426,8 @@ static DWORD WINAPI engine_threadproc(void *arg) ...@@ -2415,6 +2426,8 @@ static DWORD WINAPI engine_threadproc(void *arg)
continue; continue;
} }
palcSetThreadContext(This->al_ctx);
do_engine_tick(This); do_engine_tick(This);
LeaveCriticalSection(&This->lock); LeaveCriticalSection(&This->lock);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment