From 78df668dae93f8db895aca8a7bd3168ddfa4cae1 Mon Sep 17 00:00:00 2001 From: Smok1e Date: Sat, 15 Apr 2023 00:01:38 +0300 Subject: [PATCH] Disposing webcams on cleanup --- src/main/resources/log4j2.xml | 4 +- .../scala/ocelot/desktop/OcelotDesktop.scala | 1 + .../ocelot/desktop/util/WebcamCapture.scala | 42 +++++++++++++------ 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index 8dda598..bc29822 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -9,9 +9,11 @@ - + + + diff --git a/src/main/scala/ocelot/desktop/OcelotDesktop.scala b/src/main/scala/ocelot/desktop/OcelotDesktop.scala index ca41c06..842bfa9 100644 --- a/src/main/scala/ocelot/desktop/OcelotDesktop.scala +++ b/src/main/scala/ocelot/desktop/OcelotDesktop.scala @@ -120,6 +120,7 @@ object OcelotDesktop extends Logging { UiHandler.start() logger.info("Cleaning up") + WebcamCapture.cleanup() Settings.save(settingsFile) ResourceManager.freeResources() UiHandler.terminate() diff --git a/src/main/scala/ocelot/desktop/util/WebcamCapture.scala b/src/main/scala/ocelot/desktop/util/WebcamCapture.scala index 5292a3d..dc60293 100644 --- a/src/main/scala/ocelot/desktop/util/WebcamCapture.scala +++ b/src/main/scala/ocelot/desktop/util/WebcamCapture.scala @@ -6,7 +6,7 @@ import java.awt.Color import java.awt.image.BufferedImage import scala.collection.mutable -object WebcamCapture extends Logging { +object WebcamCapture extends { private final val frameTimeout: Long = 500 private final val deviceTimeout: Long = 5000 private final val maxDistance: Float = 32f @@ -16,30 +16,46 @@ object WebcamCapture extends Logging { def getInstance(name: String): WebcamCapture = instances.getOrElseUpdate(name, new WebcamCapture(name)) def getInstance(webcam: Webcam): WebcamCapture = getInstance(webcam.getName) def getDefault: WebcamCapture = getInstance(Webcam.getDefault) + + def cleanup(): Unit = { + for (instance <- instances.values) + instance.interrupt() + } } -class WebcamCapture(webcamName: String) extends Thread { +class WebcamCapture(webcamName: String) extends Thread with Logging { private val webcam: Webcam = Webcam.getWebcamByName(webcamName) private var frame: Option[BufferedImage] = None private var lastUsageTime: Long = -1 start() override def run(): Unit = { - while (true) { - if (System.currentTimeMillis() - lastUsageTime >= WebcamCapture.deviceTimeout) { - webcam.close() - synchronized { - wait() + logger.debug(s"Started thread for webcam '$name'") + + while (!isInterrupted) { + try { + if (System.currentTimeMillis() - lastUsageTime >= WebcamCapture.deviceTimeout) { + webcam.close() + synchronized { + wait() + } + } + else { + if (!webcam.isOpen) + webcam.open() + + frame = Option(webcam.getImage) + Thread.sleep(WebcamCapture.frameTimeout) } } - else { - if (!webcam.isOpen) - webcam.open() - - frame = Option(webcam.getImage) - Thread.sleep(WebcamCapture.frameTimeout) + catch { + case _: InterruptedException => interrupt() } } + + logger.debug(s"Cleaning up webcam '$name'") + if (webcam.isOpen) + webcam.close() } def ray(x: Float, y: Float): Float = {