Zebediah Figura : quartz: Don't pause the graph in IMediaSeeking::SetPositions if it hasn't finished running yet.

Alexandre Julliard julliard at winehq.org
Fri Jul 24 17:05:10 CDT 2020


Module: wine
Branch: master
Commit: 41a9f828704c64548e7cfc3c34804e5019d7202e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=41a9f828704c64548e7cfc3c34804e5019d7202e

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Thu Jul 23 19:29:24 2020 -0500

quartz: Don't pause the graph in IMediaSeeking::SetPositions if it hasn't finished running yet.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49604
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/quartz/filtergraph.c       |  4 ++--
 dlls/quartz/tests/filtergraph.c | 13 ++++++++++++-
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index b691fd79fc..2c32b3bc43 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -2398,7 +2398,7 @@ static HRESULT WINAPI MediaSeeking_SetPositions(IMediaSeeking *iface, LONGLONG *
     EnterCriticalSection(&graph->cs);
 
     state = graph->state;
-    if (state == State_Running)
+    if (state == State_Running && !graph->needs_async_run)
         IMediaControl_Pause(&graph->IMediaControl_iface);
 
     LIST_FOR_EACH_ENTRY(filter, &graph->filters, struct filter, entry)
@@ -2434,7 +2434,7 @@ static HRESULT WINAPI MediaSeeking_SetPositions(IMediaSeeking *iface, LONGLONG *
         graph->stream_elapsed = 0;
     }
 
-    if (state == State_Running)
+    if (state == State_Running && !graph->needs_async_run)
         IMediaControl_Run(&graph->IMediaControl_iface);
 
     LeaveCriticalSection(&graph->cs);
diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c
index 4fcd27b291..cf641a4306 100644
--- a/dlls/quartz/tests/filtergraph.c
+++ b/dlls/quartz/tests/filtergraph.c
@@ -3205,9 +3205,10 @@ static void test_filter_state(void)
     struct testpin source_pin, sink_pin;
 
     IFilterGraph2 *graph = create_graph();
-    REFERENCE_TIME start_time;
+    REFERENCE_TIME start_time, time;
     IReferenceClock *clock;
     IMediaControl *control;
+    IMediaSeeking *seeking;
     FILTER_STATE mf_state;
     IMediaFilter *filter;
     OAFilterState state;
@@ -3219,6 +3220,7 @@ static void test_filter_state(void)
     testfilter_init(&source, &source_pin, 1);
     testfilter_init(&sink, &sink_pin, 1);
     testfilter_init(&dummy, NULL, 0);
+    sink.IMediaSeeking_iface.lpVtbl = &testseek_vtbl;
 
     IFilterGraph2_QueryInterface(graph, &IID_IMediaFilter, (void **)&filter);
     IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control);
@@ -3350,6 +3352,7 @@ static void test_filter_state(void)
     graph = create_graph();
     IFilterGraph2_QueryInterface(graph, &IID_IMediaFilter, (void **)&filter);
     IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control);
+    IFilterGraph2_QueryInterface(graph, &IID_IMediaSeeking, (void **)&seeking);
 
     /* Add the filters in reverse order this time. */
     IFilterGraph2_AddFilter(graph, &sink.IBaseFilter_iface, NULL);
@@ -3511,6 +3514,13 @@ todo_wine
     ok(sink.state == State_Paused, "Got state %u.\n", sink.state);
     ok(source.state == State_Paused, "Got state %u.\n", source.state);
 
+    /* SetPositions() does not pause the graph in this case, since it is
+     * already in a paused state. */
+    time = 0;
+    hr = IMediaSeeking_SetPositions(seeking, &time, AM_SEEKING_AbsolutePositioning,
+            NULL, AM_SEEKING_NoPositioning);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
     hr = IMediaControl_Run(control);
     todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
 
@@ -3684,6 +3694,7 @@ todo_wine
     source.expect_stop_prev = sink.expect_stop_prev = State_Running;
     IMediaFilter_Release(filter);
     IMediaControl_Release(control);
+    IMediaSeeking_Release(seeking);
     ref = IFilterGraph2_Release(graph);
     ok(!ref, "Got outstanding refcount %d.\n", ref);
     ok(source.ref == 1, "Got outstanding refcount %d.\n", source.ref);




More information about the wine-cvs mailing list