Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfmediaengine/main.c | 46 +++++++++++++----------- dlls/mfmediaengine/tests/mfmediaengine.c | 1 - 2 files changed, 26 insertions(+), 21 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index e4263febe5e..36365f2a3cc 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -1352,29 +1352,35 @@ static HRESULT WINAPI media_engine_SetSource(IMFMediaEngine *iface, BSTR url)
EnterCriticalSection(&engine->cs);
- SysFreeString(engine->current_source); - engine->current_source = NULL; - 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) + if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) + hr = MF_E_SHUTDOWN; + else { - IPropertyStore *props = NULL; - unsigned int flags; + SysFreeString(engine->current_source); + engine->current_source = NULL; + if (url) + engine->current_source = SysAllocString(url); + + engine->ready_state = MF_MEDIA_ENGINE_READY_HAVE_NOTHING;
- flags = MF_RESOLUTION_MEDIASOURCE; - if (engine->flags & MF_MEDIA_ENGINE_DISABLE_LOCAL_PLUGINS) - flags |= MF_RESOLUTION_DISABLE_LOCAL_PLUGINS; + IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PURGEQUEUEDEVENTS, 0, 0);
- IMFAttributes_GetUnknown(engine->attributes, &MF_MEDIA_ENGINE_SOURCE_RESOLVER_CONFIG_STORE, - &IID_IPropertyStore, (void **)&props); - hr = IMFSourceResolver_BeginCreateObjectFromURL(engine->resolver, url, flags, props, NULL, &engine->load_handler, NULL); - if (props) - IPropertyStore_Release(props); + if (url) + { + IPropertyStore *props = NULL; + unsigned int flags; + + flags = MF_RESOLUTION_MEDIASOURCE; + if (engine->flags & MF_MEDIA_ENGINE_DISABLE_LOCAL_PLUGINS) + flags |= MF_RESOLUTION_DISABLE_LOCAL_PLUGINS; + + IMFAttributes_GetUnknown(engine->attributes, &MF_MEDIA_ENGINE_SOURCE_RESOLVER_CONFIG_STORE, + &IID_IPropertyStore, (void **)&props); + hr = IMFSourceResolver_BeginCreateObjectFromURL(engine->resolver, url, flags, props, NULL, + &engine->load_handler, NULL); + if (props) + IPropertyStore_Release(props); + } }
LeaveCriticalSection(&engine->cs); diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c index 66984595d3b..096f6e3f2a5 100644 --- a/dlls/mfmediaengine/tests/mfmediaengine.c +++ b/dlls/mfmediaengine/tests/mfmediaengine.c @@ -253,7 +253,6 @@ static void test_Shutdown(void) ok(hr == MF_E_SHUTDOWN || broken(hr == S_OK) /* before win10 */, "Unexpected hr %#x.\n", hr);
hr = IMFMediaEngine_SetSource(media_engine, NULL); -todo_wine ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
hr = IMFMediaEngine_GetCurrentSource(media_engine, &str);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfmediaengine/main.c | 17 ++++++++++++++--- include/mfmediaengine.idl | 8 ++++++++ 2 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index 36365f2a3cc..bd3fd04aabd 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -126,6 +126,7 @@ struct media_engine double default_playback_rate; double volume; double duration; + MF_MEDIA_ENGINE_NETWORK network_state; MF_MEDIA_ENGINE_ERR error_code; HRESULT extended_code; MF_MEDIA_ENGINE_READY ready_state; @@ -1190,6 +1191,7 @@ static HRESULT WINAPI media_engine_load_handler_Invoke(IMFAsyncCallback *iface,
EnterCriticalSection(&engine->cs);
+ engine->network_state = MF_MEDIA_ENGINE_NETWORK_LOADING; IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_LOADSTART, 0, 0);
if (FAILED(hr = IMFSourceResolver_EndCreateObjectFromURL(engine->resolver, result, &obj_type, &object))) @@ -1205,8 +1207,13 @@ static HRESULT WINAPI media_engine_load_handler_Invoke(IMFAsyncCallback *iface, IUnknown_Release(object); }
- if (FAILED(hr)) + if (SUCCEEDED(hr)) { + engine->network_state = MF_MEDIA_ENGINE_NETWORK_IDLE; + } + else + { + engine->network_state = MF_MEDIA_ENGINE_NETWORK_NO_SOURCE; engine->error_code = MF_MEDIA_ENGINE_ERR_SRC_NOT_SUPPORTED; engine->extended_code = hr; IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_ERROR, engine->error_code, @@ -1365,6 +1372,8 @@ static HRESULT WINAPI media_engine_SetSource(IMFMediaEngine *iface, BSTR url)
IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PURGEQUEUEDEVENTS, 0, 0);
+ engine->network_state = MF_MEDIA_ENGINE_NETWORK_NO_SOURCE; + if (url) { IPropertyStore *props = NULL; @@ -1410,9 +1419,11 @@ static HRESULT WINAPI media_engine_GetCurrentSource(IMFMediaEngine *iface, BSTR
static USHORT WINAPI media_engine_GetNetworkState(IMFMediaEngine *iface) { - FIXME("(%p): stub.\n", iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); + + TRACE("%p.\n", iface);
- return 0; + return engine->network_state; }
static MF_MEDIA_ENGINE_PRELOAD WINAPI media_engine_GetPreload(IMFMediaEngine *iface) diff --git a/include/mfmediaengine.idl b/include/mfmediaengine.idl index c00e364116e..aaf3bb55e4d 100644 --- a/include/mfmediaengine.idl +++ b/include/mfmediaengine.idl @@ -50,6 +50,14 @@ cpp_quote("EXTERN_GUID(MF_MEDIA_ENGINE_TELEMETRY_APPLICATION_ID, 0x1e7 cpp_quote("EXTERN_GUID(MF_MEDIA_ENGINE_TRACK_ID, 0x65bea312, 0x4043, 0x4815, 0x8e, 0xab, 0x44, 0xdc, 0xe2, 0xef, 0x8f, 0x2a);") cpp_quote("EXTERN_GUID(MF_MEDIA_ENGINE_VIDEO_OUTPUT_FORMAT, 0x5066893c, 0x8cf9, 0x42bc, 0x8b, 0x8a, 0x47, 0x22, 0x12, 0xe5, 0x27, 0x26);")
+typedef enum MF_MEDIA_ENGINE_NETWORK +{ + MF_MEDIA_ENGINE_NETWORK_EMPTY, + MF_MEDIA_ENGINE_NETWORK_IDLE, + MF_MEDIA_ENGINE_NETWORK_LOADING, + MF_MEDIA_ENGINE_NETWORK_NO_SOURCE +} MF_MEDIA_ENGINE_NETWORK; + typedef enum MF_MEDIA_ENGINE_ERR { MF_MEDIA_ENGINE_ERR_NOERROR,