add guard for None volume_level
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 18 Apr 2024 22:33:18 +0000 (00:33 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 18 Apr 2024 22:33:18 +0000 (00:33 +0200)
music_assistant/server/controllers/players.py
music_assistant/server/controllers/streams.py

index 3650c1e41e1233146742971f57b9de95a4effdad..ebcac1de5e305829fb8700b5e7ec1f006ed35abc 100644 (file)
@@ -248,6 +248,7 @@ class PlayerController(CoreController):
         # calculate active group and active source
         player.active_group = self._get_active_player_group(player)
         player.active_source = self._get_active_source(player)
+        player.volume_level = player.volume_level or 0  # guard for None volume
         # calculate group volume
         player.group_volume = self._get_group_volume_level(player)
         if player.type in (PlayerType.GROUP, PlayerType.SYNC_GROUP):
@@ -932,7 +933,7 @@ class PlayerController(CoreController):
         group_volume = 0
         active_players = 0
         for child_player in self.iter_group_members(player, True):
-            group_volume += child_player.volume_level
+            group_volume += child_player.volume_level or 0
             active_players += 1
         if active_players:
             group_volume = group_volume / active_players
index cdfdaf34c36b84ba52dc49f95813c6075ca78a5d..0b0cc6f9c88e71ab33e7250881ed8e9731ec5b13 100644 (file)
@@ -501,13 +501,16 @@ class StreamsController(CoreController):
         )
         if start_queue_item.media_type != MediaType.TRACK:
             use_crossfade = False
-        pcm_sample_size = int(pcm_format.sample_rate * (pcm_format.bit_depth / 8) * 2)
+        pcm_sample_size = int(
+            pcm_format.sample_rate * (pcm_format.bit_depth / 8) * pcm_format.channels
+        )
         self.logger.info(
             "Start Queue Flow stream for Queue %s - crossfade: %s",
             queue.display_name,
             use_crossfade,
         )
         total_bytes_sent = 0
+        started = time.time()
 
         while True:
             # get (next) queue item to stream
@@ -551,13 +554,13 @@ class StreamsController(CoreController):
             ):
                 # buffer size needs to be big enough to include the crossfade part
                 # allow it to be a bit smaller when playback just starts
-                if not use_crossfade or (total_bytes_sent + bytes_written == 0):
+                if not use_crossfade:
                     req_buffer_size = pcm_sample_size * 2
-                elif (total_bytes_sent + bytes_written) < (crossfade_size * 2):
-                    req_buffer_size = pcm_sample_size * 5
-                else:
+                elif (time.time() - started) > 120:
                     # additional 5 seconds to strip silence from last part
                     req_buffer_size = crossfade_size + pcm_sample_size * 5
+                else:
+                    req_buffer_size = crossfade_size
 
                 # ALWAYS APPEND CHUNK TO BUFFER
                 buffer += chunk
@@ -601,7 +604,6 @@ class StreamsController(CoreController):
                 #### OTHER: enough data in buffer, feed to output
                 while len(buffer) > req_buffer_size:
                     yield buffer[:pcm_sample_size]
-                    await asyncio.sleep(0)  # yield to eventloop
                     bytes_written += pcm_sample_size
                     buffer = buffer[pcm_sample_size:]