[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