From: Santino Mazza smazza@codeweavers.com
This prevents hangs when a program sets a new topology after stopping the current topology, because if we don't reset the flags to 0 the session will not subscribe to the events of the new topology sources. --- dlls/mf/session.c | 1 + dlls/mf/tests/mf.c | 9 +++------ 2 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/dlls/mf/session.c b/dlls/mf/session.c index 7d6a65d3f55..8b29c8487fb 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -800,6 +800,7 @@ static void session_clear_presentation(struct media_session *session)
IMFTopology_Clear(session->presentation.current_topology); session->presentation.topo_status = MF_TOPOSTATUS_INVALID; + session->presentation.flags = 0;
LIST_FOR_EACH_ENTRY_SAFE(source, source2, &session->presentation.sources, struct media_source, entry) { diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 5e38e0a2a72..0f4c9129398 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -2710,7 +2710,7 @@ static void test_media_session_events(void) hr = IMFMediaSession_Start(session, &GUID_NULL, &propvar); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = wait_media_event_until_blocking(session, callback, MESessionStarted, 1000, &propvar); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(propvar.vt == VT_EMPTY, "got vt %u\n", propvar.vt); ok(propvar.punkVal != (IUnknown *)topology2, "got punkVal %p\n", propvar.punkVal); PropVariantClear(&propvar); @@ -2718,11 +2718,8 @@ static void test_media_session_events(void) propvar.vt = VT_EMPTY; hr = IMFMediaSession_Close(session); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine - { hr = wait_media_event_until_blocking(session, callback, MESessionClosed, 1000, &propvar); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - } ok(propvar.vt == VT_EMPTY, "got vt %u\n", propvar.vt); ok(propvar.punkVal != (IUnknown *)topology2, "got punkVal %p\n", propvar.punkVal); PropVariantClear(&propvar); @@ -2752,11 +2749,11 @@ static void test_media_session_events(void) hr = IMFMediaSource_Shutdown(source2); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ref = IMFMediaSource_Release(source2); - todo_wine ok(ref == 0, "Release returned %ld\n", ref); + ok(ref == 0, "Release returned %ld\n", ref); hr = IMFActivate_ShutdownObject(sink_activate2); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ref = IMFActivate_Release(sink_activate2); - todo_wine ok(ref == 0, "Release returned %ld\n", ref); + ok(ref == 0, "Release returned %ld\n", ref);
hr = MFShutdown(); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);