Fix: don't use single stream mode on flowmode players
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sat, 15 Mar 2025 17:59:50 +0000 (18:59 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Sat, 15 Mar 2025 18:18:37 +0000 (19:18 +0100)
It causes side effects and more headache than needed

music_assistant/controllers/player_queues.py
music_assistant/controllers/streams.py
music_assistant/providers/airplay/provider.py
music_assistant/providers/player_group/__init__.py
music_assistant/providers/snapcast/__init__.py
music_assistant/providers/squeezelite/__init__.py

index a3f3861479c84cf5ceee5c675fc495e67b2d623d..a68620a45d90a585c2d19919f44030c1927f3000 100644 (file)
@@ -777,9 +777,6 @@ class PlayerQueuesController(CoreController):
         queue.index_in_buffer = index
         queue.flow_mode_stream_log = []
         queue.flow_mode = await self.mass.config.get_player_config_value(queue_id, CONF_FLOW_MODE)
-        # no point in enabling flow mode for radio sources
-        if queue_item.media_type == MediaType.RADIO:
-            queue.flow_mode = False
         queue.current_item = queue_item
 
         # handle resume point of audiobook(chapter) or podcast(episode)
index c2d43b2debbc9d26ff7086d77accf37b7ea6e0cf..1eb3f4fcb33c44adac9959c58df0b75bde27bdee 100644 (file)
@@ -805,7 +805,7 @@ class StreamsController(CoreController):
                 pcm_format=pcm_format,
             ):
                 # buffer size needs to be big enough to include the crossfade part
-                req_buffer_size = pcm_sample_size * 2 if not use_crossfade else crossfade_size
+                req_buffer_size = pcm_sample_size if not use_crossfade else crossfade_size
 
                 # ALWAYS APPEND CHUNK TO BUFFER
                 buffer += chunk
@@ -1006,7 +1006,7 @@ class StreamsController(CoreController):
             # for radio stations (or other live streams) that do not provide any look ahead buffer
             # without this, some radio streams jitter a lot, especially with dynamic normalization,
             # if the stream does not provide a look ahead buffer
-            pad_silence_seconds = 2
+            pad_silence_seconds = 4
 
         first_chunk_received = False
         async for chunk in get_media_stream(
index e01aa0fb5e323a91582e531eba6fa1e83b1c9be5..f08c895c7df8e5a312da64e1f819d5a18150c742 100644 (file)
@@ -335,15 +335,6 @@ class AirplayProvider(PlayerProvider):
             ugp_stream = ugp_provider.ugp_streams[media.queue_id]
             input_format = ugp_stream.base_pcm_format
             audio_source = ugp_stream.subscribe_raw()
-        elif media.media_type == MediaType.RADIO and media.queue_id and media.queue_item_id:
-            # use single item stream request for radio streams
-            input_format = AIRPLAY_PCM_FORMAT
-            queue_item = self.mass.player_queues.get_item(media.queue_id, media.queue_item_id)
-            assert queue_item is not None  # for type checking
-            audio_source = self.mass.streams.get_queue_item_stream(
-                queue_item=queue_item,
-                pcm_format=AIRPLAY_PCM_FORMAT,
-            )
         elif media.queue_id and media.queue_item_id:
             # regular queue (flow) stream request
             input_format = AIRPLAY_FLOW_PCM_FORMAT
index 42f83e2d729998d5e1e83c74d077d5369da10483..efa1b6c17cd4eba965377ba0009f37144bd16b1d 100644 (file)
@@ -465,12 +465,6 @@ class PlayerGroupProvider(PlayerProvider):
                 output_format=UGP_FORMAT,
                 player_id=media.custom_data["player_id"],
             )
-        elif media.media_type == MediaType.RADIO:
-            # use single item stream request for radio streams
-            audio_source = self.mass.streams.get_queue_item_stream(
-                queue_item=self.mass.player_queues.get_item(media.queue_id, media.queue_item_id),
-                pcm_format=UGP_FORMAT,
-            )
         elif media.queue_id and media.queue_item_id:
             # regular queue stream request
             audio_source = self.mass.streams.get_queue_flow_stream(
index 904eaacc380918e5b1f54fff21a251b0c7a7dadf..108f459989bcb3c53a123c18dd5b98bd8ad1ec88 100644 (file)
@@ -567,13 +567,6 @@ class SnapCastProvider(PlayerProvider):
             ugp_stream = ugp_provider.ugp_streams[media.queue_id]
             input_format = ugp_stream.base_pcm_format
             audio_source = ugp_stream.subscribe_raw()
-        elif media.media_type == MediaType.RADIO:
-            # use single item stream request for radio streams
-            input_format = DEFAULT_SNAPCAST_FORMAT
-            audio_source = self.mass.streams.get_queue_item_stream(
-                queue_item=self.mass.player_queues.get_item(media.queue_id, media.queue_item_id),
-                pcm_format=DEFAULT_SNAPCAST_FORMAT,
-            )
         elif media.queue_id and media.queue_item_id:
             # regular queue (flow) stream request
             input_format = DEFAULT_SNAPCAST_PCM_FORMAT
index 60c9541629b4025579d5b3ab7427bcfc4def15e8..746785edd2988b309324618acadd4c0b46065999 100644 (file)
@@ -399,12 +399,6 @@ class SlimprotoProvider(PlayerProvider):
             ugp_stream = ugp_provider.ugp_streams[media.queue_id]
             # Filter is later applied in MultiClientStream
             audio_source = ugp_stream.get_stream(master_audio_format, filter_params=None)
-        elif media.media_type == MediaType.RADIO:
-            # use single item stream request for radio streams
-            audio_source = self.mass.streams.get_queue_item_stream(
-                queue_item=self.mass.player_queues.get_item(media.queue_id, media.queue_item_id),
-                pcm_format=master_audio_format,
-            )
         elif media.queue_id and media.queue_item_id:
             # regular queue stream request
             audio_source = self.mass.streams.get_queue_flow_stream(