[PATCH 2/9] mfplay: Create per-player session instance.

Nikolay Sivov nsivov at codeweavers.com
Wed Apr 7 03:07:00 CDT 2021


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mfplay/player.c | 51 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/dlls/mfplay/player.c b/dlls/mfplay/player.c
index 479aca40890..6fbbc0f4632 100644
--- a/dlls/mfplay/player.c
+++ b/dlls/mfplay/player.c
@@ -63,10 +63,12 @@ struct media_player
     IPropertyStore IPropertyStore_iface;
     IMFAsyncCallback resolver_callback;
     IMFAsyncCallback events_callback;
+    IMFAsyncCallback session_events_callback;
     LONG refcount;
     IMFPMediaPlayerCallback *callback;
     IPropertyStore *propstore;
     IMFSourceResolver *resolver;
+    IMFMediaSession *session;
     MFP_CREATION_OPTIONS options;
     HWND event_window;
     HWND output_window;
@@ -121,6 +123,11 @@ static struct media_player *impl_from_events_IMFAsyncCallback(IMFAsyncCallback *
     return CONTAINING_RECORD(iface, struct media_player, events_callback);
 }
 
+static struct media_player *impl_from_session_events_IMFAsyncCallback(IMFAsyncCallback *iface)
+{
+    return CONTAINING_RECORD(iface, struct media_player, session_events_callback);
+}
+
 static struct media_item *impl_from_IMFPMediaItem(IMFPMediaItem *iface)
 {
     return CONTAINING_RECORD(iface, struct media_item, IMFPMediaItem_iface);
@@ -618,6 +625,8 @@ static ULONG WINAPI media_player_Release(IMFPMediaPlayer *iface)
             IPropertyStore_Release(player->propstore);
         if (player->resolver)
             IMFSourceResolver_Release(player->resolver);
+        if (player->session)
+            IMFMediaSession_Release(player->session);
         DestroyWindow(player->event_window);
         heap_free(player);
 
@@ -1170,6 +1179,43 @@ static const IMFAsyncCallbackVtbl media_player_events_callback_vtbl =
     media_player_events_callback_Invoke,
 };
 
+static ULONG WINAPI media_player_session_events_callback_AddRef(IMFAsyncCallback *iface)
+{
+    struct media_player *player = impl_from_session_events_IMFAsyncCallback(iface);
+    return IMFPMediaPlayer_AddRef(&player->IMFPMediaPlayer_iface);
+}
+
+static ULONG WINAPI media_player_session_events_callback_Release(IMFAsyncCallback *iface)
+{
+    struct media_player *player = impl_from_session_events_IMFAsyncCallback(iface);
+    return IMFPMediaPlayer_Release(&player->IMFPMediaPlayer_iface);
+}
+
+static HRESULT WINAPI media_player_session_events_callback_Invoke(IMFAsyncCallback *iface,
+        IMFAsyncResult *result)
+{
+    struct media_player *player = impl_from_session_events_IMFAsyncCallback(iface);
+    IMFMediaEvent *event;
+    HRESULT hr;
+
+    if (FAILED(hr = IMFMediaSession_EndGetEvent(player->session, result, &event)))
+        return S_OK;
+
+    IMFMediaSession_BeginGetEvent(player->session, &player->session_events_callback, NULL);
+    IMFMediaEvent_Release(event);
+
+    return S_OK;
+}
+
+static const IMFAsyncCallbackVtbl media_player_session_events_callback_vtbl =
+{
+    media_player_callback_QueryInterface,
+    media_player_session_events_callback_AddRef,
+    media_player_session_events_callback_Release,
+    media_player_callback_GetParameters,
+    media_player_session_events_callback_Invoke,
+};
+
 HRESULT WINAPI MFPCreateMediaPlayer(const WCHAR *url, BOOL start_playback, MFP_CREATION_OPTIONS options,
         IMFPMediaPlayerCallback *callback, HWND window, IMFPMediaPlayer **player)
 {
@@ -1187,6 +1233,7 @@ HRESULT WINAPI MFPCreateMediaPlayer(const WCHAR *url, BOOL start_playback, MFP_C
     object->IPropertyStore_iface.lpVtbl = &media_player_propstore_vtbl;
     object->resolver_callback.lpVtbl = &media_player_resolver_callback_vtbl;
     object->events_callback.lpVtbl = &media_player_events_callback_vtbl;
+    object->session_events_callback.lpVtbl = &media_player_session_events_callback_vtbl;
     object->refcount = 1;
     object->callback = callback;
     if (object->callback)
@@ -1197,6 +1244,10 @@ HRESULT WINAPI MFPCreateMediaPlayer(const WCHAR *url, BOOL start_playback, MFP_C
         goto failed;
     if (FAILED(hr = MFCreateSourceResolver(&object->resolver)))
         goto failed;
+    if (FAILED(hr = MFCreateMediaSession(NULL, &object->session)))
+        goto failed;
+    if (FAILED(hr = IMFMediaSession_BeginGetEvent(object->session, &object->session_events_callback, NULL)))
+        goto failed;
     if (!(object->options & MFP_OPTION_FREE_THREADED_CALLBACK))
     {
         object->event_window = CreateWindowW(eventclassW, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE,
-- 
2.30.2




More information about the wine-devel mailing list