From: Santino Mazza smazza@codeweavers.com
--- dlls/mf/session.c | 36 +++++++++++++++++----------------- dlls/mf/tests/mf.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 18 deletions(-)
diff --git a/dlls/mf/session.c b/dlls/mf/session.c index a0a3de2107c..f8b6aa7ce88 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -1859,6 +1859,24 @@ static void session_set_topology(struct media_session *session, DWORD flags, IMF IMFTopology *cloned_topology = NULL, *resolved_topology = NULL; HRESULT hr = S_OK;
+ if (flags & MFSESSION_SETTOPOLOGY_CLEAR_CURRENT) + { + if ((topology && topology == session->presentation.current_topology) || !topology) + { + /* FIXME: stop current topology, queue next one. */ + session_clear_presentation(session); + } + else + hr = S_FALSE; + + topology = NULL; + } + else if (topology && flags & MFSESSION_SETTOPOLOGY_IMMEDIATE) + { + session_clear_queued_topologies(session); + session_clear_presentation(session); + } + /* Resolve unless claimed to be full. */ if (!(flags & MFSESSION_SETTOPOLOGY_CLEAR_CURRENT) && topology) { @@ -1881,24 +1899,6 @@ static void session_set_topology(struct media_session *session, DWORD flags, IMF } }
- if (flags & MFSESSION_SETTOPOLOGY_CLEAR_CURRENT) - { - if ((topology && topology == session->presentation.current_topology) || !topology) - { - /* FIXME: stop current topology, queue next one. */ - session_clear_presentation(session); - } - else - hr = S_FALSE; - - topology = NULL; - } - else if (topology && flags & MFSESSION_SETTOPOLOGY_IMMEDIATE) - { - session_clear_queued_topologies(session); - session_clear_presentation(session); - } - session_raise_topology_set(session, topology, hr);
/* With no current topology set it right away, otherwise queue. */ diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index b8094d0073e..0be1bee456f 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -2753,6 +2753,54 @@ static void test_media_session_topologies(void) hr = wait_media_event(session, callback, MESessionStopped, 1000, &pv); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ + /* Test setting the same topology again. */ + hr = IMFMediaSession_SetTopology(session, MFSESSION_SETTOPOLOGY_IMMEDIATE, topology2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = wait_media_event(session, callback, MESessionTopologySet, 1000, &pv); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + pv.vt = VT_EMPTY; + hr = IMFMediaSession_Start(session, &GUID_NULL, &pv); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = wait_media_event(session, callback, MESessionStarted, 1000, &pv); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + pv.vt = VT_EMPTY; + hr = IMFMediaSession_Stop(session); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = wait_media_event(session, callback, MESessionStopped, 1000, &pv); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + pv.vt = VT_EMPTY; + hr = IMFMediaSession_ClearTopologies(session); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = wait_media_event(session, callback, MESessionTopologiesCleared, 1000, &pv); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMFMediaSession_SetTopology(session, MFSESSION_SETTOPOLOGY_IMMEDIATE, topology2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = wait_media_event(session, callback, MESessionTopologySet, 1000, &pv); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + pv.vt = VT_EMPTY; + hr = IMFMediaSession_Start(session, &GUID_NULL, &pv); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = wait_media_event(session, callback, MESessionStarted, 1000, &pv); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + pv.vt = VT_EMPTY; + hr = IMFMediaSession_Stop(session); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = wait_media_event(session, callback, MESessionStopped, 1000, &pv); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + pv.vt = VT_EMPTY; + hr = IMFMediaSession_ClearTopologies(session); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = wait_media_event(session, callback, MESessionTopologiesCleared, 1000, &pv); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IMFMediaSession_Shutdown(session); IMFMediaSession_Release(session); IMFAsyncCallback_Release(callback);