Fix: handle ungroup on power off group player
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 9 Feb 2025 00:52:02 +0000 (01:52 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 9 Feb 2025 00:52:02 +0000 (01:52 +0100)
music_assistant/controllers/players.py
music_assistant/providers/player_group/__init__.py

index 423a00dbb77e5a6bbd3996507ae4bc1afff95ac3..7cda81c566730d2bc5323bcd7efb423f5220ac03 100644 (file)
@@ -376,8 +376,8 @@ class PlayerController(CoreController):
 
         # ungroup player at power off
         player_was_synced = player.synced_to is not None
-        if not powered:
-            # this will handle both synced players and group players
+        if player.type == PlayerType.PLAYER and not powered:
+            # ungroup player if it is synced (or is a sync leader itself)
             # NOTE: ungroup will be ignored if the player is not grouped or synced
             await self.cmd_ungroup(player_id)
 
index 6082612288f5201254c6b08f3e5d072be00faf25..3c1ee150f3dbdaf4fa6e90bc0b8e7428a67f4e36 100644 (file)
@@ -419,7 +419,6 @@ class PlayerGroupProvider(PlayerProvider):
         else:
             # handle TURN_OFF of the group player by turning off all members
             # optimistically set the group state to prevent race conditions
-            # with the ungroup command
             group_player.powered = False
             for member in self.mass.players.iter_group_members(
                 group_player, only_powered=True, active_only=True
@@ -427,6 +426,9 @@ class PlayerGroupProvider(PlayerProvider):
                 # reset active group on player when the group is turned off
                 member.active_group = None
                 member.active_source = None
+                if member.synced_to:
+                    # always ungroup first
+                    await self.mass.players.cmd_ungroup(member.player_id)
                 # handle TURN_OFF of the group player by turning off all members
                 if member.powered and member.power_control != PLAYER_CONTROL_NONE:
                     await self.mass.players.cmd_power(member.player_id, False)