From: Fabian Maurer dark.shadow4@web.de
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=56763 --- dlls/mmdevapi/mmdevdrv.h | 2 ++ dlls/mmdevapi/session.c | 37 +++++++++++++++++++++++++++++++----- dlls/mmdevapi/tests/render.c | 7 ------- 3 files changed, 34 insertions(+), 12 deletions(-)
diff --git a/dlls/mmdevapi/mmdevdrv.h b/dlls/mmdevapi/mmdevdrv.h index 1f4d65e4436..115c5e32fcc 100644 --- a/dlls/mmdevapi/mmdevdrv.h +++ b/dlls/mmdevapi/mmdevdrv.h @@ -30,6 +30,8 @@ typedef struct audio_session { float *channel_vols; BOOL mute;
+ WCHAR *display_name; + struct list entry; } AudioSession;
diff --git a/dlls/mmdevapi/session.c b/dlls/mmdevapi/session.c index 9a36adb5bf2..d4948e3b141 100644 --- a/dlls/mmdevapi/session.c +++ b/dlls/mmdevapi/session.c @@ -37,6 +37,15 @@ 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""; + int len = (wcslen(source) + 1) * sizeof(WCHAR); + WCHAR *ret = CoTaskMemAlloc(len); + memcpy(ret, source, len); + return ret; +} + extern void set_stream_volumes(struct audio_client *This);
static struct list sessions = LIST_INIT(sessions); @@ -144,16 +153,34 @@ static HRESULT WINAPI control_GetState(IAudioSessionControl2 *iface, AudioSessio static HRESULT WINAPI control_GetDisplayName(IAudioSessionControl2 *iface, WCHAR **name) { struct audio_session_wrapper *This = impl_from_IAudioSessionControl2(iface); - FIXME("(%p)->(%p) - stub\n", This, name); - return E_NOTIMPL; + struct audio_session *session = This->session; + + TRACE("(%p)->(%p) - stub\n", This, name); + + if (!name) + return E_POINTER; + + *name = duplicate_wstr(session->display_name); + + return S_OK; }
static HRESULT WINAPI control_SetDisplayName(IAudioSessionControl2 *iface, const WCHAR *name, - const GUID *session) + const GUID *event_context) { struct audio_session_wrapper *This = impl_from_IAudioSessionControl2(iface); - FIXME("(%p)->(%p, %s) - stub\n", This, name, debugstr_guid(session)); - return E_NOTIMPL; + struct audio_session *session = This->session; + + TRACE("(%p)->(%p, %s) - stub\n", This, name, debugstr_guid(event_context)); + FIXME("Ignoring event_context\n"); + + if (!name) + return HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER); + + free(session->display_name); + session->display_name = wcsdup(name); + + return S_OK; }
static HRESULT WINAPI control_GetIconPath(IAudioSessionControl2 *iface, WCHAR **path) diff --git a/dlls/mmdevapi/tests/render.c b/dlls/mmdevapi/tests/render.c index 23ff0892dfe..6d76bff8b22 100644 --- a/dlls/mmdevapi/tests/render.c +++ b/dlls/mmdevapi/tests/render.c @@ -1580,31 +1580,24 @@ static void test_session(void) /* Test GetDisplayName / SetDisplayName */
hr = IAudioSessionControl2_GetDisplayName(ses1_ctl2, NULL); - todo_wine ok(hr == E_POINTER, "GetDisplayName failed: %08lx\n", hr);
str = NULL; hr = IAudioSessionControl2_GetDisplayName(ses1_ctl2, &str); - todo_wine ok(hr == S_OK, "GetDisplayName failed: %08lx\n", hr); - todo_wine ok(str && !wcscmp(str, L""), "Got %s\n", wine_dbgstr_w(str)); if (str) CoTaskMemFree(str);
hr = IAudioSessionControl2_SetDisplayName(ses1_ctl2, NULL, NULL); - todo_wine ok(hr == HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER), "SetDisplayName failed: %08lx\n", hr);
hr = IAudioSessionControl2_SetDisplayName(ses1_ctl2, L"WineDisplayName", NULL); - todo_wine ok(hr == S_OK, "SetDisplayName failed: %08lx\n", hr);
str = NULL; hr = IAudioSessionControl2_GetDisplayName(ses1_ctl2, &str); - todo_wine ok(hr == S_OK, "GetDisplayName failed: %08lx\n", hr); - todo_wine ok(str && !wcscmp(str, L"WineDisplayName"), "Got %s\n", wine_dbgstr_w(str)); if (str) CoTaskMemFree(str);