Fix power control on play
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 26 Feb 2026 09:27:34 +0000 (10:27 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 26 Feb 2026 09:27:34 +0000 (10:27 +0100)
music_assistant/controllers/players/controller.py

index 5c78cb3e51a2b7fdecf7e4815f3d1d028561e357..257178167b88f48589644e34e7bc73455d788842 100644 (file)
@@ -2572,18 +2572,19 @@ class PlayerController(ProtocolLinkingMixin, CoreController):
             return  # nothing to do
 
         # ungroup player at power off
-        player_was_synced = bool(
-            player.state.synced_to or player.group_members or player.state.active_group
-        )
-        if player_was_synced and player.type == PlayerType.PLAYER and not powered:
+        player_was_sync_child = bool(player.state.synced_to or player.state.active_group)
+        if (
+            (player_was_sync_child or player.group_members)
+            and 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)
 
         # always stop player at power off
         if (
             not powered
-            and not player_was_synced
+            and not player_was_sync_child
             and player_state.playback_state in (PlaybackState.PLAYING, PlaybackState.PAUSED)
         ):
             await self._handle_cmd_stop(player_id)
@@ -2736,6 +2737,10 @@ class PlayerController(ProtocolLinkingMixin, CoreController):
         if media.source_id:
             player.set_active_mass_source(media.source_id)
 
+        # power on the player if needed
+        if not player.state.powered and player.state.power_control != PLAYER_CONTROL_NONE:
+            await self._handle_cmd_power(player.player_id, True)
+
         # Determine output protocol to use:
         # If player already has an active protocol set, prefer that.
         # Otherwise, select best protocol based on current state.