Sendspin fixes (#2810)
authorMaxim Raznatovski <nda.mr43@gmail.com>
Mon, 15 Dec 2025 21:17:47 +0000 (22:17 +0100)
committerGitHub <noreply@github.com>
Mon, 15 Dec 2025 21:17:47 +0000 (22:17 +0100)
music_assistant/providers/sendspin/manifest.json
music_assistant/providers/sendspin/player.py
requirements_all.txt

index 2d0b03040b9d1ca43c9d8a4351f384254f82ca8a..afd07c96b04758082a2773215ac1056b30ae0408 100644 (file)
@@ -6,7 +6,7 @@
   "description": "Sendspin is an audio playback, control and synchronization protocol developed by the Open Home Foundation and is the native playback protocol built into Music Assistant, used for playback to supported clients like the Music Assistant Web interface, supported (mobile) clients and supported hardware",
   "documentation": "https://music-assistant.io/player-support/sendspin/",
   "codeowners": ["@music-assistant"],
-  "requirements": ["aiosendspin==1.1.0"],
+  "requirements": ["aiosendspin==1.1.1"],
   "builtin": true,
   "allow_disable": false
 }
index d536533f5b10e2b5f77ed05707c97f4ac625a211..587ce7f775a5028a0f42b538c3daab193abcbff1 100644 (file)
@@ -49,6 +49,7 @@ from music_assistant.constants import (
     CONF_ENTRY_HTTP_PROFILE_HIDDEN,
     CONF_ENTRY_OUTPUT_CODEC_HIDDEN,
     CONF_ENTRY_SAMPLE_RATES,
+    CONF_OUTPUT_CHANNELS,
     CONF_OUTPUT_CODEC,
     INTERNAL_PCM_FORMAT,
 )
@@ -140,8 +141,11 @@ class MusicAssistantMediaStream(MediaStream):
         assert multi_client_stream is not None
 
         dsp = mass.config.get_player_dsp_config(player_id)
-        if not dsp.enabled:
-            # DSP is disabled for this player, use main_stream
+        output_channels = mass.config.get_raw_player_config_value(
+            player_id, CONF_OUTPUT_CHANNELS, "stereo"
+        )
+        if not dsp.enabled and output_channels == "stereo":
+            # DSP is disabled and output is stereo, use main_stream
             return None
 
         # Get per-player DSP filter parameters
@@ -535,8 +539,13 @@ class SendspinPlayer(Player):
 
     async def _on_queue_update(self, event: MassEvent) -> None:
         """Extract and send current media metadata to sendspin players on queue updates."""
+        if self.synced_to is not None:
+            # Only leader sends metadata
+            return
         queue = self.mass.player_queues.get_active_queue(self.player_id)
         if not queue or not queue.current_item:
+            # Clear metadata when queue has no current item
+            self.api.group.set_metadata(Metadata())
             return
 
         current_item = queue.current_item
index 004b5fe9449c7df1918ba1cb2857c672113ceed3..63c34a302b3e5273778e90ca71aec8d8285929bc 100644 (file)
@@ -11,7 +11,7 @@ aiojellyfin==0.14.1
 aiomusiccast==0.15.0
 aiortc>=1.6.0
 aiorun==2025.1.1
-aiosendspin==1.1.0
+aiosendspin==1.1.1
 aioslimproto==3.1.1
 aiosonos==0.1.9
 aiosqlite==0.21.0