From cf1e77d1f999e3c25b1935f3bf76f4198cd1b1d6 Mon Sep 17 00:00:00 2001 From: crissmil Date: Sun, 12 May 2024 15:57:09 +0300 Subject: [PATCH 1/2] Update preset-announcement.js When using presets all players get backup/restore. This affects a playing player by restoring it to the time of backup state.elapsedTime, even if this player is not included in the preset file and is supposed to be skipped. Even if pauseOthers is set to false, by this behavior the player still get interrupted one sec because it is shifted back to recorded elapsedTime. This PR is changing "saveAll" to "savePresetPlayers" and will backup/restore only players specified in preset file. Idle players are no more affected by running presets. Tested and found more stable when joining/leaving groups after tts or chime clips. --- lib/helpers/preset-announcement.js | 60 +++++++++++++++++------------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/lib/helpers/preset-announcement.js b/lib/helpers/preset-announcement.js index 20fdc696..954c3e1a 100644 --- a/lib/helpers/preset-announcement.js +++ b/lib/helpers/preset-announcement.js @@ -2,36 +2,45 @@ const logger = require('sonos-discovery/lib/helpers/logger'); const isRadioOrLineIn = require('../helpers/is-radio-or-line-in'); -function saveAll(system) { +function savePresetPlayers(system, pset) { const backupPresets = system.zones.map((zone) => { const coordinator = zone.coordinator; const state = coordinator.state; - const preset = { - players: [ - { roomName: coordinator.roomName, volume: state.volume } - ], - state: state.playbackState, - uri: coordinator.avTransportUri, - metadata: coordinator.avTransportUriMetadata, - playMode: { - repeat: state.playMode.repeat - } - }; - - if (!isRadioOrLineIn(preset.uri)) { - preset.trackNo = state.trackNo; - preset.elapsedTime = state.elapsedTime; - } + for (var index = 0; index < pset.players.length; ++index) { + if (pset.players[index].roomName == coordinator.roomName) { + const preset = { + players: [ + { roomName: coordinator.roomName, volume: state.volume } + ], + state: state.playbackState, + uri: coordinator.avTransportUri, + metadata: coordinator.avTransportUriMetadata, + playMode: { + repeat: state.playMode.repeat + } + }; - zone.members.forEach(function (player) { - if (coordinator.uuid != player.uuid) - preset.players.push({ roomName: player.roomName, volume: player.state.volume }); - }); + if (!isRadioOrLineIn(preset.uri)) { + preset.trackNo = state.trackNo; + preset.elapsedTime = state.elapsedTime; + } - return preset; + zone.members.forEach(function (player) { + if (coordinator.uuid != player.uuid) + preset.players.push({ roomName: player.roomName, volume: player.state.volume }); + }); + return preset; + } + } }); + Object.keys(backupPresets).forEach(key => { + if (backupPresets[key] === undefined) { + delete backupPresets[key]; + } + }); + logger.trace('backup presets', backupPresets); return backupPresets.sort((a, b) => { return a.players.length < b.players.length; @@ -41,9 +50,6 @@ function saveAll(system) { function announcePreset(system, uri, preset, duration) { let abortTimer; - // Save all players - var backupPresets = saveAll(system); - const simplifiedPreset = { uri, players: preset.players, @@ -52,6 +58,8 @@ function announcePreset(system, uri, preset, duration) { state: 'STOPPED' }; + var backupPresets = savePresetPlayers(system,preset); + function hasReachedCorrectTopology(zones) { return zones.some(group => group.members.length === preset.players.length && @@ -113,4 +121,4 @@ function announcePreset(system, uri, preset, duration) { } -module.exports = announcePreset; \ No newline at end of file +module.exports = announcePreset; From 20ef0bdb274dcbd28f8730725f43f493cae03bc5 Mon Sep 17 00:00:00 2001 From: crissmil Date: Thu, 15 Aug 2024 12:49:07 +0300 Subject: [PATCH 2/2] Update preset-announcement.js --- lib/helpers/preset-announcement.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/helpers/preset-announcement.js b/lib/helpers/preset-announcement.js index 954c3e1a..ff720603 100644 --- a/lib/helpers/preset-announcement.js +++ b/lib/helpers/preset-announcement.js @@ -7,27 +7,28 @@ function savePresetPlayers(system, pset) { const coordinator = zone.coordinator; const state = coordinator.state; for (var index = 0; index < pset.players.length; ++index) { - if (pset.players[index].roomName == coordinator.roomName) { + if (pset.players[index].roomName == coordinator.roomName) { const preset = { players: [ { roomName: coordinator.roomName, volume: state.volume } - ], + ], state: state.playbackState, uri: coordinator.avTransportUri, metadata: coordinator.avTransportUriMetadata, playMode: { - repeat: state.playMode.repeat - } - }; + repeat: state.playMode.repeat + } + }; if (!isRadioOrLineIn(preset.uri)) { preset.trackNo = state.trackNo; preset.elapsedTime = state.elapsedTime; - } + } zone.members.forEach(function (player) { - if (coordinator.uuid != player.uuid) + if (coordinator.uuid != player.uuid) { preset.players.push({ roomName: player.roomName, volume: player.state.volume }); + } }); return preset; @@ -36,10 +37,10 @@ function savePresetPlayers(system, pset) { }); Object.keys(backupPresets).forEach(key => { - if (backupPresets[key] === undefined) { - delete backupPresets[key]; - } - }); + if (backupPresets[key] === undefined) { + delete backupPresets[key]; + } + }); logger.trace('backup presets', backupPresets); return backupPresets.sort((a, b) => {