diff --git a/src/net/torvald/terrarum/App.java b/src/net/torvald/terrarum/App.java index 7ac303721..a67007669 100644 --- a/src/net/torvald/terrarum/App.java +++ b/src/net/torvald/terrarum/App.java @@ -340,6 +340,8 @@ public class App implements ApplicationListener { public static boolean gl40capable = false; + public static Thread audioManagerThread; + public static void main(String[] args) { long st = System.nanoTime(); @@ -908,6 +910,7 @@ public class App implements ApplicationListener { public void dispose() { System.out.println("Goodbye !"); + audioManagerThread.interrupt(); if (currentScreen != null) { currentScreen.hide(); @@ -1177,6 +1180,11 @@ public class App implements ApplicationListener { } + AudioManager.INSTANCE.getMasterVolume(); + audioManagerThread = new Thread(new AudioManagerRunnable(), "TerrarumAudioManager"); + audioManagerThread.setPriority(2); + audioManagerThread.start(); + Terrarum.initialise(); diff --git a/src/net/torvald/terrarum/AudioManager.kt b/src/net/torvald/terrarum/AudioManager.kt index 16d55adba..5c95e8784 100644 --- a/src/net/torvald/terrarum/AudioManager.kt +++ b/src/net/torvald/terrarum/AudioManager.kt @@ -1,5 +1,8 @@ package net.torvald.terrarum +import net.torvald.terrarum.App.printdbg +import net.torvald.terrarum.modulebasegame.MusicContainer + /** * Created by minjaesong on 2023-11-07. */ @@ -17,4 +20,89 @@ object AudioManager { val ambientVolume: Float get() = (App.getConfigDouble("sfxvolume") * App.getConfigDouble("mastervolume")).toFloat() + + var currentMusic: MusicContainer? = null + var currentAmbient: MusicContainer? = null + + private var nextMusic: MusicContainer? = null + + private var fadeAkku = 0f + private var fadeLength = 1f + + private var fadeoutFired = false + private var fadeinFired = false + + fun update(delta: Float) { + if (fadeoutFired) { + fadeAkku += delta + currentMusic?.gdxMusic?.volume = musicVolume * (1f - (fadeAkku / fadeLength)).coerceIn(0f, 1f) + + printdbg(this, "Fadeout fired - akku: $fadeAkku; volume: ${currentMusic?.gdxMusic?.volume}") + + if (fadeAkku >= fadeLength) { + fadeoutFired = false + currentMusic?.gdxMusic?.volume = 0f + currentMusic?.gdxMusic?.pause() + currentMusic = null + + printdbg(this, "Fadeout end") + } + } + // process fadein request + else if (fadeinFired) { + fadeAkku += delta + currentMusic?.gdxMusic?.volume = (musicVolume * (fadeAkku / fadeLength)).coerceIn(0f, 1f) + + printdbg(this, "Fadein fired - akku: $fadeAkku; volume: ${currentMusic?.gdxMusic?.volume}") + + if (currentMusic?.gdxMusic?.isPlaying == false) { + currentMusic?.gdxMusic?.play() + printdbg(this, "Fadein starting music ${currentMusic?.name}") + } + + if (fadeAkku >= fadeLength) { + currentMusic?.gdxMusic?.volume = musicVolume + fadeinFired = false + + printdbg(this, "Fadein end") + } + } + + + if (currentMusic?.gdxMusic?.isPlaying != true && nextMusic != null) { + printdbg(this, "Playing next music: ${nextMusic!!.name}") + currentMusic = nextMusic + nextMusic = null + currentMusic!!.gdxMusic.volume = musicVolume + currentMusic!!.gdxMusic.play() + } + } + + fun startMusic(song: MusicContainer) { + if (currentMusic?.gdxMusic?.isPlaying == true) { + requestFadeOut(1f) + } + nextMusic = song + } + + fun stopMusic() { + requestFadeOut(1f) + } + + fun requestFadeOut(length: Float) { + if (!fadeoutFired) { + fadeLength = length.coerceAtLeast(1f/1024f) + fadeAkku = 0f + fadeoutFired = true + } + } + + fun requestFadeIn(length: Float) { + if (!fadeinFired) { + fadeLength = length.coerceAtLeast(1f/1024f) + fadeAkku = 0f + fadeinFired = true + } + } + } \ No newline at end of file diff --git a/src/net/torvald/terrarum/AudioManagerRunnable.kt b/src/net/torvald/terrarum/AudioManagerRunnable.kt new file mode 100644 index 000000000..11a2f97ab --- /dev/null +++ b/src/net/torvald/terrarum/AudioManagerRunnable.kt @@ -0,0 +1,28 @@ +package net.torvald.terrarum + +import com.badlogic.gdx.Gdx +import net.torvald.terrarum.gamecontroller.InputStrober + +/** + * Created by minjaesong on 2023-11-08. + */ +class AudioManagerRunnable : Runnable { + + var oldT = System.nanoTime() + var dT = 0f + + override fun run() { + while (!Thread.interrupted()) { + try { + val T = System.nanoTime() + dT = (T - oldT) / 1000000000f + oldT = T; + AudioManager.update(dT) + Thread.sleep(20L) + } + catch (e: InterruptedException) { + break + } + } + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/MusicGovernor.kt b/src/net/torvald/terrarum/MusicGovernor.kt index f96d3e2ca..6b5211da9 100644 --- a/src/net/torvald/terrarum/MusicGovernor.kt +++ b/src/net/torvald/terrarum/MusicGovernor.kt @@ -11,26 +11,7 @@ open class MusicGovernor { protected var intermissionLength = 1f protected var musicFired = false - protected var fadeoutAkku = 0f - protected var fadeoutLength = 0f - protected var fadeoutFired = false - protected var fadeinFired = false - fun requestFadeOut(length: Float) { - if (!fadeoutFired) { - fadeoutLength = length - fadeoutAkku = 0f - fadeoutFired = true - } - } - - fun requestFadeIn(length: Float) { - if (!fadeoutFired) { - fadeoutLength = length - fadeoutAkku = 0f - fadeinFired = true - } - } open fun dispose() { } diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt index 7b43e3119..0137f35c1 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt @@ -36,34 +36,37 @@ class TerrarumMusicGovernor : MusicGovernor() { private var musicBin: ArrayList = ArrayList(songs.indices.toList().shuffled()) - private var currentMusic: MusicContainer? = null - private var currentAmbient: MusicContainer? = null + init { + songs.forEach { + App.disposables.add(it.gdxMusic) + } + } private var warningPrinted = false + private val STATE_INIT = 0 + private val STATE_FIREPLAY = 1 + private val STATE_PLAYING = 2 + private val STATE_INTERMISSION = 3 + private fun stopMusic() { - printdbg(this, "Now stopping: $currentMusic") - state = 2 + AudioManager.stopMusic() + state = STATE_INTERMISSION intermissionAkku = 0f intermissionLength = 30f + 30f * Math.random().toFloat() // 30s-60s musicFired = false - currentMusic = null - fadeoutFired = false printdbg(this, "Intermission: $intermissionLength seconds") } private fun startMusic(song: MusicContainer) { - song.gdxMusic.volume = AudioManager.musicVolume - song.gdxMusic.play() + AudioManager.startMusic(song) printdbg(this, "Now playing: $song") - INGAME.sendNotification("Now Playing $EMDASH ${song.name}") - - currentMusic = song + state = STATE_PLAYING } @@ -77,11 +80,11 @@ class TerrarumMusicGovernor : MusicGovernor() { } // val ingame = ingame as TerrarumIngame - if (state == 0) state = 2 + if (state == 0) state = STATE_INTERMISSION when (state) { - 1 -> { + STATE_FIREPLAY -> { if (!musicFired) { musicFired = true @@ -92,32 +95,14 @@ class TerrarumMusicGovernor : MusicGovernor() { } startMusic(song) - - // process fadeout request - if (fadeoutFired) { - fadeoutAkku += delta - currentMusic?.gdxMusic?.volume = 1f - AudioManager.musicVolume * (fadeoutAkku / fadeoutLength) - - if (fadeoutAkku >= fadeoutLength) { - currentMusic?.gdxMusic?.pause() - } - } - // process fadein request - else if (fadeinFired) { - if (currentMusic?.gdxMusic?.isPlaying == false) { - currentMusic?.gdxMusic?.play() - } - fadeoutAkku += delta - currentMusic?.gdxMusic?.volume = AudioManager.musicVolume * (fadeoutAkku / fadeoutLength) - } - } - else { - if (currentMusic?.gdxMusic?.isPlaying == false) { - stopMusic() - } } } - 2 -> { + STATE_PLAYING -> { + if (AudioManager.currentMusic?.gdxMusic?.isPlaying == false) { +// stopMusic() + } + } + STATE_INTERMISSION -> { intermissionAkku += delta if (intermissionAkku >= intermissionLength) { @@ -130,8 +115,6 @@ class TerrarumMusicGovernor : MusicGovernor() { } override fun dispose() { - currentMusic?.gdxMusic?.stop() stopMusic() - songs.forEach { it.gdxMusic.tryDispose() } } }