Avoid playing queue pollution when restoring Sonos snapshots (#21963)
Assume a snapshot state with three speakers in two groups, AB and C. They will be playing the A and C queues, respectively. The B queue exists but is hidden in this topology. Unjoin B and form a new group BC, playing the B queue (now with the C queue hidden). To restore the snapshot we would join B back to A. The BC group would now only contain the C speaker, still playing the B queue. The C queue has been lost :-( The problem is that unjoining a coordinator will elect a new coordinator that inherits the group queue and thus has its hidden queue overwritten. This commit avoids the situation by having restore unjoin all slaves. Above, C would be unjoined before joining B to A. This restores the C queue and since B is then alone, it can be joined to A without having to transfer its playing queue to remaining speakers.pull/21983/head
parent
2225425ed2
commit
dd11f8d3fe
|
@ -1037,8 +1037,13 @@ class SonosEntity(MediaPlayerDevice):
|
|||
if entity.state == STATE_PLAYING:
|
||||
entity.media_pause()
|
||||
|
||||
# Bring back the original group topology
|
||||
if with_group:
|
||||
# Unjoin slaves that are not already in their target group
|
||||
for entity in [e for e in entities if not e.is_coordinator]:
|
||||
if entity._snapshot_group != entity._sonos_group:
|
||||
entity.unjoin()
|
||||
|
||||
# Bring back the original group topology
|
||||
for entity in (e for e in entities if e._snapshot_group):
|
||||
if entity._snapshot_group[0] == entity:
|
||||
entity.join(entity._snapshot_group)
|
||||
|
|
Loading…
Reference in New Issue