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: Rémi Bernon <rbernon@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
b36e4cfe2d
commit
899ae42b20
|
@ -2295,6 +2295,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:
|
||||
|
@ -2471,6 +2473,7 @@ static void session_set_source_object_state(struct media_session *session, IUnkn
|
|||
|
||||
switch (event_type)
|
||||
{
|
||||
case MESourceSeeked:
|
||||
case MESourceStarted:
|
||||
case MESourcePaused:
|
||||
case MESourceStopped:
|
||||
|
@ -2485,6 +2488,7 @@ static void session_set_source_object_state(struct media_session *session, IUnkn
|
|||
}
|
||||
}
|
||||
break;
|
||||
case MEStreamSeeked:
|
||||
case MEStreamStarted:
|
||||
case MEStreamPaused:
|
||||
case MEStreamStopped:
|
||||
|
@ -3172,6 +3176,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:
|
||||
|
|
|
@ -942,6 +942,44 @@ static void test_source_resolver(void)
|
|||
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)
|
||||
|
|
Loading…
Reference in New Issue