From: Brendan McGrath <bmcgrath@codeweavers.com> Windows waits until it receives the MEStreamStarted event(s) before subscribing to the sink event queues. --- dlls/mf/session.c | 37 +++++++++++++++++++++++++------------ dlls/mf/tests/mf.c | 7 ------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/dlls/mf/session.c b/dlls/mf/session.c index 0e263993deb..c0c1d5ac27f 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -235,6 +235,7 @@ enum presentation_flags SESSION_FLAG_PENDING_RATE_CHANGE = 0x20, SESSION_FLAG_RESTARTING = 0x40, SESSION_FLAG_PRESENTATION_ENDING = 0x80, + SESSION_FLAG_SINKS_SUBSCRIBED = 0x100, }; struct media_session @@ -1015,6 +1016,29 @@ static HRESULT session_subscribe_sources(struct media_session *session) return hr; } +static void session_subscribe_sinks(struct media_session *session) +{ + struct topo_node *node; + HRESULT hr; + + if (session->presentation.flags & SESSION_FLAG_SINKS_SUBSCRIBED) + return; + + LIST_FOR_EACH_ENTRY(node, &session->presentation.nodes, struct topo_node, entry) + { + if (node->type != MF_TOPOLOGY_OUTPUT_NODE) + continue; + + if (FAILED(hr = IMFStreamSink_BeginGetEvent(node->object.sink_stream, &session->events_callback, + node->object.object))) + { + WARN("Failed to subscribe to stream sink events, hr %#lx.\n", hr); + } + } + + session->presentation.flags |= SESSION_FLAG_SINKS_SUBSCRIBED; +} + static void session_flush_transforms(struct media_session *session) { struct topo_node *node; @@ -1498,18 +1522,6 @@ static void session_set_presentation_clock(struct media_session *session) if (FAILED(hr)) WARN("Failed to set time source, hr %#lx.\n", hr); - LIST_FOR_EACH_ENTRY(node, &session->presentation.nodes, struct topo_node, entry) - { - if (node->type != MF_TOPOLOGY_OUTPUT_NODE) - continue; - - if (FAILED(hr = IMFStreamSink_BeginGetEvent(node->object.sink_stream, &session->events_callback, - node->object.object))) - { - WARN("Failed to subscribe to stream sink events, hr %#lx.\n", hr); - } - } - /* Set clock for all topology nodes. */ LIST_FOR_EACH_ENTRY(source, &session->presentation.sources, struct media_source, entry) { @@ -3210,6 +3222,7 @@ static void session_set_source_object_state(struct media_session *session, IUnkn } } + session_subscribe_sinks(session); session_set_presentation_clock(session); if (session->presentation.rate != 0.0f && (session->presentation.flags & SESSION_FLAG_NEEDS_PREROLL) diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 87fab4ddbed..1839e02e1ba 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -3144,13 +3144,6 @@ static void test_media_session_events(void) test_handler_clear_current_type(handler); - if (winetest_platform_is_wine) - { - todo_wine - ok(0, "This test currently crashes under wine.\n"); - goto skip_invalid; - } - IMFMediaSession_Release(session); /* test sample request from sink prior to starting sources */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10053