diff --git a/native/src/windows_capture.cpp b/native/src/windows_capture.cpp index 7bd2765..d625422 100644 --- a/native/src/windows_capture.cpp +++ b/native/src/windows_capture.cpp @@ -1102,15 +1102,30 @@ Napi::Value WindowsMediaGetSpotifyPlaybackState(const Napi::CallbackInfo& info) const auto timeline = session->GetTimelineProperties(); const auto mediaProperties = session->TryGetMediaPropertiesAsync().get(); - const auto positionMs = std::max( - 0, - std::chrono::duration_cast(timeline.Position()).count()); const auto durationMs = std::max( 0, std::chrono::duration_cast( timeline.EndTime() - timeline.StartTime()) .count()); + // Position() is stamped at LastUpdatedTime(); extrapolate forward when playing. + int64_t positionMs; + if (playbackInfo.PlaybackStatus() == + GlobalSystemMediaTransportControlsSessionPlaybackStatus::Playing) { + const auto elapsed = winrt::clock::now() - timeline.LastUpdatedTime(); + const auto extrapolated = timeline.Position() + elapsed; + positionMs = std::min( + durationMs, + std::max( + 0, + std::chrono::duration_cast(extrapolated).count())); + } else { + positionMs = std::max( + 0, + std::chrono::duration_cast(timeline.Position()) + .count()); + } + Napi::Object payload = Napi::Object::New(env); payload.Set( "playbackStatus",