diff --git a/src/net/torvald/terrarum/App.java b/src/net/torvald/terrarum/App.java index 05567d2bb..9b736fa7a 100644 --- a/src/net/torvald/terrarum/App.java +++ b/src/net/torvald/terrarum/App.java @@ -1971,7 +1971,7 @@ public class App implements ApplicationListener { public static void playGUIsound(MusicContainer sound, double volume, float pan) { if (!highPrioritySoundPlaying) { - var it = audioMixer.getFreeGuiTrackNoMatterWhat(); + var it = audioMixer.getFreeGuiTrack(); if (it != null) { it.stop(); it.setCurrentTrack(sound); diff --git a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt index f22e2a036..c4de7988c 100644 --- a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt +++ b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt @@ -1,6 +1,5 @@ package net.torvald.terrarum.audio -import net.torvald.reflection.forceInvoke import net.torvald.terrarum.* import net.torvald.terrarum.audio.AudioMixer.Companion.DS_FLTIDX_LOW import net.torvald.terrarum.audio.AudioMixer.Companion.DS_FLTIDX_PAN @@ -13,7 +12,9 @@ import net.torvald.terrarum.audio.dsp.NullFilter import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameactors.ActorWithBody.Companion.GAME_TO_SI_VELO import org.dyn4j.geometry.Vector2 -import kotlin.math.* +import kotlin.math.absoluteValue +import kotlin.math.cosh +import kotlin.math.sqrt /** * Created by minjaesong on 2023-11-17. diff --git a/src/net/torvald/terrarum/audio/MusicCache.kt b/src/net/torvald/terrarum/audio/MusicCache.kt new file mode 100644 index 000000000..7577cc467 --- /dev/null +++ b/src/net/torvald/terrarum/audio/MusicCache.kt @@ -0,0 +1,21 @@ +package net.torvald.terrarum.audio + +import com.badlogic.gdx.utils.Disposable +import net.torvald.terrarum.tryDispose + +class MusicCache(val trackName: String) : Disposable { + + private val cache = HashMap() + + fun getOrPut(music: MusicContainer?): MusicContainer? { + if (music != null && music.toRAM) { // for now only the on-the-RAM tracks are getting cached + println("Cacheing music ${music.name} for track $trackName") + return cache.getOrPut(music.name) { music.makeCopy() } + } + else return null + } + + override fun dispose() { + cache.values.forEach { it.tryDispose() } + } +} diff --git a/src/net/torvald/terrarum/audio/MusicContainer.kt b/src/net/torvald/terrarum/audio/MusicContainer.kt index 04b582338..8b378ac41 100644 --- a/src/net/torvald/terrarum/audio/MusicContainer.kt +++ b/src/net/torvald/terrarum/audio/MusicContainer.kt @@ -29,7 +29,7 @@ data class MusicContainer( val codec: String var samplesReadCount = 0L; internal set - val samplesTotal: Long + var samplesTotal: Long private val gdxMusic: Music = Gdx.audio.newMusic(FileHandle(file)) @@ -185,4 +185,22 @@ data class MusicContainer( gdxMusic.dispose() soundBuf?.destroy() } + + fun makeCopy(): MusicContainer { + val new = MusicContainer(name, file, looping, false, songFinishedHook) + + synchronized(this) { + if (this.toRAM) { + // perform unsafe memcpy + new.soundBuf = UnsafeHelper.allocate(this.soundBuf!!.size) + UnsafeHelper.memcpy(this.soundBuf!!, 0L, new.soundBuf!!, 0L, new.soundBuf!!.size) + + // set toRAM flag + val toRamField = new.javaClass.getDeclaredField("toRAM") + UnsafeHelper.unsafe.putBoolean(new, UnsafeHelper.unsafe.objectFieldOffset(toRamField), true) + } + } + + return new + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt b/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt index dc99ee4f9..5c680b928 100644 --- a/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt +++ b/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt @@ -43,7 +43,14 @@ class TerrarumAudioMixerTrack( } var currentTrack: MusicContainer? = null + set(value) { + field = musicCache.getOrPut(value) + } + var nextTrack: MusicContainer? = null + set(value) { + field = musicCache.getOrPut(value) + } var volume: TrackVolume = 1.0 get() = field @@ -66,11 +73,14 @@ class TerrarumAudioMixerTrack( var playStartedTime = 0L; internal set var checkedOutTime = 0L; internal set + private var musicCache = MusicCache(name) + fun copyStatusTo(other: TerrarumAudioMixerTrack) { other.pullNextTrack = this.pullNextTrack other.currentTrack = this.currentTrack other.nextTrack = this.nextTrack other.volume = this.volume + other.musicCache = this.musicCache other.trackingTarget = this.trackingTarget other.streamPlaying.set(this.streamPlaying.get()) other.playStartedTime = this.playStartedTime @@ -156,6 +166,7 @@ class TerrarumAudioMixerTrack( processor.stop() processorThread.join()*/ adev?.dispose() + musicCache.dispose() } override fun equals(other: Any?) = this.hash == (other as TerrarumAudioMixerTrack).hash diff --git a/src/net/torvald/terrarum/audio/dsp/LoFi.kt b/src/net/torvald/terrarum/audio/dsp/LoFi.kt index 900461543..e0415acc2 100644 --- a/src/net/torvald/terrarum/audio/dsp/LoFi.kt +++ b/src/net/torvald/terrarum/audio/dsp/LoFi.kt @@ -1,14 +1,8 @@ package net.torvald.terrarum.audio.dsp -import com.badlogic.gdx.Gdx import com.badlogic.gdx.graphics.g2d.SpriteBatch -import net.torvald.reflection.forceInvoke import net.torvald.terrarum.App import net.torvald.terrarum.audio.AudioHelper -import net.torvald.terrarum.audio.AudioProcessBuf.Companion.MP3_CHUNK_SIZE -import net.torvald.terrarum.audio.decibelsToFullscale -import net.torvald.terrarum.serialise.toUint -import java.io.File import kotlin.math.absoluteValue import kotlin.math.tanh