From 3592df3fc63849535c67358c66ecc6013807805c Mon Sep 17 00:00:00 2001 From: IgorTimofeev Date: Mon, 17 Apr 2023 13:24:36 +0300 Subject: [PATCH] Trying to use alternative library --- .../{fresh => }/CustomPlaybackListener.java | 24 ++++----- .../entity/openfmradio/OpenFMRadio.scala | 50 ++++++++++++++----- 2 files changed, 49 insertions(+), 25 deletions(-) rename src/main/scala/ocelot/desktop/entity/openfmradio/{fresh => }/CustomPlaybackListener.java (61%) diff --git a/src/main/scala/ocelot/desktop/entity/openfmradio/fresh/CustomPlaybackListener.java b/src/main/scala/ocelot/desktop/entity/openfmradio/CustomPlaybackListener.java similarity index 61% rename from src/main/scala/ocelot/desktop/entity/openfmradio/fresh/CustomPlaybackListener.java rename to src/main/scala/ocelot/desktop/entity/openfmradio/CustomPlaybackListener.java index 6068007..304e3eb 100644 --- a/src/main/scala/ocelot/desktop/entity/openfmradio/fresh/CustomPlaybackListener.java +++ b/src/main/scala/ocelot/desktop/entity/openfmradio/CustomPlaybackListener.java @@ -1,4 +1,4 @@ -package ocelot.desktop.entity.openfmradio.fresh; +package ocelot.desktop.entity.openfmradio; import java.lang.reflect.Field; import javax.sound.sampled.FloatControl; @@ -6,7 +6,7 @@ import javax.sound.sampled.SourceDataLine; import javazoom.jl.player.AudioDevice; import javazoom.jl.player.JavaSoundAudioDevice; -import ocelot.desktop.entity.openfmradio.original.PlaybackListener; +import javazoom.jl.player.advanced.PlaybackListener; class CustomPlaybackListener extends PlaybackListener { private FloatControl volControl; @@ -20,13 +20,15 @@ class CustomPlaybackListener extends PlaybackListener { // PlaybackListener members public void setVolume(float gain){ - if(this.volControl == null) { - Class clazz = JavaSoundAudioDevice.class; - Field[] fields = clazz.getDeclaredFields(); - try{ - SourceDataLine source = null; - for(Field field : fields) { - if("source".equals(field.getName())) { + if (this.volControl == null) { + var clazz = JavaSoundAudioDevice.class; + var fields = clazz.getDeclaredFields(); + + try { + SourceDataLine source; + + for (Field field : fields) { + if (field.getName().equals("source")) { field.setAccessible(true); source = (SourceDataLine) field.get(this.device); field.setAccessible(false); @@ -38,9 +40,7 @@ class CustomPlaybackListener extends PlaybackListener { } } if (this.volControl != null) { - float newGain = Math.min(Math.max(gain, volControl.getMinimum()), volControl.getMaximum()); - System.out.println("Was: " + volControl.getValue() + " Will be: " + newGain); - + var newGain = Math.min(Math.max(gain, volControl.getMinimum()), volControl.getMaximum()); volControl.setValue(newGain); } } diff --git a/src/main/scala/ocelot/desktop/entity/openfmradio/OpenFMRadio.scala b/src/main/scala/ocelot/desktop/entity/openfmradio/OpenFMRadio.scala index 5dce15b..ee0d05b 100644 --- a/src/main/scala/ocelot/desktop/entity/openfmradio/OpenFMRadio.scala +++ b/src/main/scala/ocelot/desktop/entity/openfmradio/OpenFMRadio.scala @@ -1,9 +1,8 @@ package ocelot.desktop.entity.openfmradio -import javazoom.jl.player.FactoryRegistry -import javazoom.jl.player.advanced.AdvancedPlayer +import javazoom.jl.player.{AudioDevice, FactoryRegistry} +import javazoom.jl.player.advanced.{AdvancedPlayer, PlaybackListener} import ocelot.desktop.color.IntColor -import ocelot.desktop.entity.openfmradio.fresh.CustomPlaybackListener import ocelot.desktop.entity.openfmradio.original.PlayerDispatcher import totoro.ocelot.brain.Constants import totoro.ocelot.brain.entity.machine.{Arguments, Callback, Context} @@ -26,7 +25,11 @@ class OpenFMRadio extends Entity with Environment with DeviceInfo { var url: Option[String] = None var screenColor: IntColor = IntColor(0x0AFF0A) var screenText: String = "OpenFM" - var volume: Double = 1d + var volume: Float = 1f + + private var playerThread: Option[Thread] = None + private var audioDevice: AudioDevice = null + private var playbackListener: CustomPlaybackListener = null def play(): Unit = { if (url.isEmpty) @@ -35,14 +38,32 @@ class OpenFMRadio extends Entity with Environment with DeviceInfo { // var player = new PlayerDispatcher(this, url.get, 0, 0, 0) try { - var stream = new URI(url.get).toURL.openStream() - var player = new AdvancedPlayer(stream) - player.setPlayBackListener(new CustomPlaybackListener()) - player.play() + audioDevice = FactoryRegistry.systemRegistry().createAudioDevice(); + playbackListener = new CustomPlaybackListener(audioDevice) + + val stream = new URI(url.get).toURL.openStream(); + val player = new AdvancedPlayer(stream, audioDevice) + player.setPlayBackListener(playbackListener) + + playerThread = Option(new Thread( + () => { + try { + player.play() + } + catch { + case e: Throwable => { + e.printStackTrace() + } + } + }, + "OpenFM radio player thread" + )) + + playerThread.get.start(); } catch { - case _: Throwable => { - + case e: Throwable => { + e.printStackTrace() } } } @@ -77,7 +98,10 @@ class OpenFMRadio extends Entity with Environment with DeviceInfo { val value = args.checkDouble(0) if (value >= 0 && value <= 1) { - volume = value + volume = value.toFloat + + if (playbackListener != null) + playbackListener.setVolume(volume) return result(true) } @@ -134,9 +158,9 @@ class OpenFMRadio extends Entity with Environment with DeviceInfo { volume = if (nbt.hasKey("volume")) - nbt.getDouble("volume") + nbt.getDouble("volume").toFloat else - 1d + 1f } override def save(nbt: NBTTagCompound): Unit = {