Fixed format conversion in crossfade discard calculation
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Mon, 3 Nov 2025 23:26:25 +0000 (00:26 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Mon, 3 Nov 2025 23:26:25 +0000 (00:26 +0100)
music_assistant/controllers/streams.py

index 9684608c0c772c2b70c2d8ac1314f29977ff4eaa..0eb89d40848a98202a6ffd16a4f1fb3fc1e4da54 100644 (file)
@@ -1435,11 +1435,18 @@ class StreamsController(CoreController):
         fade_out_data: bytes | None = None
 
         if crossfade_data:
-            discard_seconds = (
-                int(crossfade_data.fade_in_size / crossfade_data.pcm_format.pcm_sample_size) - 1
+            # Calculate discard amount in seconds (format-independent)
+            fade_in_duration_seconds = (
+                crossfade_data.fade_in_size / crossfade_data.pcm_format.pcm_sample_size
             )
+            discard_seconds = int(fade_in_duration_seconds) - 1
+            # Calculate discard amounts in CURRENT track's format
             discard_bytes = int(discard_seconds * pcm_format.pcm_sample_size)
-            discard_leftover = int(crossfade_data.fade_in_size - discard_bytes)
+            # Convert fade_in_size to current track's format for correct leftover calculation
+            fade_in_size_in_current_format = int(
+                fade_in_duration_seconds * pcm_format.pcm_sample_size
+            )
+            discard_leftover = fade_in_size_in_current_format - discard_bytes
         else:
             discard_seconds = streamdetails.seek_position
             discard_leftover = 0