improve poll logic
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 21 Jul 2024 23:02:44 +0000 (01:02 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 21 Jul 2024 23:02:44 +0000 (01:02 +0200)
music_assistant/common/models/player.py
music_assistant/server/controllers/players.py

index 71610683d683d0b50ec0cbf38b47abf636692bbf..5ee0e07c2de1b9ff5be2d6058fd697e3d943fffb 100644 (file)
@@ -131,6 +131,9 @@ class Player(DataClassDictMixin):
     # announcement_in_progress boolean to indicate there's an announcement in progress.
     announcement_in_progress: bool = False
 
+    # last_poll: when was the player last polled (used with needs_poll)
+    last_poll: float = 0
+
     @property
     def corrected_elapsed_time(self) -> float:
         """Return the corrected/realtime elapsed time."""
index 3d46f1719c68bf0bb773cb8cd43b01d182493049..c9beeafa35a3c0d26f397e67cbe3e507113906e2 100644 (file)
@@ -1014,9 +1014,7 @@ class PlayerController(CoreController):
 
     async def _poll_players(self) -> None:
         """Background task that polls players for updates."""
-        count = 0
         while True:
-            count += 1
             for player in list(self._players.values()):
                 player_id = player.player_id
                 # if the player is playing, update elapsed time every tick
@@ -1029,9 +1027,10 @@ class PlayerController(CoreController):
                 # Poll player;
                 if not player.needs_poll:
                     continue
-                if count % player.poll_interval == 0 and (
-                    player_prov := self.get_player_provider(player_id)
-                ):
+                if (self.mass.loop.time() - player.last_poll) < player.poll_interval:
+                    continue
+                player.last_poll = self.mass.loop.time()
+                if player_prov := self.get_player_provider(player_id):
                     try:
                         await player_prov.poll_player(player_id)
                     except PlayerUnavailableError:
@@ -1048,8 +1047,6 @@ class PlayerController(CoreController):
                     finally:
                         # always update player state
                         self.mass.loop.call_soon(self.update, player_id)
-                    if count >= 120:
-                        count = 0
             await asyncio.sleep(1)
 
     # Syncgroup specific functions/helpers