[PATCH 0/4] MR2694: wine{alsa,coreaudio,oss,pulse}: Implement functions to lock and unlock sessions.
From: Davide Beatrici <git(a)davidebeatrici.dev> --- dlls/winealsa.drv/mmdevdrv.c | 86 ++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 38 deletions(-) diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index c46ae41f48b..049abd53f41 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -81,6 +81,16 @@ static const IChannelAudioVolumeVtbl ChannelAudioVolume_Vtbl; static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client); +static void sessions_lock(void) +{ + EnterCriticalSection(&g_sessions_lock); +} + +static void sessions_unlock(void) +{ + LeaveCriticalSection(&g_sessions_lock); +} + static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) { return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); @@ -480,9 +490,9 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) IMMDevice_Release(This->parent); IUnknown_Release(This->marshal); if(This->session){ - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); list_remove(&This->entry); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); } HeapFree(GetProcessHeap(), 0, This->vols); if (This->stream) @@ -666,10 +676,10 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, } } - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); if(This->stream){ - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return AUDCLNT_E_ALREADY_INITIALIZED; } @@ -688,7 +698,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, ALSA_CALL(create_stream, ¶ms); if(FAILED(params.result)){ - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return params.result; } @@ -718,7 +728,7 @@ exit: set_stream_volumes(This); } - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return params.result; } @@ -876,10 +886,10 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) TRACE("(%p)\n", This); - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); if(!This->stream){ - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return AUDCLNT_E_NOT_INITIALIZED; } @@ -892,7 +902,7 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) SetThreadPriority(This->timer_thread, THREAD_PRIORITY_TIME_CRITICAL); } - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return params.result; } @@ -964,23 +974,23 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, return E_POINTER; *ppv = NULL; - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); if(!This->stream){ - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return AUDCLNT_E_NOT_INITIALIZED; } if(IsEqualIID(riid, &IID_IAudioRenderClient)){ if(This->dataflow != eRender){ - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); 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); + sessions_unlock(); return AUDCLNT_E_WRONG_ENDPOINT_TYPE; } IAudioCaptureClient_AddRef(&This->IAudioCaptureClient_iface); @@ -995,7 +1005,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); + sessions_unlock(); return E_OUTOFMEMORY; } }else @@ -1006,7 +1016,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); + sessions_unlock(); return E_OUTOFMEMORY; } }else @@ -1017,7 +1027,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); + sessions_unlock(); return E_OUTOFMEMORY; } }else @@ -1027,11 +1037,11 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, } if(*ppv){ - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); FIXME("stub %s\n", debugstr_guid(riid)); return E_NOINTERFACE; @@ -1545,9 +1555,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); + sessions_lock(); This->client->session_wrapper = NULL; - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); AudioClient_Release(&This->client->IAudioClient3_iface); } HeapFree(GetProcessHeap(), 0, This); @@ -1567,11 +1577,11 @@ static HRESULT WINAPI AudioSessionControl_GetState(IAudioSessionControl2 *iface, if(!state) return NULL_PTR_ERR; - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); if(list_empty(&This->session->clients)){ *state = AudioSessionStateExpired; - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -1580,12 +1590,12 @@ static HRESULT WINAPI AudioSessionControl_GetState(IAudioSessionControl2 *iface, ALSA_CALL(is_started, ¶ms); if(params.result == S_OK){ *state = AudioSessionStateActive; - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } } - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); *state = AudioSessionStateInactive; @@ -1799,14 +1809,14 @@ static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume( TRACE("ALSA does not support volume control\n"); - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); session->master_vol = level; LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) set_stream_volumes(client); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -1839,13 +1849,13 @@ static HRESULT WINAPI SimpleAudioVolume_SetMute(ISimpleAudioVolume *iface, if(context) FIXME("Notifications not supported yet\n"); - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); session->mute = mute; LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) set_stream_volumes(client); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -1940,12 +1950,12 @@ static HRESULT WINAPI AudioStreamVolume_SetChannelVolume( TRACE("ALSA does not support volume control\n"); - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); This->vols[index] = level; set_stream_volumes(This); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -1984,13 +1994,13 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes( TRACE("ALSA does not support volume control\n"); - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); for(i = 0; i < count; ++i) This->vols[i] = levels[i]; set_stream_volumes(This); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -2009,12 +2019,12 @@ static HRESULT WINAPI AudioStreamVolume_GetAllVolumes( if(count != This->channel_count) return E_INVALIDARG; - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); for(i = 0; i < count; ++i) levels[i] = This->vols[i]; - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -2102,14 +2112,14 @@ static HRESULT WINAPI ChannelAudioVolume_SetChannelVolume( TRACE("ALSA does not support volume control\n"); - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); session->channel_vols[index] = level; LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) set_stream_volumes(client); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -2156,7 +2166,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetAllVolumes( TRACE("ALSA does not support volume control\n"); - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); for(i = 0; i < count; ++i) session->channel_vols[i] = levels[i]; @@ -2164,7 +2174,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetAllVolumes( LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) set_stream_volumes(client); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/2694
From: Davide Beatrici <git(a)davidebeatrici.dev> --- dlls/winecoreaudio.drv/mmdevdrv.c | 66 ++++++++++++++++++------------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index 21c2528cab1..0ec1fc63c60 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -75,6 +75,16 @@ static struct list g_sessions = LIST_INIT(g_sessions); static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client); +static void sessions_lock(void) +{ + EnterCriticalSection(&g_sessions_lock); +} + +static void sessions_unlock(void) +{ + LeaveCriticalSection(&g_sessions_lock); +} + static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) { return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); @@ -452,9 +462,9 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) UNIX_CALL(release_stream, ¶ms); This->stream = 0; - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); list_remove(&This->entry); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); } HeapFree(GetProcessHeap(), 0, This->vols); IMMDevice_Release(This->parent); @@ -641,10 +651,10 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, } } - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); if(This->stream){ - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return AUDCLNT_E_ALREADY_INITIALIZED; } @@ -661,7 +671,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, UNIX_CALL(create_stream, ¶ms); if(FAILED(params.result)){ - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return params.result; } @@ -692,7 +702,7 @@ end: set_stream_volumes(This, -1); } - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return params.result; } @@ -934,7 +944,7 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, if(!This->stream) return AUDCLNT_E_NOT_INITIALIZED; - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); if(IsEqualIID(riid, &IID_IAudioRenderClient)){ if(This->dataflow != eRender){ @@ -998,7 +1008,7 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, } end: - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return hr; } @@ -1492,7 +1502,7 @@ static ULONG WINAPI AudioSessionControl_Release(IAudioSessionControl2 *iface) AudioSessionWrapper *This = impl_from_IAudioSessionControl2(iface); ULONG ref; - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); ref = InterlockedDecrement(&This->ref); TRACE("(%p) Refcount now %lu\n", This, ref); @@ -1504,7 +1514,7 @@ static ULONG WINAPI AudioSessionControl_Release(IAudioSessionControl2 *iface) HeapFree(GetProcessHeap(), 0, This); } - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return ref; } @@ -1520,11 +1530,11 @@ static HRESULT WINAPI AudioSessionControl_GetState(IAudioSessionControl2 *iface, if(!state) return NULL_PTR_ERR; - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); if(list_empty(&This->session->clients)){ *state = AudioSessionStateExpired; - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -1533,12 +1543,12 @@ static HRESULT WINAPI AudioSessionControl_GetState(IAudioSessionControl2 *iface, UNIX_CALL(is_started, ¶ms); if(params.result == S_OK){ *state = AudioSessionStateActive; - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } } - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); *state = AudioSessionStateInactive; @@ -1750,14 +1760,14 @@ static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume( if(context) FIXME("Notifications not supported yet\n"); - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); session->master_vol = level; LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) set_stream_volumes(client, -1); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -1790,14 +1800,14 @@ static HRESULT WINAPI SimpleAudioVolume_SetMute(ISimpleAudioVolume *iface, if(context) FIXME("Notifications not supported yet\n"); - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); session->mute = mute; LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) set_stream_volumes(client, -1); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -1890,14 +1900,14 @@ static HRESULT WINAPI AudioStreamVolume_SetChannelVolume( if(index >= This->channel_count) return E_INVALIDARG; - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); This->vols[index] = level; WARN("CoreAudio doesn't support per-channel volume control\n"); set_stream_volumes(This, index); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -1934,14 +1944,14 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes( if(count != This->channel_count) return E_INVALIDARG; - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); for(i = 0; i < count; ++i) This->vols[i] = levels[i]; set_stream_volumes(This, -1); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -1960,12 +1970,12 @@ static HRESULT WINAPI AudioStreamVolume_GetAllVolumes( if(count != This->channel_count) return E_INVALIDARG; - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); for(i = 0; i < count; ++i) levels[i] = This->vols[i]; - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -2051,7 +2061,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetChannelVolume( if(context) FIXME("Notifications not supported yet\n"); - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); session->channel_vols[index] = level; @@ -2059,7 +2069,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetChannelVolume( LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) set_stream_volumes(client, index); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -2104,7 +2114,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetAllVolumes( if(context) FIXME("Notifications not supported yet\n"); - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); for(i = 0; i < count; ++i) session->channel_vols[i] = levels[i]; @@ -2112,7 +2122,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetAllVolumes( LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) set_stream_volumes(client, -1); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/2694
From: Davide Beatrici <git(a)davidebeatrici.dev> --- dlls/wineoss.drv/mmdevdrv.c | 86 +++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 38 deletions(-) diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 56e619dd163..ccabbf352a7 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -87,6 +87,16 @@ static const IAudioClock2Vtbl AudioClock2_Vtbl; static const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; static const IChannelAudioVolumeVtbl ChannelAudioVolume_Vtbl; +static void sessions_lock(void) +{ + EnterCriticalSection(&g_sessions_lock); +} + +static void sessions_unlock(void) +{ + LeaveCriticalSection(&g_sessions_lock); +} + static inline ACImpl *impl_from_IAudioClient3(IAudioClient3 *iface) { return CONTAINING_RECORD(iface, ACImpl, IAudioClient3_iface); @@ -452,9 +462,9 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) IMMDevice_Release(This->parent); IUnknown_Release(This->marshal); if(This->session){ - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); list_remove(&This->entry); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); } HeapFree(GetProcessHeap(), 0, This->vols); if(This->stream) @@ -634,10 +644,10 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, } } - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); if(This->stream){ - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return AUDCLNT_E_ALREADY_INITIALIZED; } @@ -654,7 +664,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, OSS_CALL(create_stream, ¶ms); if(FAILED(params.result)){ - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return params.result; } @@ -681,7 +691,7 @@ exit: set_stream_volumes(This); } - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return params.result; } @@ -837,10 +847,10 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) TRACE("(%p)\n", This); - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); if(!This->stream){ - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return AUDCLNT_E_NOT_INITIALIZED; } @@ -852,7 +862,7 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) SetThreadPriority(This->timer_thread, THREAD_PRIORITY_TIME_CRITICAL); } - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return params.result; } @@ -921,23 +931,23 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, return E_POINTER; *ppv = NULL; - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); if(!This->stream){ - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return AUDCLNT_E_NOT_INITIALIZED; } if(IsEqualIID(riid, &IID_IAudioRenderClient)){ if(This->dataflow != eRender){ - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); 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); + sessions_unlock(); return AUDCLNT_E_WRONG_ENDPOINT_TYPE; } IAudioCaptureClient_AddRef(&This->IAudioCaptureClient_iface); @@ -952,7 +962,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); + sessions_unlock(); return E_OUTOFMEMORY; } }else @@ -963,7 +973,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); + sessions_unlock(); return E_OUTOFMEMORY; } }else @@ -974,7 +984,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); + sessions_unlock(); return E_OUTOFMEMORY; } }else @@ -984,11 +994,11 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, } if(*ppv){ - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); FIXME("stub %s\n", debugstr_guid(riid)); return E_NOINTERFACE; @@ -1494,9 +1504,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); + sessions_lock(); This->client->session_wrapper = NULL; - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); AudioClient_Release(&This->client->IAudioClient3_iface); } HeapFree(GetProcessHeap(), 0, This); @@ -1516,11 +1526,11 @@ static HRESULT WINAPI AudioSessionControl_GetState(IAudioSessionControl2 *iface, if(!state) return NULL_PTR_ERR; - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); if(list_empty(&This->session->clients)){ *state = AudioSessionStateExpired; - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -1529,12 +1539,12 @@ static HRESULT WINAPI AudioSessionControl_GetState(IAudioSessionControl2 *iface, OSS_CALL(is_started, ¶ms); if(params.result == S_OK){ *state = AudioSessionStateActive; - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } } - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); *state = AudioSessionStateInactive; @@ -1746,7 +1756,7 @@ static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume( if(context) FIXME("Notifications not supported yet\n"); - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); session->master_vol = level; @@ -1754,7 +1764,7 @@ static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume( LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) set_stream_volumes(client); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -1784,14 +1794,14 @@ static HRESULT WINAPI SimpleAudioVolume_SetMute(ISimpleAudioVolume *iface, TRACE("(%p)->(%u, %s)\n", session, mute, debugstr_guid(context)); - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); session->mute = mute; LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) set_stream_volumes(client); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -1884,14 +1894,14 @@ static HRESULT WINAPI AudioStreamVolume_SetChannelVolume( if(index >= This->channel_count) return E_INVALIDARG; - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); This->vols[index] = level; TRACE("OSS doesn't support setting volume\n"); set_stream_volumes(This); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -1928,7 +1938,7 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes( if(count != This->channel_count) return E_INVALIDARG; - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); for(i = 0; i < count; ++i) This->vols[i] = levels[i]; @@ -1936,7 +1946,7 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes( TRACE("OSS doesn't support setting volume\n"); set_stream_volumes(This); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -1955,12 +1965,12 @@ static HRESULT WINAPI AudioStreamVolume_GetAllVolumes( if(count != This->channel_count) return E_INVALIDARG; - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); for(i = 0; i < count; ++i) levels[i] = This->vols[i]; - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -2046,7 +2056,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetChannelVolume( if(context) FIXME("Notifications not supported yet\n"); - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); session->channel_vols[index] = level; @@ -2054,7 +2064,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetChannelVolume( LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) set_stream_volumes(client); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } @@ -2099,7 +2109,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetAllVolumes( if(context) FIXME("Notifications not supported yet\n"); - EnterCriticalSection(&g_sessions_lock); + sessions_lock(); for(i = 0; i < count; ++i) session->channel_vols[i] = levels[i]; @@ -2108,7 +2118,7 @@ static HRESULT WINAPI ChannelAudioVolume_SetAllVolumes( LIST_FOR_EACH_ENTRY(client, &session->clients, ACImpl, entry) set_stream_volumes(client); - LeaveCriticalSection(&g_sessions_lock); + sessions_unlock(); return S_OK; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/2694
From: Davide Beatrici <git(a)davidebeatrici.dev> --- dlls/winepulse.drv/mmdevdrv.c | 64 ++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index 7f1dbb765cf..12d67c45c4f 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -83,6 +83,16 @@ static CRITICAL_SECTION_DEBUG session_cs_debug = { }; static CRITICAL_SECTION session_cs = { &session_cs_debug, -1, 0, 0, 0, 0 }; +static void sessions_lock(void) +{ + EnterCriticalSection(&session_cs); +} + +static void sessions_unlock(void) +{ + LeaveCriticalSection(&session_cs); +} + BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) { if (reason == DLL_PROCESS_ATTACH) { @@ -601,9 +611,9 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface) if (This->stream) { pulse_release_stream(This->stream, This->timer_thread); This->stream = 0; - EnterCriticalSection(&session_cs); + sessions_lock(); list_remove(&This->entry); - LeaveCriticalSection(&session_cs); + sessions_unlock(); } IUnknown_Release(This->marshal); IMMDevice_Release(This->parent); @@ -784,10 +794,10 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, return E_INVALIDARG; } - EnterCriticalSection(&session_cs); + sessions_lock(); if (This->stream) { - LeaveCriticalSection(&session_cs); + sessions_unlock(); return AUDCLNT_E_ALREADY_INITIALIZED; } @@ -797,7 +807,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, if (!(pulse_thread = CreateThread(NULL, 0, pulse_mainloop_thread, event, 0, NULL))) { ERR("Failed to create mainloop thread.\n"); - LeaveCriticalSection(&session_cs); + sessions_unlock(); CloseHandle(event); return E_FAIL; } @@ -820,14 +830,14 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, free(name); if (FAILED(hr = params.result)) { - LeaveCriticalSection(&session_cs); + sessions_unlock(); return hr; } if (!(This->vols = malloc(channel_count * sizeof(*This->vols)))) { pulse_release_stream(stream, NULL); - LeaveCriticalSection(&session_cs); + sessions_unlock(); return E_OUTOFMEMORY; } for (i = 0; i < channel_count; i++) @@ -838,7 +848,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, { free(This->vols); This->vols = NULL; - LeaveCriticalSection(&session_cs); + sessions_unlock(); pulse_release_stream(stream, NULL); return E_OUTOFMEMORY; } @@ -848,7 +858,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface, list_add_tail(&This->session->clients, &This->entry); set_stream_volumes(This); - LeaveCriticalSection(&session_cs); + sessions_unlock(); return S_OK; } @@ -1771,12 +1781,12 @@ static HRESULT WINAPI AudioStreamVolume_SetAllVolumes( if (count != This->channel_count) return E_INVALIDARG; - EnterCriticalSection(&session_cs); + sessions_lock(); for (i = 0; i < count; ++i) This->vols[i] = levels[i]; set_stream_volumes(This); - LeaveCriticalSection(&session_cs); + sessions_unlock(); return S_OK; } @@ -1796,10 +1806,10 @@ static HRESULT WINAPI AudioStreamVolume_GetAllVolumes( if (count != This->channel_count) return E_INVALIDARG; - EnterCriticalSection(&session_cs); + sessions_lock(); for (i = 0; i < count; ++i) levels[i] = This->vols[i]; - LeaveCriticalSection(&session_cs); + sessions_unlock(); return S_OK; } @@ -1818,10 +1828,10 @@ static HRESULT WINAPI AudioStreamVolume_SetChannelVolume( if (index >= This->channel_count) return E_INVALIDARG; - EnterCriticalSection(&session_cs); + sessions_lock(); This->vols[index] = level; set_stream_volumes(This); - LeaveCriticalSection(&session_cs); + sessions_unlock(); return S_OK; } @@ -1840,9 +1850,9 @@ static HRESULT WINAPI AudioStreamVolume_GetChannelVolume( if (index >= This->channel_count) return E_INVALIDARG; - EnterCriticalSection(&session_cs); + sessions_lock(); *level = This->vols[index]; - LeaveCriticalSection(&session_cs); + sessions_unlock(); return S_OK; } @@ -1940,7 +1950,7 @@ static HRESULT WINAPI AudioSessionControl_GetState(IAudioSessionControl2 *iface, if (!state) return NULL_PTR_ERR; - EnterCriticalSection(&session_cs); + sessions_lock(); if (list_empty(&This->session->clients)) { *state = AudioSessionStateExpired; goto out; @@ -1961,7 +1971,7 @@ static HRESULT WINAPI AudioSessionControl_GetState(IAudioSessionControl2 *iface, *state = AudioSessionStateInactive; out: - LeaveCriticalSection(&session_cs); + sessions_unlock(); return S_OK; } @@ -2172,11 +2182,11 @@ static HRESULT WINAPI SimpleAudioVolume_SetMasterVolume( TRACE("PulseAudio does not support session volume control\n"); - EnterCriticalSection(&session_cs); + sessions_lock(); session->master_vol = level; LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) set_stream_volumes(client); - LeaveCriticalSection(&session_cs); + sessions_unlock(); return S_OK; } @@ -2209,11 +2219,11 @@ static HRESULT WINAPI SimpleAudioVolume_SetMute(ISimpleAudioVolume *iface, if (context) FIXME("Notifications not supported yet\n"); - EnterCriticalSection(&session_cs); + sessions_lock(); session->mute = mute; LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) set_stream_volumes(client); - LeaveCriticalSection(&session_cs); + sessions_unlock(); return S_OK; } @@ -2316,11 +2326,11 @@ static HRESULT WINAPI ChannelAudioVolume_SetChannelVolume( TRACE("PulseAudio does not support session volume control\n"); - EnterCriticalSection(&session_cs); + sessions_lock(); session->channel_vols[index] = level; LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) set_stream_volumes(client); - LeaveCriticalSection(&session_cs); + sessions_unlock(); return S_OK; } @@ -2367,12 +2377,12 @@ static HRESULT WINAPI ChannelAudioVolume_SetAllVolumes( TRACE("PulseAudio does not support session volume control\n"); - EnterCriticalSection(&session_cs); + sessions_lock(); for(i = 0; i < count; ++i) session->channel_vols[i] = levels[i]; LIST_FOR_EACH_ENTRY(client, &This->session->clients, ACImpl, entry) set_stream_volumes(client); - LeaveCriticalSection(&session_cs); + sessions_unlock(); return S_OK; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/2694
This merge request was approved by Huw Davies. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/2694
participants (3)
-
Davide Beatrici -
Davide Beatrici (@davidebeatrici) -
Huw Davies (@huw)