Drive media play-order off MPRIS signals instead of polling

The media service ran a 500ms repeat timer calling syncPlayingOrder() for
the whole session — two CPU wakeups a second even with nothing playing.
syncPlayingOrder only depends on the set of MPRIS players and each
player's isPlaying state, both of which the Mpris service already signals.

Replace the timer with onPlayersChanged (players appearing/disappearing)
plus an Instantiator that connects isPlayingChanged for each live player,
and a Component.onCompleted for the initial sync.

Verified with a test MPRIS player: play/pause and player add/remove all
update the active player with no periodic timer.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
David Heinemeier Hansson
2026-07-20 08:33:00 -07:00
co-authored by Claude Fable 5
parent d548b730e0
commit f1237e1962
+14 -6
View File
@@ -430,12 +430,20 @@ Item {
return handled
}
Timer {
interval: 500
running: true
repeat: true
triggeredOnStart: true
onTriggered: root.syncPlayingOrder()
// Recompute play-order reactively instead of polling every 500ms.
// syncPlayingOrder only depends on the set of players and each player's
// isPlaying state: onPlayersChanged covers players appearing/disappearing,
// and the Instantiator wires isPlayingChanged for each live player.
Component.onCompleted: root.syncPlayingOrder()
onPlayersChanged: root.syncPlayingOrder()
Instantiator {
model: root.players
delegate: Connections {
required property var modelData
target: modelData
function onIsPlayingChanged() { root.syncPlayingOrder() }
}
}
Timer {