From: Davide Beatrici git@davidebeatrici.dev
--- dlls/mmdevapi/client.c | 77 ++++++++++++++++++++++++++++++++++ dlls/winepulse.drv/mmdevdrv.c | 78 ++--------------------------------- 2 files changed, 80 insertions(+), 75 deletions(-)
diff --git a/dlls/mmdevapi/client.c b/dlls/mmdevapi/client.c index 87bc3fef0e5..d2d4939bc73 100644 --- a/dlls/mmdevapi/client.c +++ b/dlls/mmdevapi/client.c @@ -36,6 +36,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi); extern void sessions_lock(void) DECLSPEC_HIDDEN; extern void sessions_unlock(void) DECLSPEC_HIDDEN;
+extern struct audio_session_wrapper *session_wrapper_create(struct audio_client *client) DECLSPEC_HIDDEN; + void set_stream_volumes(struct audio_client *This) { struct set_volumes_params params; @@ -194,6 +196,81 @@ const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl = capture_GetNextPacketSize };
+HRESULT WINAPI client_GetService(IAudioClient3 *iface, REFIID riid, void **ppv) +{ + struct audio_client *This = impl_from_IAudioClient3(iface); + HRESULT hr; + + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv); + + if (!ppv) + return E_POINTER; + + *ppv = NULL; + + sessions_lock(); + + if (!This->stream) { + hr = AUDCLNT_E_NOT_INITIALIZED; + goto exit; + } + + if (IsEqualIID(riid, &IID_IAudioRenderClient)) { + if (This->dataflow != eRender) { + hr = AUDCLNT_E_WRONG_ENDPOINT_TYPE; + goto exit; + } + + IAudioRenderClient_AddRef(&This->IAudioRenderClient_iface); + *ppv = &This->IAudioRenderClient_iface; + } else if (IsEqualIID(riid, &IID_IAudioCaptureClient)) { + if (This->dataflow != eCapture) { + hr = AUDCLNT_E_WRONG_ENDPOINT_TYPE; + goto exit; + } + + 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)) { + const BOOLEAN new_session = !This->session_wrapper; + if (new_session) { + This->session_wrapper = session_wrapper_create(This); + if (!This->session_wrapper) { + hr = E_OUTOFMEMORY; + goto exit; + } + } + + 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 (!new_session) + IUnknown_AddRef((IUnknown *)*ppv); + } else { + FIXME("stub %s\n", debugstr_guid(riid)); + hr = E_NOINTERFACE; + goto exit; + } + + hr = S_OK; +exit: + sessions_unlock(); + + return hr; +} + HRESULT WINAPI client_IsOffloadCapable(IAudioClient3 *iface, AUDIO_STREAM_CATEGORY category, BOOL *offload_capable) { diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index 7b996b3b40e..19d4bd41c7a 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -1021,80 +1021,8 @@ static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface, return params.result; }
-static HRESULT WINAPI AudioClient_GetService(IAudioClient3 *iface, REFIID riid, - void **ppv) -{ - ACImpl *This = impl_from_IAudioClient3(iface); - HRESULT hr; - - TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv); - - if (!ppv) - return E_POINTER; - *ppv = NULL; - - sessions_lock(); - - if (!This->stream) { - hr = AUDCLNT_E_NOT_INITIALIZED; - goto exit; - } - - if (IsEqualIID(riid, &IID_IAudioRenderClient)) { - if (This->dataflow != eRender) { - hr = AUDCLNT_E_WRONG_ENDPOINT_TYPE; - goto exit; - } - - IAudioRenderClient_AddRef(&This->IAudioRenderClient_iface); - *ppv = &This->IAudioRenderClient_iface; - } else if (IsEqualIID(riid, &IID_IAudioCaptureClient)) { - if (This->dataflow != eCapture) { - hr = AUDCLNT_E_WRONG_ENDPOINT_TYPE; - goto exit; - } - - 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)) { - const BOOLEAN new_session = !This->session_wrapper; - if (new_session) { - This->session_wrapper = session_wrapper_create(This); - if (!This->session_wrapper) { - hr = E_OUTOFMEMORY; - goto exit; - } - } - - 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 (!new_session) - IUnknown_AddRef((IUnknown *)*ppv); - } else { - FIXME("stub %s\n", debugstr_guid(riid)); - hr = E_NOINTERFACE; - goto exit; - } - - hr = S_OK; -exit: - sessions_unlock(); - - return hr; -} +extern HRESULT WINAPI client_GetService(IAudioClient3 *iface, REFIID riid, + void **ppv);
extern HRESULT WINAPI client_IsOffloadCapable(IAudioClient3 *iface, AUDIO_STREAM_CATEGORY category, BOOL *offload_capable); @@ -1133,7 +1061,7 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl = AudioClient_Stop, AudioClient_Reset, AudioClient_SetEventHandle, - AudioClient_GetService, + client_GetService, client_IsOffloadCapable, client_SetClientProperties, client_GetBufferSizeLimits,