[PATCH 1/5] mf/session: Send failed event when clearing topologies from closed state.

Nikolay Sivov nsivov at codeweavers.com
Wed Jun 23 06:03:02 CDT 2021


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mf/session.c | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/dlls/mf/session.c b/dlls/mf/session.c
index 8d9325abc53..76c39631bd9 100644
--- a/dlls/mf/session.c
+++ b/dlls/mf/session.c
@@ -502,7 +502,7 @@ static HRESULT session_submit_simple_command(struct media_session *session, enum
     return hr;
 }
 
-static void session_clear_topologies(struct media_session *session)
+static void session_clear_queued_topologies(struct media_session *session)
 {
     struct queued_topology *ptr, *next;
 
@@ -1055,10 +1055,24 @@ static void session_close(struct media_session *session)
             break;
     }
 
+    session_clear_queued_topologies(session);
     if (FAILED(hr))
         session_set_closed(session, hr);
 }
 
+static void session_clear_topologies(struct media_session *session)
+{
+    HRESULT hr = S_OK;
+
+    if (session->state == SESSION_STATE_CLOSED)
+        hr = MF_E_INVALIDREQUEST;
+    else
+        session_clear_queued_topologies(session);
+    IMFMediaEventQueue_QueueEventParamVar(session->event_queue, MESessionTopologiesCleared,
+            &GUID_NULL, hr, NULL);
+    session_command_complete(session);
+}
+
 static struct media_source *session_get_media_source(struct media_session *session, IMFMediaSource *source)
 {
     struct media_source *cur;
@@ -1561,7 +1575,7 @@ static void session_set_topology(struct media_session *session, DWORD flags, IMF
     }
     else if (topology && flags & MFSESSION_SETTOPOLOGY_IMMEDIATE)
     {
-        session_clear_topologies(session);
+        session_clear_queued_topologies(session);
         session_clear_presentation(session);
     }
 
@@ -1636,7 +1650,7 @@ static ULONG WINAPI mfsession_Release(IMFMediaSession *iface)
 
     if (!refcount)
     {
-        session_clear_topologies(session);
+        session_clear_queued_topologies(session);
         session_clear_presentation(session);
         session_clear_command_list(session);
         if (session->presentation.current_topology)
@@ -2079,9 +2093,6 @@ static HRESULT WINAPI session_commands_callback_Invoke(IMFAsyncCallback *iface,
     {
         case SESSION_CMD_CLEAR_TOPOLOGIES:
             session_clear_topologies(session);
-            IMFMediaEventQueue_QueueEventParamVar(session->event_queue, MESessionTopologiesCleared, &GUID_NULL,
-                    S_OK, NULL);
-            session_command_complete(session);
             break;
         case SESSION_CMD_SET_TOPOLOGY:
             session_set_topology(session, op->u.set_topology.flags, op->u.set_topology.topology);
-- 
2.30.2




More information about the wine-devel mailing list