From: R��mi Bernon rbernon@codeweavers.com
--- dlls/mf/session.c | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-)
diff --git a/dlls/mf/session.c b/dlls/mf/session.c index 8c6ab554f5d..991c70595d8 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -457,15 +457,7 @@ static HRESULT session_is_shut_down(struct media_session *session) return session->state == SESSION_STATE_SHUT_DOWN ? MF_E_SHUTDOWN : S_OK; }
-static void session_push_back_command(struct media_session *session, enum session_command command) -{ - struct session_op *op; - - if (SUCCEEDED(create_session_op(command, &op))) - list_add_head(&session->queued_commands, &op->entry); -} - -static HRESULT session_submit_command(struct media_session *session, struct session_op *op) +static HRESULT session_submit_command(struct media_session *session, struct session_op *op, BOOL first) { HRESULT hr;
@@ -474,7 +466,10 @@ static HRESULT session_submit_command(struct media_session *session, struct sess { if (!session->pending_command && list_empty(&session->queued_commands)) hr = MFPutWorkItem(MFASYNC_CALLBACK_QUEUE_STANDARD, &session->commands_callback, &op->IUnknown_iface); - list_add_tail(&session->queued_commands, &op->entry); + if (first) + list_add_head(&session->queued_commands, &op->entry); + else + list_add_tail(&session->queued_commands, &op->entry); IUnknown_AddRef(&op->IUnknown_iface); } LeaveCriticalSection(&session->cs); @@ -482,7 +477,7 @@ static HRESULT session_submit_command(struct media_session *session, struct sess return hr; }
-static HRESULT session_submit_simple_command(struct media_session *session, enum session_command command) +static HRESULT session_submit_simple_command(struct media_session *session, enum session_command command, BOOL first) { struct session_op *op; HRESULT hr; @@ -490,7 +485,7 @@ static HRESULT session_submit_simple_command(struct media_session *session, enum if (FAILED(hr = create_session_op(command, &op))) return hr;
- hr = session_submit_command(session, op); + hr = session_submit_command(session, op, first); IUnknown_Release(&op->IUnknown_iface); return hr; } @@ -1717,7 +1712,7 @@ static HRESULT session_set_current_topology(struct media_session *session, IMFTo { op->notify_topology.topology = topology; IMFTopology_AddRef(op->notify_topology.topology); - session_submit_command(session, op); + session_submit_command(session, op, FALSE); IUnknown_Release(&op->IUnknown_iface); } } @@ -2000,7 +1995,7 @@ static HRESULT WINAPI mfsession_SetTopology(IMFMediaSession *iface, DWORD flags, if (op->set_topology.topology) IMFTopology_AddRef(op->set_topology.topology);
- hr = session_submit_command(session, op); + hr = session_submit_command(session, op, FALSE); IUnknown_Release(&op->IUnknown_iface);
return hr; @@ -2012,7 +2007,7 @@ static HRESULT WINAPI mfsession_ClearTopologies(IMFMediaSession *iface)
TRACE("%p.\n", iface);
- return session_submit_simple_command(session, SESSION_CMD_CLEAR_TOPOLOGIES); + return session_submit_simple_command(session, SESSION_CMD_CLEAR_TOPOLOGIES, FALSE); }
static HRESULT WINAPI mfsession_Start(IMFMediaSession *iface, const GUID *format, const PROPVARIANT *start_position) @@ -2033,7 +2028,7 @@ static HRESULT WINAPI mfsession_Start(IMFMediaSession *iface, const GUID *format hr = PropVariantCopy(&op->start.start_position, start_position);
if (SUCCEEDED(hr)) - hr = session_submit_command(session, op); + hr = session_submit_command(session, op, FALSE);
IUnknown_Release(&op->IUnknown_iface); return hr; @@ -2045,7 +2040,7 @@ static HRESULT WINAPI mfsession_Pause(IMFMediaSession *iface)
TRACE("%p.\n", iface);
- return session_submit_simple_command(session, SESSION_CMD_PAUSE); + return session_submit_simple_command(session, SESSION_CMD_PAUSE, FALSE); }
static HRESULT WINAPI mfsession_Stop(IMFMediaSession *iface) @@ -2054,7 +2049,7 @@ static HRESULT WINAPI mfsession_Stop(IMFMediaSession *iface)
TRACE("%p.\n", iface);
- return session_submit_simple_command(session, SESSION_CMD_STOP); + return session_submit_simple_command(session, SESSION_CMD_STOP, FALSE); }
static HRESULT WINAPI mfsession_Close(IMFMediaSession *iface) @@ -2063,7 +2058,7 @@ static HRESULT WINAPI mfsession_Close(IMFMediaSession *iface)
TRACE("%p.\n", iface);
- return session_submit_simple_command(session, SESSION_CMD_CLOSE); + return session_submit_simple_command(session, SESSION_CMD_CLOSE, FALSE); }
static HRESULT WINAPI mfsession_Shutdown(IMFMediaSession *iface) @@ -3308,7 +3303,7 @@ static void session_raise_end_of_presentation(struct media_session *session) if (session_nodes_is_mask_set(session, MF_TOPOLOGY_MAX, SOURCE_FLAG_END_OF_PRESENTATION)) { session->presentation.flags |= SESSION_FLAG_END_OF_PRESENTATION; - session_push_back_command(session, SESSION_CMD_END); + session_submit_simple_command(session, SESSION_CMD_END, TRUE); IMFMediaEventQueue_QueueEventParamVar(session->event_queue, MEEndOfPresentation, &GUID_NULL, S_OK, NULL); } } @@ -3852,7 +3847,7 @@ static HRESULT WINAPI session_rate_control_SetRate(IMFRateControl *iface, BOOL t
op->set_rate.thin = thin; op->set_rate.rate = rate; - hr = session_submit_command(session, op); + hr = session_submit_command(session, op, FALSE); IUnknown_Release(&op->IUnknown_iface); return hr; }