From bba4e1ca3190cfff1b8baaed335b322fbd975ba4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Sat, 23 May 2020 22:20:36 +0200 Subject: [PATCH] Enable batch processing in Sonos worker From now on, the Sonos worker dumps the Sonos state before the first request and restores it only after the last request. This resolved the issue of often not resuming playback when more than one query was enqueued. --- .../core/sonos/worker/SonosWorker.kt | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/bartlomiejpluta/ttsserver/core/sonos/worker/SonosWorker.kt b/app/src/main/java/com/bartlomiejpluta/ttsserver/core/sonos/worker/SonosWorker.kt index 29812bb..a379143 100644 --- a/app/src/main/java/com/bartlomiejpluta/ttsserver/core/sonos/worker/SonosWorker.kt +++ b/app/src/main/java/com/bartlomiejpluta/ttsserver/core/sonos/worker/SonosWorker.kt @@ -4,7 +4,10 @@ import com.bartlomiejpluta.ttsserver.core.tts.engine.TTSEngine import com.bartlomiejpluta.ttsserver.core.web.dto.SonosDTO import com.bartlomiejpluta.ttsserver.service.foreground.ForegroundService import com.bartlomiejpluta.ttsserver.service.state.ServiceState +import com.vmichalak.sonoscontroller.Snapshot +import com.vmichalak.sonoscontroller.SonosDevice import com.vmichalak.sonoscontroller.SonosDiscovery +import com.vmichalak.sonoscontroller.model.PlayState import java.util.concurrent.BlockingQueue class SonosWorker( @@ -12,6 +15,7 @@ class SonosWorker( private val address: String, private val queue: BlockingQueue ) : Runnable { + private var snapshot: Snapshot? = null override fun run() = try { while (ForegroundService.state == ServiceState.RUNNING) { @@ -23,9 +27,36 @@ class SonosWorker( private fun consume(data: SonosDTO) = SonosDiscovery.discover().firstOrNull { it.zoneGroupState.name == data.zone }?.let { - val file = tts.createTTSFile(data.text, data.language) - val filename = file.name - val url = "$address/sonos/$filename" - it.clip(url, data.volume, "") + updateSnapshotIfFirst(it) + val url = prepareTTSFile(data) + announce(it, data, url) + restoreSnapshotIfLast() } + + private fun prepareTTSFile(data: SonosDTO): String { + val filename = tts.createTTSFile(data.text, data.language).name + return "$address/sonos/$filename" + } + + private fun announce(device: SonosDevice, data: SonosDTO, url: String) { + device.stop() + device.volume = data.volume + device.playUri(url, "") + while (device.playState != PlayState.STOPPED) { + Thread.sleep(500) + } + } + + private fun updateSnapshotIfFirst(it: SonosDevice) { + if (snapshot == null) { + snapshot = it.snapshot() + } + } + + private fun restoreSnapshotIfLast() { + if (queue.isEmpty()) { + snapshot!!.restore() + snapshot = null + } + } } \ No newline at end of file