From 2bfcf1763a12f6bcd58badd60be7e16d48a2297d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Thu, 14 May 2020 20:00:58 +0200 Subject: [PATCH] Enable queuing Sonos TTS requests --- .../bartek/ttsserver/sonos/SonosController.kt | 17 ------- .../io/bartek/ttsserver/sonos/SonosQueue.kt | 44 +++++++++++++++++++ .../bartek/ttsserver/sonos/SonosTTSRequest.kt | 2 + .../java/io/bartek/ttsserver/web/WebServer.kt | 12 ++--- 4 files changed, 52 insertions(+), 23 deletions(-) delete mode 100644 app/src/main/java/io/bartek/ttsserver/sonos/SonosController.kt create mode 100644 app/src/main/java/io/bartek/ttsserver/sonos/SonosQueue.kt create mode 100644 app/src/main/java/io/bartek/ttsserver/sonos/SonosTTSRequest.kt diff --git a/app/src/main/java/io/bartek/ttsserver/sonos/SonosController.kt b/app/src/main/java/io/bartek/ttsserver/sonos/SonosController.kt deleted file mode 100644 index 835190e..0000000 --- a/app/src/main/java/io/bartek/ttsserver/sonos/SonosController.kt +++ /dev/null @@ -1,17 +0,0 @@ -package io.bartek.ttsserver.sonos - -import com.vmichalak.sonoscontroller.SonosDiscovery -import java.io.File - -class SonosController(private val host: String, private val port: Int) { - fun clip(wave: File, zone: String, volume: Int) { - SonosDiscovery.discover().firstOrNull { it.zoneGroupState.name == zone }?.let { - val filename = wave.name - val url = "http://$host:$port/sonos/$filename" - val currentVolume = it.volume - it.volume = volume - it.clip(url, "") - it.volume = currentVolume - } - } -} \ No newline at end of file diff --git a/app/src/main/java/io/bartek/ttsserver/sonos/SonosQueue.kt b/app/src/main/java/io/bartek/ttsserver/sonos/SonosQueue.kt new file mode 100644 index 0000000..2a60db9 --- /dev/null +++ b/app/src/main/java/io/bartek/ttsserver/sonos/SonosQueue.kt @@ -0,0 +1,44 @@ +package io.bartek.ttsserver.sonos + +import com.vmichalak.sonoscontroller.SonosDiscovery +import io.bartek.ttsserver.tts.TTS +import io.bartek.ttsserver.web.SonosTTSRequestData +import java.util.concurrent.BlockingQueue +import java.util.concurrent.LinkedBlockingQueue + +private class Consumer( + private val tts: TTS, + private val host: String, + private val port: Int, + private val queue: BlockingQueue +) : Runnable { + override fun run() = try { + while (true) { + consume(queue.take()) + } + } catch (e: InterruptedException) { + Thread.currentThread().interrupt() + } + + + private fun consume(data: SonosTTSRequestData) { + SonosDiscovery.discover().firstOrNull { it.zoneGroupState.name == data.zone }?.let { + val file = tts.createTTSFile(data.text, data.language) + val filename = file.name + val url = "http://$host:$port/sonos/$filename" + val currentVolume = it.volume + it.volume = data.volume + it.clip(url, "") + it.volume = currentVolume + } + } +} + +class SonosQueue(tts: TTS, host: String, port: Int) { + private val queue: BlockingQueue = LinkedBlockingQueue() + private val consumer = Thread(Consumer(tts, host, port, queue)) + + init { consumer.start() } + + fun push(data: SonosTTSRequestData) = queue.add(data) +} \ No newline at end of file diff --git a/app/src/main/java/io/bartek/ttsserver/sonos/SonosTTSRequest.kt b/app/src/main/java/io/bartek/ttsserver/sonos/SonosTTSRequest.kt new file mode 100644 index 0000000..b6aa139 --- /dev/null +++ b/app/src/main/java/io/bartek/ttsserver/sonos/SonosTTSRequest.kt @@ -0,0 +1,2 @@ +package io.bartek.ttsserver.sonos + diff --git a/app/src/main/java/io/bartek/ttsserver/web/WebServer.kt b/app/src/main/java/io/bartek/ttsserver/web/WebServer.kt index 5f622e9..3456d96 100644 --- a/app/src/main/java/io/bartek/ttsserver/web/WebServer.kt +++ b/app/src/main/java/io/bartek/ttsserver/web/WebServer.kt @@ -12,7 +12,7 @@ import io.bartek.ttsserver.network.NetworkUtil import io.bartek.ttsserver.preference.PreferenceKey import io.bartek.ttsserver.service.ForegroundService import io.bartek.ttsserver.service.ServiceState -import io.bartek.ttsserver.sonos.SonosController +import io.bartek.ttsserver.sonos.SonosQueue import io.bartek.ttsserver.tts.TTS import java.io.BufferedInputStream import java.io.File @@ -24,7 +24,7 @@ class WebServer(port: Int, private val context: Context) : NanoHTTPD(port), private val preferences = PreferenceManager.getDefaultSharedPreferences(context) private val tts = TTS(context, this) private val endpoints = Endpoints() - private val sonos = SonosController(NetworkUtil.getIpAddress(context), port) + private val sonos = SonosQueue(tts, NetworkUtil.getIpAddress(context), port) override fun serve(session: IHTTPSession?): Response { try { @@ -100,11 +100,11 @@ class WebServer(port: Int, private val context: Context) : NanoHTTPD(port), throw ResponseException(BAD_REQUEST, "") } - val (text, language, zone, volume) = extractBody(session) { SonosTTSRequestData.fromJSON(it) } + val data = extractBody(session) { SonosTTSRequestData.fromJSON(it) } - val file = tts.createTTSFile(text, language) - sonos.clip(file, zone, volume) - return newFixedLengthResponse("") + sonos.push(data) + + return newFixedLengthResponse(ACCEPTED, MIME_PLAINTEXT, "") } private fun sonosCache(session: IHTTPSession): Response {