fix repeat all
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Fri, 22 Jul 2022 17:45:52 +0000 (19:45 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Fri, 22 Jul 2022 17:45:52 +0000 (19:45 +0200)
music_assistant/controllers/streams.py
music_assistant/models/player_queue.py

index f1f8ae8dacfed0b0d608e456b58492e0185ea585..d18d556f085c7c2d65cee1a90eb3f9f48cd65a24 100644 (file)
@@ -129,7 +129,7 @@ class StreamsController:
         queue_id = request.match_info["queue_id"]
         control = request.match_info["control"]
         if queue := self.mass.players.get_player_queue(queue_id):
-            if control == "next" and not queue.signal_next:
+            if control == "next" and queue.signal_next is None:
                 await queue.next()
 
         resp = web.StreamResponse(
@@ -493,11 +493,11 @@ class QueueStream:
                         self.connected_clients.pop(client_id, None)
 
             # complete queue streamed
-            if self.signal_next and not self.queue.announcement_in_progress:
+            if self.signal_next is not None and not self.queue.announcement_in_progress:
                 # the queue stream was aborted (e.g. because of sample rate mismatch)
                 # tell the queue to load the next track (restart stream) as soon
                 # as the player finished playing and returns to idle
-                self.queue.signal_next = True
+                self.queue.signal_next = self.signal_next
 
         # all queue data has been streamed. Either because the queue is exhausted
         # or we need to restart the stream due to decoder/sample rate mismatch
@@ -532,9 +532,9 @@ class QueueStream:
                 seek_position = self.seek_position
             else:
                 next_index = self.queue.get_next_index(queue_index)
-                # break here if repeat is enabled
+                # break here if next index does not match (e.g. when repeat enabled)!
                 if next_index <= queue_index:
-                    self.signal_next = True
+                    self.signal_next = next_index
                     break
                 queue_index = next_index
                 seek_position = 0
@@ -560,7 +560,7 @@ class QueueStream:
 
             # check the PCM samplerate/bitrate
             if not self.allow_resample and streamdetails.bit_depth > self.pcm_bit_depth:
-                self.signal_next = True
+                self.signal_next = queue_index
                 self.logger.debug(
                     "Abort queue stream %s due to bit depth mismatch",
                     self.queue.player.name,
@@ -575,7 +575,7 @@ class QueueStream:
                     "Abort queue stream %s due to sample rate mismatch",
                     self.queue.player.name,
                 )
-                self.signal_next = True
+                self.signal_next = queue_index
                 break
 
             # check crossfade ability
index 28a1c0e4811779c09af4fbdfbb093de97d13c9a9..0757b5d4c580eb4c356540823c6ad30c6d80534f 100644 (file)
@@ -69,7 +69,7 @@ class PlayerQueue:
         self.mass = mass
         self.logger = mass.players.logger
         self.queue_id = player_id
-        self.signal_next: bool = False
+        self.signal_next: Optional[int] = 0
         self._stream_id: str = ""
         self._settings = QueueSettings(self)
         self._current_index: Optional[int] = None
@@ -377,7 +377,7 @@ class PlayerQueue:
         if self.announcement_in_progress:
             self.logger.warning("Ignore queue command: An announcement is in progress")
             return
-        self.signal_next = False
+        self.signal_next = None
         # redirect to underlying player
         await self.player.stop()
 
@@ -671,10 +671,11 @@ class PlayerQueue:
             if self.player.state == PlayerState.IDLE:
 
                 # handle case where stream stopped on purpose and we need to restart it
-                if self.signal_next:
-                    self.signal_next = False
+                if self.signal_next is not None:
                     self._current_item_elapsed_time = 0
-                    self.mass.create_task(self.resume())
+                    next_idx = self.signal_next
+                    self.signal_next = None
+                    self.mass.create_task(self.play_index(next_idx))
 
         self.update_state()