From b643cefdc0fccba846c545e73d342394be6d798f Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Thu, 4 Jun 2020 13:41:48 +0300 Subject: [PATCH] mfmediaengine: Update ready state property during resolution. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/mfmediaengine/main.c | 19 +++++++++++++++++-- include/mfmediaengine.idl | 9 +++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index 2f4a38936c4..fee5f6338d5 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -86,6 +86,7 @@ struct media_engine double duration; MF_MEDIA_ENGINE_ERR error_code; HRESULT extended_code; + MF_MEDIA_ENGINE_READY ready_state; IMFMediaSession *session; IMFSourceResolver *resolver; BSTR current_source; @@ -400,8 +401,13 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi else engine->duration = INFINITY; + engine->ready_state = MF_MEDIA_ENGINE_READY_HAVE_METADATA; + IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_DURATIONCHANGE, 0, 0); IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_LOADEDMETADATA, 0, 0); + + engine->ready_state = MF_MEDIA_ENGINE_READY_HAVE_ENOUGH_DATA; + IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_LOADEDDATA, 0, 0); /* TODO: set up topology nodes */ @@ -584,6 +590,8 @@ static HRESULT WINAPI media_engine_SetSource(IMFMediaEngine *iface, BSTR url) if (url) engine->current_source = SysAllocString(url); + engine->ready_state = MF_MEDIA_ENGINE_READY_HAVE_NOTHING; + IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PURGEQUEUEDEVENTS, 0, 0); if (url) @@ -671,9 +679,16 @@ static HRESULT WINAPI media_engine_CanPlayType(IMFMediaEngine *iface, BSTR type, static USHORT WINAPI media_engine_GetReadyState(IMFMediaEngine *iface) { - FIXME("(%p): stub.\n", iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); + unsigned short state; - return 0; + TRACE("%p.\n", iface); + + EnterCriticalSection(&engine->cs); + state = engine->ready_state; + LeaveCriticalSection(&engine->cs); + + return state; } static BOOL WINAPI media_engine_IsSeeking(IMFMediaEngine *iface) diff --git a/include/mfmediaengine.idl b/include/mfmediaengine.idl index 4ea3d834cf2..b914cb3600b 100644 --- a/include/mfmediaengine.idl +++ b/include/mfmediaengine.idl @@ -137,6 +137,15 @@ typedef enum MF_MEDIA_ENGINE_EVENT MF_MEDIA_ENGINE_EVENT_AUDIOENDPOINTCHANGE = 1016, } MF_MEDIA_ENGINE_EVENT; +typedef enum MF_MEDIA_ENGINE_READY +{ + MF_MEDIA_ENGINE_READY_HAVE_NOTHING, + MF_MEDIA_ENGINE_READY_HAVE_METADATA, + MF_MEDIA_ENGINE_READY_HAVE_CURRENT_DATA, + MF_MEDIA_ENGINE_READY_HAVE_FUTURE_DATA, + MF_MEDIA_ENGINE_READY_HAVE_ENOUGH_DATA, +} MF_MEDIA_ENGINE_READY; + [ object, uuid(fc0e10d2-ab2a-4501-a951-06bb1075184c),