diff --git a/selfdrive/ui/replay/replay.cc b/selfdrive/ui/replay/replay.cc index 532b3daf80..6655f74ed1 100644 --- a/selfdrive/ui/replay/replay.cc +++ b/selfdrive/ui/replay/replay.cc @@ -88,6 +88,7 @@ void Replay::seekTo(int seconds, bool relative) { if (segments_.empty()) return; bool segment_loaded = false; + bool segment_changed = false; updateEvents([&]() { if (relative) { seconds += ((cur_mono_time_ - route_start_ts_) * 1e-9); @@ -95,14 +96,13 @@ void Replay::seekTo(int seconds, bool relative) { qInfo() << "seeking to" << seconds; cur_mono_time_ = route_start_ts_ + std::clamp(seconds, 0, (int)segments_.size() * 60) * 1e9; - current_segment_ = std::min(seconds / 60, (int)segments_.size() - 1); - segment_loaded = std::find(segments_merged_.begin(), segments_merged_.end(), current_segment_) != segments_merged_.end(); + int segment = std::min(seconds / 60, (int)segments_.size() - 1); + segment_changed = current_segment_.exchange(segment) != segment; + segment_loaded = std::find(segments_merged_.begin(), segments_merged_.end(), segment) != segments_merged_.end(); return segment_loaded; }); - if (!segment_loaded) { - // always emit segmentChanged if segment is not loaded. - // the current_segment_ may not valid when seeking cross boundary or seeking to an invalid segment. + if (segment_changed || !segment_loaded) { emit segmentChanged(); } }