[PATCH 0/4] MR9756: mmdevapi: Allow querying I{Simple,Channel}AudioVolume from IAudioSessionControl.
It would come in handy to upstream a test for !9755. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9756
From: Matteo Bruni <mbruni@codeweavers.com> --- dlls/mmdevapi/audiosessionmanager.c | 3 --- dlls/mmdevapi/client.c | 7 ------- dlls/mmdevapi/mmdevapi_private.h | 9 +++++++++ dlls/mmdevapi/session.c | 3 --- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/dlls/mmdevapi/audiosessionmanager.c b/dlls/mmdevapi/audiosessionmanager.c index c3ade988633..06261ee8a75 100644 --- a/dlls/mmdevapi/audiosessionmanager.c +++ b/dlls/mmdevapi/audiosessionmanager.c @@ -26,9 +26,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi); -extern HRESULT get_audio_session_wrapper(const GUID *guid, IMMDevice *device, - struct audio_session_wrapper **out); - static CRITICAL_SECTION g_sessions_lock; static CRITICAL_SECTION_DEBUG g_sessions_lock_debug = { diff --git a/dlls/mmdevapi/client.c b/dlls/mmdevapi/client.c index 4538eca9e1c..d54d981628f 100644 --- a/dlls/mmdevapi/client.c +++ b/dlls/mmdevapi/client.c @@ -43,13 +43,6 @@ typedef struct tagLANGANDCODEPAGE WORD wCodePage; } LANGANDCODEPAGE; -extern void sessions_lock(void); -extern void sessions_unlock(void); - -extern HRESULT get_audio_session(const GUID *sessionguid, IMMDevice *device, UINT channels, - struct audio_session **out); -extern struct audio_session_wrapper *session_wrapper_create(struct audio_client *client); - static HANDLE main_loop_thread; void main_loop_stop(void) diff --git a/dlls/mmdevapi/mmdevapi_private.h b/dlls/mmdevapi/mmdevapi_private.h index 672d901bf6d..1da3d04afa8 100644 --- a/dlls/mmdevapi/mmdevapi_private.h +++ b/dlls/mmdevapi/mmdevapi_private.h @@ -133,4 +133,13 @@ extern void main_loop_stop(void); extern const WCHAR drv_keyW[]; +extern HRESULT get_audio_session(const GUID *sessionguid, IMMDevice *device, UINT channels, + struct audio_session **out); +extern HRESULT get_audio_session_wrapper(const GUID *guid, IMMDevice *device, + struct audio_session_wrapper **out); extern HRESULT get_audio_sessions(IMMDevice *device, GUID **ret, int *ret_count); + +extern struct audio_session_wrapper *session_wrapper_create(struct audio_client *client); + +extern void sessions_lock(void); +extern void sessions_unlock(void); diff --git a/dlls/mmdevapi/session.c b/dlls/mmdevapi/session.c index 8e638251ba2..a0bb15f98cc 100644 --- a/dlls/mmdevapi/session.c +++ b/dlls/mmdevapi/session.c @@ -34,9 +34,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi); -extern void sessions_lock(void); -extern void sessions_unlock(void); - static WCHAR *duplicate_wstr(const WCHAR *str) { const WCHAR *source = str ? str : L""; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9756
From: Matteo Bruni <mbruni@codeweavers.com> --- dlls/mmdevapi/session.c | 6 +++ dlls/mmdevapi/tests/render.c | 87 +++++++++++++++++++++--------------- 2 files changed, 56 insertions(+), 37 deletions(-) diff --git a/dlls/mmdevapi/session.c b/dlls/mmdevapi/session.c index a0bb15f98cc..d256aa868e6 100644 --- a/dlls/mmdevapi/session.c +++ b/dlls/mmdevapi/session.c @@ -64,6 +64,8 @@ static inline struct audio_session_wrapper *impl_from_ISimpleAudioVolume(ISimple static HRESULT WINAPI control_QueryInterface(IAudioSessionControl2 *iface, REFIID riid, void **ppv) { + struct audio_session_wrapper *session = impl_from_IAudioSessionControl2(iface); + TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv); if (!ppv) @@ -73,6 +75,10 @@ static HRESULT WINAPI control_QueryInterface(IAudioSessionControl2 *iface, REFII IsEqualIID(riid, &IID_IAudioSessionControl) || IsEqualIID(riid, &IID_IAudioSessionControl2)) *ppv = iface; + else if (IsEqualIID(riid, &IID_ISimpleAudioVolume)) + *ppv = &session->ISimpleAudioVolume_iface; + else if (IsEqualIID(riid, &IID_IChannelAudioVolume)) + *ppv = &session->IChannelAudioVolume_iface; else { *ppv = NULL; return E_NOINTERFACE; diff --git a/dlls/mmdevapi/tests/render.c b/dlls/mmdevapi/tests/render.c index 9ac82a65400..8c6a8613b5e 100644 --- a/dlls/mmdevapi/tests/render.c +++ b/dlls/mmdevapi/tests/render.c @@ -1596,7 +1596,10 @@ static void test_clock(int share) static void test_session(void) { IAudioClient *ses1_ac1, *ses1_ac2, *cap_ac; - IAudioSessionControl2 *ses1_ctl, *ses1_ctl2, *cap_ctl = NULL; + IAudioSessionControl *ses1_ctl, *ses1_ctl2, *cap_ctl = NULL; + IAudioSessionControl2 *asc2; + IChannelAudioVolume *cav; + ISimpleAudioVolume *sav; IMMDevice *cap_dev; GUID ses1_guid; AudioSessionState state; @@ -1664,25 +1667,35 @@ static void test_session(void) hr = IAudioClient_GetService(ses1_ac1, &IID_IAudioSessionControl, (void**)&ses1_ctl2); ok(hr == S_OK, "GetService failed: %08lx\n", hr); ok(ses1_ctl == ses1_ctl2, "Got different controls: %p %p\n", ses1_ctl, ses1_ctl2); - ref = IAudioSessionControl2_Release(ses1_ctl2); + ref = IAudioSessionControl_Release(ses1_ctl2); ok(ref != 0, "AudioSessionControl was destroyed\n"); + hr = IAudioSessionControl_QueryInterface(ses1_ctl, &IID_IAudioSessionControl2, (void **)&asc2); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + IAudioSessionControl2_Release(asc2); + hr = IAudioSessionControl_QueryInterface(ses1_ctl, &IID_ISimpleAudioVolume, (void **)&sav); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + ISimpleAudioVolume_Release(sav); + hr = IAudioSessionControl_QueryInterface(ses1_ctl, &IID_IChannelAudioVolume, (void **)&cav); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + IChannelAudioVolume_Release(cav); + hr = IAudioClient_GetService(ses1_ac2, &IID_IAudioSessionControl, (void**)&ses1_ctl2); ok(hr == S_OK, "GetService failed: %08lx\n", hr); - hr = IAudioSessionControl2_GetState(ses1_ctl, NULL); + hr = IAudioSessionControl_GetState(ses1_ctl, NULL); ok(hr == NULL_PTR_ERR, "GetState gave wrong error: %08lx\n", hr); - hr = IAudioSessionControl2_GetState(ses1_ctl, &state); + hr = IAudioSessionControl_GetState(ses1_ctl, &state); ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state); - hr = IAudioSessionControl2_GetState(ses1_ctl2, &state); + hr = IAudioSessionControl_GetState(ses1_ctl2, &state); ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state); if(cap_ctl){ - hr = IAudioSessionControl2_GetState(cap_ctl, &state); + hr = IAudioSessionControl_GetState(cap_ctl, &state); ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state); } @@ -1690,16 +1703,16 @@ static void test_session(void) hr = IAudioClient_Start(ses1_ac1); ok(hr == S_OK, "Start failed: %08lx\n", hr); - hr = IAudioSessionControl2_GetState(ses1_ctl, &state); + hr = IAudioSessionControl_GetState(ses1_ctl, &state); ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(state == AudioSessionStateActive, "Got wrong state: %d\n", state); - hr = IAudioSessionControl2_GetState(ses1_ctl2, &state); + hr = IAudioSessionControl_GetState(ses1_ctl2, &state); ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(state == AudioSessionStateActive, "Got wrong state: %d\n", state); if(cap_ctl){ - hr = IAudioSessionControl2_GetState(cap_ctl, &state); + hr = IAudioSessionControl_GetState(cap_ctl, &state); ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state); } @@ -1707,34 +1720,34 @@ static void test_session(void) hr = IAudioClient_Stop(ses1_ac1); ok(hr == S_OK, "Stop failed: %08lx\n", hr); - hr = IAudioSessionControl2_GetState(ses1_ctl, &state); + hr = IAudioSessionControl_GetState(ses1_ctl, &state); ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state); - hr = IAudioSessionControl2_GetState(ses1_ctl2, &state); + hr = IAudioSessionControl_GetState(ses1_ctl2, &state); ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state); /* Test GetDisplayName / SetDisplayName */ - hr = IAudioSessionControl2_GetDisplayName(ses1_ctl2, NULL); + hr = IAudioSessionControl_GetDisplayName(ses1_ctl2, NULL); ok(hr == E_POINTER, "GetDisplayName failed: %08lx\n", hr); str = NULL; - hr = IAudioSessionControl2_GetDisplayName(ses1_ctl2, &str); + hr = IAudioSessionControl_GetDisplayName(ses1_ctl2, &str); ok(hr == S_OK, "GetDisplayName failed: %08lx\n", hr); ok(str && !wcscmp(str, L""), "Got %s\n", wine_dbgstr_w(str)); if (str) CoTaskMemFree(str); - hr = IAudioSessionControl2_SetDisplayName(ses1_ctl2, NULL, NULL); + hr = IAudioSessionControl_SetDisplayName(ses1_ctl2, NULL, NULL); ok(hr == HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER), "SetDisplayName failed: %08lx\n", hr); - hr = IAudioSessionControl2_SetDisplayName(ses1_ctl2, L"WineDisplayName", NULL); + hr = IAudioSessionControl_SetDisplayName(ses1_ctl2, L"WineDisplayName", NULL); ok(hr == S_OK, "SetDisplayName failed: %08lx\n", hr); str = NULL; - hr = IAudioSessionControl2_GetDisplayName(ses1_ctl2, &str); + hr = IAudioSessionControl_GetDisplayName(ses1_ctl2, &str); ok(hr == S_OK, "GetDisplayName failed: %08lx\n", hr); ok(str && !wcscmp(str, L"WineDisplayName"), "Got %s\n", wine_dbgstr_w(str)); if (str) @@ -1742,24 +1755,24 @@ static void test_session(void) /* Test GetIconPath / SetIconPath */ - hr = IAudioSessionControl2_GetIconPath(ses1_ctl2, NULL); + hr = IAudioSessionControl_GetIconPath(ses1_ctl2, NULL); ok(hr == E_POINTER, "GetIconPath failed: %08lx\n", hr); str = NULL; - hr = IAudioSessionControl2_GetIconPath(ses1_ctl2, &str); + hr = IAudioSessionControl_GetIconPath(ses1_ctl2, &str); ok(hr == S_OK, "GetIconPath failed: %08lx\n", hr); ok(str && !wcscmp(str, L""), "Got %s\n", wine_dbgstr_w(str)); if(str) CoTaskMemFree(str); - hr = IAudioSessionControl2_SetIconPath(ses1_ctl2, NULL, NULL); + hr = IAudioSessionControl_SetIconPath(ses1_ctl2, NULL, NULL); ok(hr == HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER), "SetIconPath failed: %08lx\n", hr); - hr = IAudioSessionControl2_SetIconPath(ses1_ctl2, L"WineIconPath", NULL); + hr = IAudioSessionControl_SetIconPath(ses1_ctl2, L"WineIconPath", NULL); ok(hr == S_OK, "SetIconPath failed: %08lx\n", hr); str = NULL; - hr = IAudioSessionControl2_GetIconPath(ses1_ctl2, &str); + hr = IAudioSessionControl_GetIconPath(ses1_ctl2, &str); ok(hr == S_OK, "GetIconPath failed: %08lx\n", hr); ok(str && !wcscmp(str, L"WineIconPath"), "Got %s\n", wine_dbgstr_w(str)); if (str) @@ -1767,71 +1780,71 @@ static void test_session(void) /* Test GetGroupingParam / SetGroupingParam */ - hr = IAudioSessionControl2_GetGroupingParam(ses1_ctl2, NULL); + hr = IAudioSessionControl_GetGroupingParam(ses1_ctl2, NULL); ok(hr == HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER), "GetGroupingParam failed: %08lx\n", hr); - hr = IAudioSessionControl2_GetGroupingParam(ses1_ctl2, &guid1); + hr = IAudioSessionControl_GetGroupingParam(ses1_ctl2, &guid1); ok(hr == S_OK, "GetGroupingParam failed: %08lx\n", hr); ok(!IsEqualGUID(&guid1, &guid2), "Expected non null GUID\n"); /* MSDN is wrong here, it is not GUID_NULL */ - hr = IAudioSessionControl2_SetGroupingParam(ses1_ctl2, NULL, NULL); + hr = IAudioSessionControl_SetGroupingParam(ses1_ctl2, NULL, NULL); ok(hr == HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER), "SetGroupingParam failed: %08lx\n", hr); hr = CoCreateGuid(&guid2); ok(hr == S_OK, "CoCreateGuid failed: %08lx\n", hr); - hr = IAudioSessionControl2_SetGroupingParam(ses1_ctl2, &guid2, NULL); + hr = IAudioSessionControl_SetGroupingParam(ses1_ctl2, &guid2, NULL); ok(hr == S_OK, "SetGroupingParam failed: %08lx\n", hr); - hr = IAudioSessionControl2_GetGroupingParam(ses1_ctl2, &guid1); + hr = IAudioSessionControl_GetGroupingParam(ses1_ctl2, &guid1); ok(hr == S_OK, "GetGroupingParam failed: %08lx\n", hr); ok(IsEqualGUID(&guid1, &guid2), "Got %s\n", wine_dbgstr_guid(&guid1)); /* Test capture */ if(cap_ctl){ - hr = IAudioSessionControl2_GetState(cap_ctl, &state); + hr = IAudioSessionControl_GetState(cap_ctl, &state); ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state); hr = IAudioClient_Start(cap_ac); ok(hr == S_OK, "Start failed: %08lx\n", hr); - hr = IAudioSessionControl2_GetState(ses1_ctl, &state); + hr = IAudioSessionControl_GetState(ses1_ctl, &state); ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state); - hr = IAudioSessionControl2_GetState(ses1_ctl2, &state); + hr = IAudioSessionControl_GetState(ses1_ctl2, &state); ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state); - hr = IAudioSessionControl2_GetState(cap_ctl, &state); + hr = IAudioSessionControl_GetState(cap_ctl, &state); ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(state == AudioSessionStateActive, "Got wrong state: %d\n", state); hr = IAudioClient_Stop(cap_ac); ok(hr == S_OK, "Stop failed: %08lx\n", hr); - hr = IAudioSessionControl2_GetState(ses1_ctl, &state); + hr = IAudioSessionControl_GetState(ses1_ctl, &state); ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state); - hr = IAudioSessionControl2_GetState(ses1_ctl2, &state); + hr = IAudioSessionControl_GetState(ses1_ctl2, &state); ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state); - hr = IAudioSessionControl2_GetState(cap_ctl, &state); + hr = IAudioSessionControl_GetState(cap_ctl, &state); ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state); - ref = IAudioSessionControl2_Release(cap_ctl); + ref = IAudioSessionControl_Release(cap_ctl); ok(ref == 0, "AudioSessionControl wasn't released: %lu\n", ref); ref = IAudioClient_Release(cap_ac); ok(ref == 0, "AudioClient wasn't released: %lu\n", ref); } - ref = IAudioSessionControl2_Release(ses1_ctl); + ref = IAudioSessionControl_Release(ses1_ctl); ok(ref == 0, "AudioSessionControl wasn't released: %lu\n", ref); ref = IAudioClient_Release(ses1_ac1); @@ -1841,11 +1854,11 @@ static void test_session(void) ok(ref == 1, "AudioClient had wrong refcount: %lu\n", ref); /* we've released all of our IAudioClient references, so check GetState */ - hr = IAudioSessionControl2_GetState(ses1_ctl2, &state); + hr = IAudioSessionControl_GetState(ses1_ctl2, &state); ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state); - ref = IAudioSessionControl2_Release(ses1_ctl2); + ref = IAudioSessionControl_Release(ses1_ctl2); ok(ref == 0, "AudioSessionControl wasn't released: %lu\n", ref); CoTaskMemFree(pwfx); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9756
From: Matteo Bruni <mbruni@codeweavers.com> --- dlls/mmdevapi/session.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dlls/mmdevapi/session.c b/dlls/mmdevapi/session.c index d256aa868e6..06f662d209b 100644 --- a/dlls/mmdevapi/session.c +++ b/dlls/mmdevapi/session.c @@ -695,6 +695,7 @@ static struct audio_session *session_create(const GUID *guid, IMMDevice *device, CoCreateGuid(&ret->grouping_param); + TRACE("Created session %p\n", ret); return ret; } @@ -718,6 +719,7 @@ struct audio_session_wrapper *session_wrapper_create(struct audio_client *client IAudioClient3_AddRef(&client->IAudioClient3_iface); } + TRACE("Created session wrapper %p\n", ret); return ret; } @@ -728,7 +730,7 @@ HRESULT get_audio_session(const GUID *guid, IMMDevice *device, UINT channels, { struct audio_session *session; - TRACE("(%s, %p, %u, %p)\n", debugstr_guid(guid), device, channels, out); + TRACE("guid %s, device %p, channels %u, out %p\n", debugstr_guid(guid), device, channels, out); *out = NULL; LIST_FOR_EACH_ENTRY(session, &sessions, struct audio_session, entry) { @@ -746,6 +748,7 @@ HRESULT get_audio_session(const GUID *guid, IMMDevice *device, UINT channels, return E_OUTOFMEMORY; } + TRACE("Returning session %p\n", *out); return S_OK; } @@ -764,6 +767,7 @@ HRESULT get_audio_session_wrapper(const GUID *guid, IMMDevice *device, (*out)->session = session; + TRACE("Returning session wrapper %p, session %p\n", *out, session); return S_OK; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9756
From: Matteo Bruni <mbruni@codeweavers.com> --- dlls/mmdevapi/session.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dlls/mmdevapi/session.c b/dlls/mmdevapi/session.c index 06f662d209b..fe2bf1d86f2 100644 --- a/dlls/mmdevapi/session.c +++ b/dlls/mmdevapi/session.c @@ -703,6 +703,8 @@ struct audio_session_wrapper *session_wrapper_create(struct audio_client *client { struct audio_session_wrapper *ret; + TRACE("client %p\n", client); + ret = calloc(1, sizeof(struct audio_session_wrapper)); if (!ret) return NULL; @@ -756,8 +758,10 @@ HRESULT get_audio_session_wrapper(const GUID *guid, IMMDevice *device, struct audio_session_wrapper **out) { struct audio_session *session; - const HRESULT hr = get_audio_session(guid, device, 0, &session); + + TRACE("guid %s, device %p, out %p\n", debugstr_guid(guid), device, out); + if (FAILED(hr)) return hr; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9756
participants (2)
-
Matteo Bruni -
Matteo Bruni (@Mystral)