diff --git a/src/detection/media/media_windows.cpp b/src/detection/media/media_windows.cpp index 10d9ee5d3..927549b24 100644 --- a/src/detection/media/media_windows.cpp +++ b/src/detection/media/media_windows.cpp @@ -244,9 +244,12 @@ static const char* getMedia(FFMediaResult* result, bool saveCover) { abi_t* FF_AUTO_RELEASE_COM_OBJECT playbackInfo = NULL; hr = session->GetPlaybackInfo(reinterpret_cast(&playbackInfo)); + bool isPlaying = false; + double playbackRate = 1.0; if (SUCCEEDED(hr) && playbackInfo) { int32_t playbackStatusValue = 0; if (SUCCEEDED(playbackInfo->get_PlaybackStatus(&playbackStatusValue))) { + isPlaying = playbackStatusValue == static_cast(winrt::Windows::Media::Control::GlobalSystemMediaTransportControlsSessionPlaybackStatus::Playing); switch (static_cast(playbackStatusValue)) { #define FF_MEDIA_SET_STATUS(status_code) \ case winrt::Windows::Media::Control::GlobalSystemMediaTransportControlsSessionPlaybackStatus::status_code: \ @@ -261,6 +264,13 @@ static const char* getMedia(FFMediaResult* result, bool saveCover) { #undef FF_MEDIA_SET_STATUS } } + + abi_t>* FF_AUTO_RELEASE_COM_OBJECT playbackRateRef = NULL; + if (SUCCEEDED(playbackInfo->get_PlaybackRate(reinterpret_cast(&playbackRateRef))) && playbackRateRef) { + if (SUCCEEDED(playbackRateRef->get_Value(&playbackRate)) && playbackRate < 0.0) { + playbackRate = 0.0; + } + } } FF_A_CLEANUP(deleteHstring) HSTRING playerId = NULL; @@ -287,6 +297,29 @@ static const char* getMedia(FFMediaResult* result, bool saveCover) { ffStrbufSetHstring(&result->album, album); } + abi_t* FF_AUTO_RELEASE_COM_OBJECT timelineProps = NULL; + hr = session->GetTimelineProperties(reinterpret_cast(&timelineProps)); + if (SUCCEEDED(hr) && timelineProps) { + int64_t duration = 0; + if (SUCCEEDED(timelineProps->get_EndTime(&duration)) && duration > 0) { + result->length = (uint32_t) (duration / 10000); // Convert from 100-nanosecond units to milliseconds + + int64_t position = 0; + if (SUCCEEDED(timelineProps->get_Position(&position))) { + result->position = (uint32_t) (position / 10000); // Convert from 100-nanosecond units to milliseconds + + int64_t lastUpdatedTime = 0; + if (isPlaying && SUCCEEDED(timelineProps->get_LastUpdatedTime(&lastUpdatedTime)) && lastUpdatedTime > 0) { + uint64_t lastUpdatedTimeMs = ffFileTimeToUnixMs((uint64_t) lastUpdatedTime); + uint64_t nowMs = ffTimeGetNow(); + if (nowMs > lastUpdatedTimeMs) { + result->position += (uint32_t) (((double) (nowMs - lastUpdatedTimeMs)) * playbackRate); + } + } + } + } + } + abi_t* FF_AUTO_RELEASE_COM_OBJECT appInfoStatics = NULL; hr = ffGetActivationFactory(L"Windows.ApplicationModel.AppInfo", winrt::guid_of(), &appInfoStatics); if (SUCCEEDED(hr) && appInfoStatics) {