Module: wine Branch: master Commit: 123e748f1be9a9971b2ea2f666e3b71e0d31ef02 URL: https://source.winehq.org/git/wine.git/?a=commit;h=123e748f1be9a9971b2ea2f66...
Author: Huw Davies huw@codeweavers.com Date: Tue Feb 22 08:14:15 2022 +0000
winealsa: Use the sessions lock to lock the client's data.
Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Andrew Eikum aeikum@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/winealsa.drv/mmdevdrv.c | 45 ++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-)
diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index 5bb3bdbcc73..4d38240a853 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -976,10 +976,8 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, }
EnterCriticalSection(&g_sessions_lock); - EnterCriticalSection(&This->lock);
if(This->stream){ - LeaveCriticalSection(&This->lock); LeaveCriticalSection(&g_sessions_lock); return AUDCLNT_E_ALREADY_INITIALIZED; } @@ -988,14 +986,12 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
stream = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This->stream)); if(!stream){ - LeaveCriticalSection(&This->lock); LeaveCriticalSection(&g_sessions_lock); return E_OUTOFMEMORY; }
hr = alsa_open_device(This->alsa_name, This->dataflow, &stream->pcm_handle, &stream->hw_params); if(FAILED(hr)){ - LeaveCriticalSection(&This->lock); LeaveCriticalSection(&g_sessions_lock); return hr; } @@ -1223,7 +1219,6 @@ exit: set_stream_volumes(This); }
- LeaveCriticalSection(&This->lock); LeaveCriticalSection(&g_sessions_lock);
return hr; @@ -1884,20 +1879,24 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface)
TRACE("(%p)\n", This);
+ EnterCriticalSection(&g_sessions_lock); EnterCriticalSection(&This->lock);
if(!This->stream){ LeaveCriticalSection(&This->lock); + LeaveCriticalSection(&g_sessions_lock); return AUDCLNT_E_NOT_INITIALIZED; }
if((stream->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) && !stream->event){ LeaveCriticalSection(&This->lock); + LeaveCriticalSection(&g_sessions_lock); return AUDCLNT_E_EVENTHANDLE_NOT_SET; }
if(stream->started){ LeaveCriticalSection(&This->lock); + LeaveCriticalSection(&g_sessions_lock); return AUDCLNT_E_NOT_STOPPED; }
@@ -1934,6 +1933,7 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) if(!CreateTimerQueueTimer(&This->timer, g_timer_q, alsa_push_buffer_data, This, 0, stream->mmdev_period_rt / 10000, WT_EXECUTEINTIMERTHREAD)){ LeaveCriticalSection(&This->lock); + LeaveCriticalSection(&g_sessions_lock); WARN("Unable to create timer: %u\n", GetLastError()); return E_OUTOFMEMORY; } @@ -1942,6 +1942,7 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) stream->started = TRUE;
LeaveCriticalSection(&This->lock); + LeaveCriticalSection(&g_sessions_lock);
return S_OK; } @@ -2070,23 +2071,23 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, return E_POINTER; *ppv = NULL;
- EnterCriticalSection(&This->lock); + EnterCriticalSection(&g_sessions_lock);
if(!This->stream){ - LeaveCriticalSection(&This->lock); + LeaveCriticalSection(&g_sessions_lock); return AUDCLNT_E_NOT_INITIALIZED; }
if(IsEqualIID(riid, &IID_IAudioRenderClient)){ if(This->dataflow != eRender){ - LeaveCriticalSection(&This->lock); + LeaveCriticalSection(&g_sessions_lock); return AUDCLNT_E_WRONG_ENDPOINT_TYPE; } IAudioRenderClient_AddRef(&This->IAudioRenderClient_iface); *ppv = &This->IAudioRenderClient_iface; }else if(IsEqualIID(riid, &IID_IAudioCaptureClient)){ if(This->dataflow != eCapture){ - LeaveCriticalSection(&This->lock); + LeaveCriticalSection(&g_sessions_lock); return AUDCLNT_E_WRONG_ENDPOINT_TYPE; } IAudioCaptureClient_AddRef(&This->IAudioCaptureClient_iface); @@ -2101,7 +2102,7 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, if(!This->session_wrapper){ This->session_wrapper = AudioSessionWrapper_Create(This); if(!This->session_wrapper){ - LeaveCriticalSection(&This->lock); + LeaveCriticalSection(&g_sessions_lock); return E_OUTOFMEMORY; } }else @@ -2112,7 +2113,7 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, if(!This->session_wrapper){ This->session_wrapper = AudioSessionWrapper_Create(This); if(!This->session_wrapper){ - LeaveCriticalSection(&This->lock); + LeaveCriticalSection(&g_sessions_lock); return E_OUTOFMEMORY; } }else @@ -2123,7 +2124,7 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, if(!This->session_wrapper){ This->session_wrapper = AudioSessionWrapper_Create(This); if(!This->session_wrapper){ - LeaveCriticalSection(&This->lock); + LeaveCriticalSection(&g_sessions_lock); return E_OUTOFMEMORY; } }else @@ -2133,11 +2134,11 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, }
if(*ppv){ - LeaveCriticalSection(&This->lock); + LeaveCriticalSection(&g_sessions_lock); return S_OK; }
- LeaveCriticalSection(&This->lock); + LeaveCriticalSection(&g_sessions_lock);
FIXME("stub %s\n", debugstr_guid(riid)); return E_NOINTERFACE; @@ -2843,9 +2844,9 @@ static ULONG WINAPI AudioSessionControl_Release(IAudioSessionControl2 *iface) TRACE("(%p) Refcount now %u\n", This, ref); if(!ref){ if(This->client){ - EnterCriticalSection(&This->client->lock); + EnterCriticalSection(&g_sessions_lock); This->client->session_wrapper = NULL; - LeaveCriticalSection(&This->client->lock); + LeaveCriticalSection(&g_sessions_lock); AudioClient_Release(&This->client->IAudioClient3_iface); } HeapFree(GetProcessHeap(), 0, This); @@ -3238,12 +3239,12 @@ static HRESULT WINAPI AudioStreamVolume_SetChannelVolume(
TRACE("ALSA does not support volume control\n");
- EnterCriticalSection(&This->lock); + EnterCriticalSection(&g_sessions_lock);
This->vols[index] = level; set_stream_volumes(This);
- LeaveCriticalSection(&This->lock); + LeaveCriticalSection(&g_sessions_lock);
return S_OK; } @@ -3282,13 +3283,13 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes(
TRACE("ALSA does not support volume control\n");
- EnterCriticalSection(&This->lock); + EnterCriticalSection(&g_sessions_lock);
for(i = 0; i < count; ++i) This->vols[i] = levels[i]; set_stream_volumes(This);
- LeaveCriticalSection(&This->lock); + LeaveCriticalSection(&g_sessions_lock);
return S_OK; } @@ -3307,12 +3308,12 @@ static HRESULT WINAPI AudioStreamVolume_GetAllVolumes( if(count != This->channel_count) return E_INVALIDARG;
- EnterCriticalSection(&This->lock); + EnterCriticalSection(&g_sessions_lock);
for(i = 0; i < count; ++i) levels[i] = This->vols[i];
- LeaveCriticalSection(&This->lock); + LeaveCriticalSection(&g_sessions_lock);
return S_OK; }