From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 81 ++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 38 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 56e619dd163..c0d0677e786 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -87,6 +87,11 @@ static const IAudioClock2Vtbl AudioClock2_Vtbl; static const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; static const IChannelAudioVolumeVtbl ChannelAudioVolume_Vtbl;
+static void lock_sessions(const BOOLEAN lock) +{ + lock ? EnterCriticalSection(&g_sessions_lock) : LeaveCriticalSection(&g_sessions_lock); +} + static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) { return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); @@ -452,9 +457,9 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) IMMDevice_Release(This->parent); IUnknown_Release(This->marshal); if(This->session){ - EnterCriticalSection(&g_sessions_lock); + lock_sessions(TRUE); list_remove(&This->entry); - LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE); } HeapFree(GetProcessHeap(), 0, This->vols); if(This->stream) @@ -634,10 +639,10 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, } }
- EnterCriticalSection(&g_sessions_lock); + lock_sessions(TRUE);
if(This->stream){ - LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE); return AUDCLNT_E_ALREADY_INITIALIZED; }
@@ -654,7 +659,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
OSS_CALL(create_stream, ¶ms); if(FAILED(params.result)){ - LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE); return params.result; }
@@ -681,7 +686,7 @@ exit: set_stream_volumes(This); }
- LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE);
return params.result; } @@ -837,10 +842,10 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface)
TRACE("(%p)\n", This);
- EnterCriticalSection(&g_sessions_lock); + lock_sessions(TRUE);
if(!This->stream){ - LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE); return AUDCLNT_E_NOT_INITIALIZED; }
@@ -852,7 +857,7 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) SetThreadPriority(This->timer_thread, THREAD_PRIORITY_TIME_CRITICAL); }
- LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE);
return params.result; } @@ -921,23 +926,23 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, return E_POINTER; *ppv = NULL;
- EnterCriticalSection(&g_sessions_lock); + lock_sessions(TRUE);
if(!This->stream){ - LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE); return AUDCLNT_E_NOT_INITIALIZED; }
if(IsEqualIID(riid, &IID_IAudioRenderClient)){ if(This->dataflow != eRender){ - LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE); 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(&g_sessions_lock); + lock_sessions(FALSE); return AUDCLNT_E_WRONG_ENDPOINT_TYPE; } IAudioCaptureClient_AddRef(&This->IAudioCaptureClient_iface); @@ -952,7 +957,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(&g_sessions_lock); + lock_sessions(FALSE); return E_OUTOFMEMORY; } }else @@ -963,7 +968,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(&g_sessions_lock); + lock_sessions(FALSE); return E_OUTOFMEMORY; } }else @@ -974,7 +979,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(&g_sessions_lock); + lock_sessions(FALSE); return E_OUTOFMEMORY; } }else @@ -984,11 +989,11 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, }
if(*ppv){ - LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE); return S_OK; }
- LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE);
FIXME("stub %s\n", debugstr_guid(riid)); return E_NOINTERFACE; @@ -1494,9 +1499,9 @@ static ULONG WINAPI AudioSessionControl_Release(IAudioSessionControl2 *iface) TRACE("(%p) Refcount now %lu\n", This, ref); if(!ref){ if(This->client){ - EnterCriticalSection(&g_sessions_lock); + lock_sessions(TRUE); This->client->session_wrapper = NULL; - LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE); AudioClient_Release(&This->client->IAudioClient3_iface); } HeapFree(GetProcessHeap(), 0, This); @@ -1516,11 +1521,11 @@ static HRESULT WINAPI AudioSessionControl_GetState(IAudioSessionControl2 *iface, if(!state) return NULL_PTR_ERR;
- EnterCriticalSection(&g_sessions_lock); + lock_sessions(TRUE);
if(list_empty(&This->session->clients)){ *state = AudioSessionStateExpired; - LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE); return S_OK; }
@@ -1529,12 +1534,12 @@ static HRESULT WINAPI AudioSessionControl_GetState(IAudioSessionControl2 *iface, OSS_CALL(is_started, ¶ms); if(params.result == S_OK){ *state = AudioSessionStateActive; - LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE); return S_OK; } }
- LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE);
*state = AudioSessionStateInactive;
@@ -1746,7 +1751,7 @@ static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume( if(context) FIXME("Notifications not supported yet\n");
- EnterCriticalSection(&g_sessions_lock); + lock_sessions(TRUE);
session->master_vol = level;
@@ -1754,7 +1759,7 @@ static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume( LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) set_stream_volumes(client);
- LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE);
return S_OK; } @@ -1784,14 +1789,14 @@ static HRESULT WINAPI SimpleAudioVolume_SetMute(ISimpleAudioVolume *iface,
TRACE("(%p)->(%u, %s)\n", session, mute, debugstr_guid(context));
- EnterCriticalSection(&g_sessions_lock); + lock_sessions(TRUE);
session->mute = mute;
LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) set_stream_volumes(client);
- LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE);
return S_OK; } @@ -1884,14 +1889,14 @@ static HRESULT WINAPI AudioStreamVolume_SetChannelVolume( if(index >= This->channel_count) return E_INVALIDARG;
- EnterCriticalSection(&g_sessions_lock); + lock_sessions(TRUE);
This->vols[index] = level;
TRACE("OSS doesn't support setting volume\n"); set_stream_volumes(This);
- LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE);
return S_OK; } @@ -1928,7 +1933,7 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes( if(count != This->channel_count) return E_INVALIDARG;
- EnterCriticalSection(&g_sessions_lock); + lock_sessions(TRUE);
for(i = 0; i < count; ++i) This->vols[i] = levels[i]; @@ -1936,7 +1941,7 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes( TRACE("OSS doesn't support setting volume\n"); set_stream_volumes(This);
- LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE);
return S_OK; } @@ -1955,12 +1960,12 @@ static HRESULT WINAPI AudioStreamVolume_GetAllVolumes( if(count != This->channel_count) return E_INVALIDARG;
- EnterCriticalSection(&g_sessions_lock); + lock_sessions(TRUE);
for(i = 0; i < count; ++i) levels[i] = This->vols[i];
- LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE);
return S_OK; } @@ -2046,7 +2051,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetChannelVolume( if(context) FIXME("Notifications not supported yet\n");
- EnterCriticalSection(&g_sessions_lock); + lock_sessions(TRUE);
session->channel_vols[index] = level;
@@ -2054,7 +2059,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetChannelVolume( LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) set_stream_volumes(client);
- LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE);
return S_OK; } @@ -2099,7 +2104,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetAllVolumes( if(context) FIXME("Notifications not supported yet\n");
- EnterCriticalSection(&g_sessions_lock); + lock_sessions(TRUE);
for(i = 0; i < count; ++i) session->channel_vols[i] = levels[i]; @@ -2108,7 +2113,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetAllVolumes( LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) set_stream_volumes(client);
- LeaveCriticalSection(&g_sessions_lock); + lock_sessions(FALSE);
return S_OK; }