add some more guarding to chromecast
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 26 May 2019 17:49:18 +0000 (19:49 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 26 May 2019 17:49:18 +0000 (19:49 +0200)
music_assistant/modules/playerproviders/chromecast.py

index 94701c4bf89ee71062db26fe88a3dd7827c8612a..e56d73ebe32de7b7235e20cc7029871743a59a22 100644 (file)
@@ -60,6 +60,11 @@ class ChromecastProvider(PlayerProvider):
 
     async def player_command(self, player_id, cmd:str, cmd_args=None):
         ''' issue command on player (play, pause, next, previous, stop, power, volume, mute) '''
+        count = 0
+        while self._chromecasts[player_id].is_busy and count < 10:
+            asyncio.sleep(0.1)
+            count += 1
+        self._chromecasts[player_id].is_busy = True
         if cmd == 'play':
             self._players[player_id].powered = True
             if self._chromecasts[player_id].media_controller.status.player_is_playing:
@@ -91,6 +96,7 @@ class ChromecastProvider(PlayerProvider):
         elif cmd == 'mute':
             self._chromecasts[player_id].set_volume_muted(True)
         self._chromecasts[player_id].wait()
+        self._chromecasts[player_id].is_busy = False
 
     async def player_queue(self, player_id, offset=0, limit=50):
         ''' return the current items in the player's queue '''
@@ -100,6 +106,11 @@ class ChromecastProvider(PlayerProvider):
         ''' 
             play media on a player
         '''
+        count = 0
+        while self._chromecasts[player_id].is_busy and count < 10:
+            asyncio.sleep(0.1)
+            count += 1
+        self._chromecasts[player_id].is_busy = True
         castplayer = self._chromecasts[player_id]
         cur_queue_index = await self.__get_cur_queue_index(player_id)
 
@@ -129,6 +140,7 @@ class ChromecastProvider(PlayerProvider):
             # add new items at end of queue
             self._player_queue[player_id] = self._player_queue[player_id] + media_items
             await self.__queue_insert(player_id, media_items)
+        self._chromecasts[player_id].is_busy = False
 
     ### Provider specific (helper) methods #####
 
@@ -239,6 +251,7 @@ class ChromecastProvider(PlayerProvider):
                 queuedata['mediaSessionId'] = media_controller.status.media_session_id
                 media_controller.send_message(queuedata, inc_session_id=False)
                 castplayer.wait()
+                await asyncio.sleep(0.2)
         receiver_ctrl.launch_app(media_controller.app_id,
                                 callback_function=app_launched_callback)
 
@@ -322,6 +335,7 @@ class ChromecastProvider(PlayerProvider):
             player.player_id = player_id
             player.name = chromecast.name
             player.player_provider = self.prov_id
+            chromecast.is_busy = False
             # patch the receive message method for handling queue status updates
             chromecast.queue = []
             chromecast.media_controller.queue_items = []