From: Paul Gofman pgofman@codeweavers.com
--- dlls/mmdevapi/audiosessionmanager.c | 101 +++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 2 deletions(-)
diff --git a/dlls/mmdevapi/audiosessionmanager.c b/dlls/mmdevapi/audiosessionmanager.c index 5486b3fa40c..99aa6ac4959 100644 --- a/dlls/mmdevapi/audiosessionmanager.c +++ b/dlls/mmdevapi/audiosessionmanager.c @@ -48,6 +48,101 @@ void sessions_unlock(void) LeaveCriticalSection(&g_sessions_lock); }
+struct session_enum +{ + IAudioSessionEnumerator IAudioSessionEnumerator_iface; + LONG ref; +}; + +static struct session_enum *impl_from_IAudioSessionEnumerator(IAudioSessionEnumerator *iface) +{ + return CONTAINING_RECORD(iface, struct session_enum, IAudioSessionEnumerator_iface); +} + +static HRESULT WINAPI enumerator_QueryInterface(IAudioSessionEnumerator *iface, REFIID riid, void **ppv) +{ + struct session_enum *enumerator = impl_from_IAudioSessionEnumerator(iface); + + TRACE("(%p)->(%s, %p)\n", enumerator, debugstr_guid(riid), ppv); + + if (!ppv) + return E_POINTER; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IAudioSessionEnumerator)) + *ppv = &enumerator->IAudioSessionEnumerator_iface; + else { + WARN("Unknown iface %s.\n", debugstr_guid(riid)); + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown *)*ppv); + + return S_OK; +} + +static ULONG WINAPI enumerator_AddRef(IAudioSessionEnumerator *iface) +{ + struct session_enum *enumerator = impl_from_IAudioSessionEnumerator(iface); + ULONG ref = InterlockedIncrement(&enumerator->ref); + TRACE("(%p) new ref %lu\n", enumerator, ref); + return ref; +} + +static ULONG WINAPI enumerator_Release(IAudioSessionEnumerator *iface) +{ + struct session_enum *enumerator = impl_from_IAudioSessionEnumerator(iface); + ULONG ref = InterlockedDecrement(&enumerator->ref); + TRACE("(%p) new ref %lu\n", enumerator, ref); + + if (!ref) + free(enumerator); + + return ref; +} + +static HRESULT WINAPI enumerator_GetCount(IAudioSessionEnumerator *iface, int *count) +{ + FIXME("%p -> %p stub.\n", iface, count); + + if (!count) return E_POINTER; + + *count = 0; + return E_NOTIMPL; +} + +static HRESULT WINAPI enumerator_GetSession(IAudioSessionEnumerator *iface, int index, IAudioSessionControl **session) +{ + FIXME("%p -> %d %p stub.\n", iface, index, session); + + if (!session) return E_POINTER; + *session = NULL; + return E_NOTIMPL; +} + +static const IAudioSessionEnumeratorVtbl IAudioSessionEnumerator_vtbl = +{ + enumerator_QueryInterface, + enumerator_AddRef, + enumerator_Release, + enumerator_GetCount, + enumerator_GetSession, +}; + +static HRESULT create_session_enumerator(IAudioSessionEnumerator **ppv) +{ + struct session_enum *enumerator; + + if (!(enumerator = calloc(1, sizeof(*enumerator)))) + return E_OUTOFMEMORY; + + enumerator->IAudioSessionEnumerator_iface.lpVtbl = &IAudioSessionEnumerator_vtbl; + enumerator->ref = 1; + *ppv = &enumerator->IAudioSessionEnumerator_iface; + return S_OK; +} + static inline struct session_mgr *impl_from_IAudioSessionManager2(IAudioSessionManager2 *iface) { return CONTAINING_RECORD(iface, struct session_mgr, IAudioSessionManager2_iface); @@ -137,8 +232,10 @@ static HRESULT WINAPI ASM_GetSessionEnumerator(IAudioSessionManager2 *iface, IAudioSessionEnumerator **out) { struct session_mgr *This = impl_from_IAudioSessionManager2(iface); - FIXME("(%p)->(%p) - stub\n", This, out); - return E_NOTIMPL; + + TRACE("(%p)->(%p).\n", This, out); + + return create_session_enumerator(out); }
static HRESULT WINAPI ASM_RegisterSessionNotification(IAudioSessionManager2 *iface,