[PATCH 2/3] mfplay: Implement MFP_EVENT_TYPE_PLAYBACK_ENDED event.
Nikolay Sivov
nsivov at codeweavers.com
Tue Apr 20 04:06:00 CDT 2021
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/mfplay/player.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/dlls/mfplay/player.c b/dlls/mfplay/player.c
index d6ed6ef5c39..be51ef2d2e1 100644
--- a/dlls/mfplay/player.c
+++ b/dlls/mfplay/player.c
@@ -1605,6 +1605,21 @@ static void media_player_create_forward_event(struct media_player *player, HRESU
LeaveCriticalSection(&player->cs);
}
+static void media_player_create_playback_ended_event(struct media_player *player, HRESULT event_status,
+ struct media_event **event)
+{
+ EnterCriticalSection(&player->cs);
+
+ if (SUCCEEDED(media_event_create(player, MFP_EVENT_TYPE_PLAYBACK_ENDED, event_status, player->item, event)))
+ {
+ if (player->item)
+ IMFPMediaItem_Release(player->item);
+ player->item = NULL;
+ }
+
+ LeaveCriticalSection(&player->cs);
+}
+
static HRESULT WINAPI media_player_session_events_callback_Invoke(IMFAsyncCallback *iface,
IMFAsyncResult *result)
{
@@ -1616,6 +1631,7 @@ static HRESULT WINAPI media_player_session_events_callback_Invoke(IMFAsyncCallba
HRESULT hr, event_status;
IMFPMediaItem *item = NULL;
IMFTopology *topology;
+ unsigned int status;
PROPVARIANT value;
if (FAILED(hr = IMFMediaSession_EndGetEvent(player->session, result, &session_event)))
@@ -1661,6 +1677,16 @@ static HRESULT WINAPI media_player_session_events_callback_Invoke(IMFAsyncCallba
break;
+ case MESessionTopologyStatus:
+
+ if (SUCCEEDED(IMFMediaEvent_GetUINT32(session_event, &MF_EVENT_TOPOLOGY_STATUS, &status)) &&
+ status == MF_TOPOSTATUS_ENDED)
+ {
+ media_player_create_playback_ended_event(player, event_status, &event);
+ }
+
+ break;
+
case MEBufferingStarted:
case MEBufferingStopped:
case MEExtendedType:
--
2.30.2
More information about the wine-devel
mailing list