diff --git a/modules/gui/qt/player/player_controller.cpp b/modules/gui/qt/player/player_controller.cpp
index 9f1de2b32b7e408200a4703a4b8e1e8ae82f000a..02cea2f0e657c4f37153696e08c79115ab17964d 100644
--- a/modules/gui/qt/player/player_controller.cpp
+++ b/modules/gui/qt/player/player_controller.cpp
@@ -1220,10 +1220,23 @@ void PlayerController::reverse()
 void PlayerController::setRate( float new_rate )
 {
     Q_D(PlayerController);
+
+    if (qFuzzyCompare(d->m_rate, new_rate))
+        return;
+
     msg_Dbg( d->p_intf, "setRate %f", new_rate);
     vlc_player_locker lock{ d->m_player };
     if ( vlc_player_CanChangeRate( d->m_player ) )
+    {
         vlc_player_ChangeRate( d->m_player, new_rate );
+
+        // Until the timer notifies the change, we need to still change
+        // the rate, because player timer update may take a long time.
+        // For position, it is supposed to be interpolated but for rate
+        // the new value can be taken as is:
+        d->m_rate = new_rate;
+        emit rateChanged(d->m_rate);
+    }
 }
 
 void PlayerController::slower()