Huw Davies : winealsa: Use the sessions lock to lock the client's data.

Alexandre Julliard julliard at winehq.org
Tue Feb 22 16:06:52 CST 2022


Module: wine
Branch: master
Commit: 123e748f1be9a9971b2ea2f666e3b71e0d31ef02
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=123e748f1be9a9971b2ea2f666e3b71e0d31ef02

Author: Huw Davies <huw at 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 at codeweavers.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;
 }




More information about the wine-cvs mailing list