Skip to content
Snippets Groups Projects
Commit c4ab65e1 authored by Rémi Bernon's avatar Rémi Bernon :speech_balloon: Committed by Alexandre Julliard
Browse files

mf: Handle MESourceSeeked and MEStreamSeeked state change events.


If a session is paused then started again, or if a start position is
provided we wait forever for the source to send a MESourceStarted event,
when it sends a MESourceSeeked instead.

This causes a deadlock in Bright Memory: Infinite as the game then waits
for the Start command to complete, while the session is stuck in the
SESSION_STATE_STARTING_SOURCES state.

Signed-off-by: default avatarRémi Bernon <rbernon@codeweavers.com>
Signed-off-by: default avatarNikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard's avatarAlexandre Julliard <julliard@winehq.org>
(cherry picked from commit 899ae42b)
Signed-off-by: default avatarMichael Stefaniuc <mstefani@winehq.org>
parent c0a88643
No related branches found
No related tags found
No related merge requests found
......@@ -2321,6 +2321,8 @@ static enum object_state session_get_object_state_for_event(MediaEventType event
{
switch (event)
{
case MESourceSeeked:
case MEStreamSeeked:
case MESourceStarted:
case MEStreamStarted:
case MEStreamSinkStarted:
......@@ -2497,6 +2499,7 @@ static void session_set_source_object_state(struct media_session *session, IUnkn
switch (event_type)
{
case MESourceSeeked:
case MESourceStarted:
case MESourcePaused:
case MESourceStopped:
......@@ -2511,6 +2514,7 @@ static void session_set_source_object_state(struct media_session *session, IUnkn
}
}
break;
case MEStreamSeeked:
case MEStreamStarted:
case MEStreamPaused:
case MEStreamStopped:
......@@ -3197,6 +3201,10 @@ static HRESULT WINAPI session_events_callback_Invoke(IMFAsyncCallback *iface, IM
switch (event_type)
{
case MESourceSeeked:
case MEStreamSeeked:
FIXME("Source/stream seeking, semi-stub!\n");
/* fallthrough */
case MESourceStarted:
case MESourcePaused:
case MESourceStopped:
......
......@@ -896,6 +896,44 @@ todo_wine
video_stream = (IMFMediaStream *)var.punkVal;
}
hr = IMFMediaSource_Pause(mediasource);
ok(hr == S_OK, "Failed to pause media source, hr %#x.\n", hr);
if (get_event((IMFMediaEventGenerator *)mediasource, MESourcePaused, &var))
ok(var.vt == VT_EMPTY, "Unexpected value type.\n");
var.vt = VT_EMPTY;
hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &var);
ok(hr == S_OK, "Failed to start media source, hr %#x.\n", hr);
if (get_event((IMFMediaEventGenerator *)mediasource, MESourceStarted, &var))
ok(var.vt == VT_EMPTY, "Unexpected value type.\n");
hr = IMFMediaSource_Pause(mediasource);
ok(hr == S_OK, "Failed to pause media source, hr %#x.\n", hr);
if (get_event((IMFMediaEventGenerator *)mediasource, MESourcePaused, &var))
ok(var.vt == VT_EMPTY, "Unexpected value type.\n");
var.vt = VT_I8;
var.uhVal.QuadPart = 0;
hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &var);
ok(hr == S_OK, "Failed to start media source, hr %#x.\n", hr);
if (get_event((IMFMediaEventGenerator *)mediasource, MESourceSeeked, &var))
ok(var.vt == VT_I8, "Unexpected value type.\n");
hr = IMFMediaSource_Stop(mediasource);
ok(hr == S_OK, "Failed to pause media source, hr %#x.\n", hr);
if (get_event((IMFMediaEventGenerator *)mediasource, MESourceStopped, &var))
ok(var.vt == VT_EMPTY, "Unexpected value type.\n");
var.vt = VT_I8;
var.uhVal.QuadPart = 0;
hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &var);
ok(hr == S_OK, "Failed to start media source, hr %#x.\n", hr);
if (get_event((IMFMediaEventGenerator *)mediasource, MESourceStarted, &var))
ok(var.vt == VT_I8, "Unexpected value type.\n");
sample_count = 10;
for (i = 0; i < sample_count; ++i)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment