From 07c70a42f311451876efdef85d1cd84da066acad Mon Sep 17 00:00:00 2001 From: minjaesong Date: Tue, 16 Jan 2024 14:00:58 +0900 Subject: [PATCH] reloading the engine will copy track states from the old instance, obsoleting audioMixerRenewHooks --- src/net/torvald/terrarum/App.java | 22 +++++++++++++++---- src/net/torvald/terrarum/audio/AudioMixer.kt | 1 + .../terrarum/audio/TerrarumAudioMixerTrack.kt | 19 ++++++++++++++-- src/net/torvald/terrarum/audio/dsp/BinoPan.kt | 7 ++++++ .../torvald/terrarum/audio/dsp/Bitcrush.kt | 7 ++++++ src/net/torvald/terrarum/audio/dsp/Buffer.kt | 3 +++ src/net/torvald/terrarum/audio/dsp/Convolv.kt | 3 +++ src/net/torvald/terrarum/audio/dsp/Gain.kt | 6 +++++ .../torvald/terrarum/audio/dsp/Highpass.kt | 6 +++++ src/net/torvald/terrarum/audio/dsp/Lowpass.kt | 6 +++++ .../torvald/terrarum/audio/dsp/NullFilter.kt | 3 +++ src/net/torvald/terrarum/audio/dsp/Reverb.kt | 3 +++ src/net/torvald/terrarum/audio/dsp/SoftClp.kt | 3 +++ src/net/torvald/terrarum/audio/dsp/Spectro.kt | 16 ++++++++++++-- .../terrarum/audio/dsp/TerrarumAudioFilter.kt | 1 + src/net/torvald/terrarum/audio/dsp/XYtoMS.kt | 6 +++++ .../gameactors/FixtureJukebox.kt | 4 ++-- 17 files changed, 106 insertions(+), 10 deletions(-) diff --git a/src/net/torvald/terrarum/App.java b/src/net/torvald/terrarum/App.java index f537b6454..ea7f62391 100644 --- a/src/net/torvald/terrarum/App.java +++ b/src/net/torvald/terrarum/App.java @@ -13,7 +13,6 @@ import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.JsonValue; import com.github.strikerx3.jxinput.XInputDevice; -import kotlin.jvm.functions.Function0; import kotlin.text.Charsets; import net.torvald.getcpuname.GetCpuName; import net.torvald.terrarum.audio.AudioMixer; @@ -1060,7 +1059,7 @@ public class App implements ApplicationListener { * Make sure to call App.audioMixerRenewHooks.remove(Object) whenever the class gets disposed of * Key: the class that calls the hook, value: the actual operation (function) */ - public static HashMap audioMixerRenewHooks = new HashMap<>(); + //public static HashMap audioMixerRenewHooks = new HashMap<>(); /** * Init stuffs which needs GL context @@ -1242,24 +1241,39 @@ public class App implements ApplicationListener { } public static void renewAudioProcessor(int bufferSize) { + // copy music tracks + var dynaicTracks = audioMixer.getDynamicTracks(); + var staticTracks = audioMixer.getTracks(); + audioManagerThread.interrupt(); audioMixer.dispose(); audioBufferSize = bufferSize; audioMixer = new AudioMixer(audioBufferSize); + + // paste music tracks + for (int i = 0; i < audioMixer.getDynamicTracks().length; i++) { + var track = audioMixer.getDynamicTracks()[i]; + dynaicTracks[i].copyStatusFrom(track); + } + for (int i = 0; i < audioMixer.getTracks().length; i++) { + var track = audioMixer.getTracks()[i]; + staticTracks[i].copyStatusFrom(track); + } + audioManagerThread = new Thread(new AudioManagerRunnable(audioMixer), "TerrarumAudioManager"); audioManagerThread.setPriority(MAX_PRIORITY); // higher = more predictable; audio delay is very noticeable so it gets high priority audioManagerThread.start(); - for (var it : audioMixerRenewHooks.values()) { + /*for (var it : audioMixerRenewHooks.values()) { try { it.invoke(); } catch (Throwable e) { e.printStackTrace(); } - } + }*/ } diff --git a/src/net/torvald/terrarum/audio/AudioMixer.kt b/src/net/torvald/terrarum/audio/AudioMixer.kt index cbe62cdcc..e0ff3034b 100644 --- a/src/net/torvald/terrarum/audio/AudioMixer.kt +++ b/src/net/torvald/terrarum/audio/AudioMixer.kt @@ -506,6 +506,7 @@ class AudioMixer(val bufferSize: Int): Disposable { // feeder.stop() // feedingThread.join() tracks.forEach { it.tryDispose() } + dynamicTracks.forEach { it.tryDispose() } masterTrack.tryDispose() } } diff --git a/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt b/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt index 3a1519ad0..2c8ed6e14 100644 --- a/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt +++ b/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt @@ -61,7 +61,23 @@ class TerrarumAudioMixerTrack( var trackingTarget: Actor? = null - var playStartedTime = 0L; private set + internal var streamPlaying = false + var playStartedTime = 0L; internal set + + + fun copyStatusFrom(other: TerrarumAudioMixerTrack) { + other.pullNextTrack = this.pullNextTrack + other.currentTrack = this.currentTrack + other.nextTrack = this.nextTrack + other.volume = this.volume + other.trackingTarget = this.trackingTarget + other.streamPlaying = this.streamPlaying + other.playStartedTime = this.playStartedTime + filters.indices.forEach { i -> + other.filters[i].copyParamsFrom(this.filters[i]) + } + } + inline fun getFilter() = filters.filterIsInstance().first()!! inline fun getFilterOrNull() = filters.filterIsInstance().firstOrNull() @@ -119,7 +135,6 @@ class TerrarumAudioMixerTrack( } - internal var streamPlaying = false fun play() { playStartedTime = System.nanoTime() streamPlaying = true diff --git a/src/net/torvald/terrarum/audio/dsp/BinoPan.kt b/src/net/torvald/terrarum/audio/dsp/BinoPan.kt index f59d21a2f..ec7bb647b 100644 --- a/src/net/torvald/terrarum/audio/dsp/BinoPan.kt +++ b/src/net/torvald/terrarum/audio/dsp/BinoPan.kt @@ -140,4 +140,11 @@ class BinoPan(var pan: Float, var earDist: Float = EARDIST_DEFAULT): TerrarumAud } override val debugViewHeight = 32 + + override fun copyParamsFrom(other: TerrarumAudioFilter) { + if (other is BinoPan) { + this.pan = other.pan + this.earDist = other.earDist + } + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/audio/dsp/Bitcrush.kt b/src/net/torvald/terrarum/audio/dsp/Bitcrush.kt index 9fbf3e337..76be14a0e 100644 --- a/src/net/torvald/terrarum/audio/dsp/Bitcrush.kt +++ b/src/net/torvald/terrarum/audio/dsp/Bitcrush.kt @@ -35,4 +35,11 @@ class Bitcrush(var steps: Int, var inputGain: Float = 1f): TerrarumAudioFilter() } override val debugViewHeight = 16 + + override fun copyParamsFrom(other: TerrarumAudioFilter) { + if (other is Bitcrush) { + this.steps = other.steps + this.inputGain = other.inputGain + } + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/audio/dsp/Buffer.kt b/src/net/torvald/terrarum/audio/dsp/Buffer.kt index 7df307d1e..2cc7c804b 100644 --- a/src/net/torvald/terrarum/audio/dsp/Buffer.kt +++ b/src/net/torvald/terrarum/audio/dsp/Buffer.kt @@ -19,4 +19,7 @@ object Buffer : TerrarumAudioFilter() { } override val debugViewHeight = 16 + + override fun copyParamsFrom(other: TerrarumAudioFilter) { + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/audio/dsp/Convolv.kt b/src/net/torvald/terrarum/audio/dsp/Convolv.kt index ec6ae36e5..53cdeccab 100644 --- a/src/net/torvald/terrarum/audio/dsp/Convolv.kt +++ b/src/net/torvald/terrarum/audio/dsp/Convolv.kt @@ -155,4 +155,7 @@ class Convolv(ir: File, val crossfeed: Float, gain: Float = 1f / 256f): Terrarum } override val debugViewHeight = 32 + + override fun copyParamsFrom(other: TerrarumAudioFilter) { + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/audio/dsp/Gain.kt b/src/net/torvald/terrarum/audio/dsp/Gain.kt index 7ac2d5725..8d8e2d31a 100644 --- a/src/net/torvald/terrarum/audio/dsp/Gain.kt +++ b/src/net/torvald/terrarum/audio/dsp/Gain.kt @@ -20,4 +20,10 @@ class Gain(var gain: Float): TerrarumAudioFilter() { } override val debugViewHeight = 16 + + override fun copyParamsFrom(other: TerrarumAudioFilter) { + if (other is Gain) { + this.gain = other.gain + } + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/audio/dsp/Highpass.kt b/src/net/torvald/terrarum/audio/dsp/Highpass.kt index 1e64f4c69..cf42e7ceb 100644 --- a/src/net/torvald/terrarum/audio/dsp/Highpass.kt +++ b/src/net/torvald/terrarum/audio/dsp/Highpass.kt @@ -67,4 +67,10 @@ class Highpass(cutoff0: Float): TerrarumAudioFilter() { } override val debugViewHeight = 16 + + override fun copyParamsFrom(other: TerrarumAudioFilter) { + if (other is Highpass) { + setCutoff(other.cutoff) + } + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/audio/dsp/Lowpass.kt b/src/net/torvald/terrarum/audio/dsp/Lowpass.kt index b34cb25c1..473fb4601 100644 --- a/src/net/torvald/terrarum/audio/dsp/Lowpass.kt +++ b/src/net/torvald/terrarum/audio/dsp/Lowpass.kt @@ -67,4 +67,10 @@ class Lowpass(cutoff0: Float): TerrarumAudioFilter() { } override val debugViewHeight = 16 + + override fun copyParamsFrom(other: TerrarumAudioFilter) { + if (other is Lowpass) { + setCutoff(other.cutoff) + } + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/audio/dsp/NullFilter.kt b/src/net/torvald/terrarum/audio/dsp/NullFilter.kt index 37b19a511..4c38b52ef 100644 --- a/src/net/torvald/terrarum/audio/dsp/NullFilter.kt +++ b/src/net/torvald/terrarum/audio/dsp/NullFilter.kt @@ -13,4 +13,7 @@ object NullFilter : TerrarumAudioFilter() { } override val debugViewHeight = 0 + + override fun copyParamsFrom(other: TerrarumAudioFilter) { + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/audio/dsp/Reverb.kt b/src/net/torvald/terrarum/audio/dsp/Reverb.kt index aca83558c..4a8d483d9 100644 --- a/src/net/torvald/terrarum/audio/dsp/Reverb.kt +++ b/src/net/torvald/terrarum/audio/dsp/Reverb.kt @@ -53,4 +53,7 @@ class Reverb(val delayMS: Float = 36f, var feedback: Float = 0.92f, var lowpass: } override val debugViewHeight = 0 + + override fun copyParamsFrom(other: TerrarumAudioFilter) { + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/audio/dsp/SoftClp.kt b/src/net/torvald/terrarum/audio/dsp/SoftClp.kt index ff6b96293..c72dca385 100644 --- a/src/net/torvald/terrarum/audio/dsp/SoftClp.kt +++ b/src/net/torvald/terrarum/audio/dsp/SoftClp.kt @@ -56,4 +56,7 @@ object SoftClp : TerrarumAudioFilter() { } override val debugViewHeight = 0 + + override fun copyParamsFrom(other: TerrarumAudioFilter) { + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/audio/dsp/Spectro.kt b/src/net/torvald/terrarum/audio/dsp/Spectro.kt index 885b93e83..1c54497b1 100644 --- a/src/net/torvald/terrarum/audio/dsp/Spectro.kt +++ b/src/net/torvald/terrarum/audio/dsp/Spectro.kt @@ -11,7 +11,7 @@ import net.torvald.terrarum.ui.BasicDebugInfoWindow.Companion.STRIP_W import net.torvald.terrarum.ui.Toolkit import kotlin.math.* -class Spectro(val gain: Float = 1f) : TerrarumAudioFilter() { +class Spectro(var gain: Float = 1f) : TerrarumAudioFilter() { private val FFTSIZE = 1024 private val inBuf = Array(2) { FloatArray(FFTSIZE) } @@ -91,10 +91,16 @@ class Spectro(val gain: Float = 1f) : TerrarumAudioFilter() { } override val debugViewHeight = STRIP_W + + override fun copyParamsFrom(other: TerrarumAudioFilter) { + if (other is Spectro) { + this.gain = other.gain + } + } } -class Vecto(val gain: Float = 1f) : TerrarumAudioFilter() { +class Vecto(var gain: Float = 1f) : TerrarumAudioFilter() { var backbufL = Array((6144f / App.audioBufferSize).roundToInt().coerceAtLeast(1)) { FloatArray(App.audioBufferSize) } @@ -154,4 +160,10 @@ class Vecto(val gain: Float = 1f) : TerrarumAudioFilter() { } override val debugViewHeight = STRIP_W + + override fun copyParamsFrom(other: TerrarumAudioFilter) { + if (other is Vecto) { + this.gain = other.gain + } + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/audio/dsp/TerrarumAudioFilter.kt b/src/net/torvald/terrarum/audio/dsp/TerrarumAudioFilter.kt index 097ec6800..878a35087 100644 --- a/src/net/torvald/terrarum/audio/dsp/TerrarumAudioFilter.kt +++ b/src/net/torvald/terrarum/audio/dsp/TerrarumAudioFilter.kt @@ -15,6 +15,7 @@ abstract class TerrarumAudioFilter { } abstract fun drawDebugView(batch: SpriteBatch, x: Int, y: Int) abstract val debugViewHeight: Int + abstract fun copyParamsFrom(other: TerrarumAudioFilter) } fun FloatArray.applyGain(gain: Float = 1f) = this.map { it * gain }.toFloatArray() diff --git a/src/net/torvald/terrarum/audio/dsp/XYtoMS.kt b/src/net/torvald/terrarum/audio/dsp/XYtoMS.kt index ceb19e484..466780ba8 100644 --- a/src/net/torvald/terrarum/audio/dsp/XYtoMS.kt +++ b/src/net/torvald/terrarum/audio/dsp/XYtoMS.kt @@ -19,6 +19,9 @@ object XYtoMS: TerrarumAudioFilter() { } override val debugViewHeight = 0 + + override fun copyParamsFrom(other: TerrarumAudioFilter) { + } } object MStoXY: TerrarumAudioFilter() { @@ -37,4 +40,7 @@ object MStoXY: TerrarumAudioFilter() { } override val debugViewHeight = 0 + + override fun copyParamsFrom(other: TerrarumAudioFilter) { + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt index 5b9ca330d..5d59ac7c9 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt @@ -69,7 +69,7 @@ class FixtureJukebox : Electric { } - App.audioMixerRenewHooks[this] = { stopGracefully() } +// App.audioMixerRenewHooks[this] = { stopGracefully() } } override val canBeDespawned: Boolean @@ -177,7 +177,7 @@ class FixtureJukebox : Electric { } override fun dispose() { - App.audioMixerRenewHooks.remove(this) +// App.audioMixerRenewHooks.remove(this) super.dispose() // testMusic.gdxMusic.dispose() }