Module: wine Branch: master Commit: 231e45124b94162b75547e8db44fce6e1fff1536 URL: https://gitlab.winehq.org/wine/wine/-/commit/231e45124b94162b75547e8db44fce6...
Author: Davide Beatrici git@davidebeatrici.dev Date: Tue Jun 6 10:00:56 2023 +0200
winepulse: Always initialize ref to 1 in session wrapper.
---
dlls/winepulse.drv/mmdevdrv.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index def79d7f961..b4b6b256e8a 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -1037,38 +1037,46 @@ static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, if (IsEqualIID(riid, &IID_IAudioRenderClient)) { if (This->dataflow != eRender) 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) return AUDCLNT_E_WRONG_ENDPOINT_TYPE; + + IAudioCaptureClient_AddRef(&This->IAudioCaptureClient_iface); *ppv = &This->IAudioCaptureClient_iface; } else if (IsEqualIID(riid, &IID_IAudioClock)) { + IAudioClock_AddRef(&This->IAudioClock_iface); *ppv = &This->IAudioClock_iface; } else if (IsEqualIID(riid, &IID_IAudioStreamVolume)) { + IAudioStreamVolume_AddRef(&This->IAudioStreamVolume_iface); *ppv = &This->IAudioStreamVolume_iface; } else if (IsEqualIID(riid, &IID_IAudioSessionControl) || IsEqualIID(riid, &IID_IChannelAudioVolume) || IsEqualIID(riid, &IID_ISimpleAudioVolume)) { - if (!This->session_wrapper) { + const BOOLEAN new_session = !This->session_wrapper; + if (new_session) { This->session_wrapper = AudioSessionWrapper_Create(This); if (!This->session_wrapper) return E_OUTOFMEMORY; } + if (IsEqualIID(riid, &IID_IAudioSessionControl)) *ppv = &This->session_wrapper->IAudioSessionControl2_iface; else if (IsEqualIID(riid, &IID_IChannelAudioVolume)) *ppv = &This->session_wrapper->IChannelAudioVolume_iface; else if (IsEqualIID(riid, &IID_ISimpleAudioVolume)) *ppv = &This->session_wrapper->ISimpleAudioVolume_iface; - }
- if (*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + if (!new_session) + IUnknown_AddRef((IUnknown *)*ppv); + } else { + FIXME("stub %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; }
- FIXME("stub %s\n", debugstr_guid(riid)); - return E_NOINTERFACE; + return S_OK; }
extern HRESULT WINAPI client_IsOffloadCapable(IAudioClient3 *iface, @@ -1130,7 +1138,7 @@ static AudioSessionWrapper *AudioSessionWrapper_Create(ACImpl *client) ret->ISimpleAudioVolume_iface.lpVtbl = &SimpleAudioVolume_Vtbl; ret->IChannelAudioVolume_iface.lpVtbl = &ChannelAudioVolume_Vtbl;
- ret->ref = !client; + ret->ref = 1;
ret->client = client; if (client) {