Starting the session while it's already running should not resume anything.
-- v4: mf: Handle start request when session is already running.
From: Bernhard Kölbl bkoelbl@codeweavers.com
Signed-off-by: Bernhard Kölbl bkoelbl@codeweavers.com --- dlls/mf/session.c | 12 +++++++++++- dlls/mf/tests/mf.c | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/dlls/mf/session.c b/dlls/mf/session.c index 87af5b95eab..6f6c9873fc2 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -1076,15 +1076,25 @@ static void session_start(struct media_session *session, const GUID *time_format { struct media_source *source; struct topo_node *topo_node; + BOOL keep_position; MFTIME duration; HRESULT hr; UINT i;
+ keep_position = IsEqualGUID(time_format, &GUID_NULL) && start_position->vt == VT_EMPTY; + + /* No position change - nothing to do. */ + if (session->state == SESSION_STATE_STARTED && keep_position) + { + session_command_complete_with_event(session, MESessionStarted, S_OK, NULL); + return; + } + switch (session->state) { case SESSION_STATE_PAUSED: case SESSION_STATE_STARTED: - if (!IsEqualGUID(time_format, &GUID_NULL) || start_position->vt != VT_EMPTY) + if (!keep_position) { session->command_state = COMMAND_STATE_RESTARTING_SOURCES;
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index a02f2859f91..c56e59fbc6c 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -7919,6 +7919,21 @@ static void test_media_session_seek(void)
compare_object_states(&actual_object_state_record, &expected_sample_request_and_delivery_records);
+ SET_EXPECT(test_media_sink_GetPresentationClock); + SET_EXPECT(test_media_sink_GetStreamSinkCount); + + PropVariantClear(&propvar); + hr = IMFMediaSession_Start(session, NULL, &propvar); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = wait_media_event(session, callback, MESessionStarted, 1000, &propvar); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + todo_wine + CHECK_CALLED(test_media_sink_GetPresentationClock); + todo_wine + CHECK_CALLED(test_media_sink_GetStreamSinkCount); + memset(&actual_object_state_record, 0, sizeof(actual_object_state_record)); hr = IMFMediaSession_Pause(session); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
On Fri Sep 19 19:08:10 2025 +0000, Nikolay Sivov wrote:
Could we maybe use an early return like this instead. Switch is already no very readable because of a number of fallthough conditions. [session.diff](/uploads/16f7b84f7bfcb5beb33fd4d904004a5f/session.diff)
Yeah, I applied the diff, and picked a shorter variable name. :)
This merge request was approved by Nikolay Sivov.