From 9caf9ab2fafbf2c4f7f395d0ae6cee0b0d834498 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sat, 17 Feb 2024 00:30:04 +0900 Subject: [PATCH] fix: explosion cuts off randomly --- .../audio/effects/explosion/bang_small.ogg | 3 -- .../basegame/audio/effects/explosion/fuse.ogg | 3 ++ .../audio/effects/explosion/fuse_continue.ogg | 3 ++ src/net/torvald/terrarum/CreditSingleton.kt | 9 ++-- src/net/torvald/terrarum/audio/AudioMixer.kt | 4 +- .../terrarum/audio/MixerTrackProcessor.kt | 13 +++-- .../torvald/terrarum/audio/MusicContainer.kt | 8 +-- .../terrarum/audio/TerrarumAudioMixerTrack.kt | 16 ++++-- src/net/torvald/terrarum/gameactors/Actor.kt | 49 ++++++++++++++----- .../modulebasegame/ExplosionManager.kt | 12 ++--- .../gameactors/ActorPrimedBomb.kt | 29 +++++++++++ .../terrarum/ui/BasicDebugInfoWindow.kt | 2 +- 12 files changed, 110 insertions(+), 41 deletions(-) delete mode 100644 assets/mods/basegame/audio/effects/explosion/bang_small.ogg create mode 100644 assets/mods/basegame/audio/effects/explosion/fuse.ogg create mode 100644 assets/mods/basegame/audio/effects/explosion/fuse_continue.ogg diff --git a/assets/mods/basegame/audio/effects/explosion/bang_small.ogg b/assets/mods/basegame/audio/effects/explosion/bang_small.ogg deleted file mode 100644 index 8a5def614..000000000 --- a/assets/mods/basegame/audio/effects/explosion/bang_small.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7b529f192c1dc4fc8833ab516907c680d5c0d16368c723ea8736adee5ba8ab5 -size 31188 diff --git a/assets/mods/basegame/audio/effects/explosion/fuse.ogg b/assets/mods/basegame/audio/effects/explosion/fuse.ogg new file mode 100644 index 000000000..85b59f55e --- /dev/null +++ b/assets/mods/basegame/audio/effects/explosion/fuse.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abe59ab65df6569b3a89dddfca0ac80026ec4252353b26732e843c020b80fe4d +size 429970 diff --git a/assets/mods/basegame/audio/effects/explosion/fuse_continue.ogg b/assets/mods/basegame/audio/effects/explosion/fuse_continue.ogg new file mode 100644 index 000000000..4d15879a7 --- /dev/null +++ b/assets/mods/basegame/audio/effects/explosion/fuse_continue.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ab2d2f7c75866a05cefaa6338e8a533648c8b2d5181dc8256dfbbadacea78a1 +size 428307 diff --git a/src/net/torvald/terrarum/CreditSingleton.kt b/src/net/torvald/terrarum/CreditSingleton.kt index 777a914fd..fdd2ffc98 100644 --- a/src/net/torvald/terrarum/CreditSingleton.kt +++ b/src/net/torvald/terrarum/CreditSingleton.kt @@ -340,10 +340,11 @@ Sound from ℗ 2019 Richwise Sound from - - effects/explosion/bang_small.ogg - -℗ 2009 Superex1110 -Sound from + - effects/explosion/fuse.ogg + - effects/explosion/fuse_continue.ogg + +℗ 2012, 2015 j1987 and ScouseMouseJB +Sound from and diff --git a/src/net/torvald/terrarum/audio/AudioMixer.kt b/src/net/torvald/terrarum/audio/AudioMixer.kt index 1487ad97e..a30aff66d 100644 --- a/src/net/torvald/terrarum/audio/AudioMixer.kt +++ b/src/net/torvald/terrarum/audio/AudioMixer.kt @@ -453,9 +453,9 @@ class AudioMixer : Disposable { } fun startAmb(song: MusicContainer) { - val ambientTrack = if (!ambientTrack1.streamPlaying) + val ambientTrack = if (!ambientTrack1.streamPlaying.get()) ambientTrack1 - else if (!ambientTrack2.streamPlaying) + else if (!ambientTrack2.streamPlaying.get()) ambientTrack2 else if (ambientTrack1.playStartedTime < ambientTrack2.playStartedTime) ambientTrack1 diff --git a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt index 19174c2a4..dcc6f290a 100644 --- a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt +++ b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt @@ -181,8 +181,15 @@ class MixerTrackProcessor(bufferSize: Int, val rate: Int, val track: TerrarumAud // fetch deviceBufferSize amount of sample from the disk - if (track.trackType != TrackType.MASTER && track.trackType != TrackType.BUS && track.streamPlaying) { - if (streamBuf == null && track.currentTrack != null) allocateStreamBuf(track) + if (track.playRequested.get()) { + track.play() + } + + if (track.trackType != TrackType.MASTER && track.trackType != TrackType.BUS && track.streamPlaying.get()) { + if (streamBuf == null && track.currentTrack != null) { + allocateStreamBuf(track) + } + streamBuf!!.fetchBytes() } @@ -208,7 +215,7 @@ class MixerTrackProcessor(bufferSize: Int, val rate: Int, val track: TerrarumAud } // source channel: skip processing if there's no active input // else if (track.getSidechains().any { it != null && !it.isBus && !it.isMaster && !it.streamPlaying } && !track.streamPlaying) { - else if (!track.streamPlaying || streamBuf == null || streamBuf!!.validSamplesInBuf < App.audioBufferSize) { + else if (!track.streamPlaying.get() || streamBuf == null || streamBuf!!.validSamplesInBuf < App.audioBufferSize) { samplesL1 = emptyBuf samplesR1 = emptyBuf diff --git a/src/net/torvald/terrarum/audio/MusicContainer.kt b/src/net/torvald/terrarum/audio/MusicContainer.kt index 07da21812..686c59f9e 100644 --- a/src/net/torvald/terrarum/audio/MusicContainer.kt +++ b/src/net/torvald/terrarum/audio/MusicContainer.kt @@ -41,13 +41,13 @@ data class MusicContainer( is Wav.Music -> { val rate = gdxMusic.extortField("input")!!.sampleRate - App.printdbg(this, "music $name is WAV; rate = $rate") +// App.printdbg(this, "music $name is WAV; rate = $rate") rate } is Ogg.Music -> { val rate = gdxMusic.extortField("input")!!.sampleRate - App.printdbg(this, "music $name is OGG; rate = $rate") +// App.printdbg(this, "music $name is OGG; rate = $rate") rate } is Mp3.Music -> { @@ -62,11 +62,11 @@ data class MusicContainer( // val rate = header.sampleRate // gdxMusic.reset() - App.printdbg(this, "music $name is MP3; rate = $rate") +// App.printdbg(this, "music $name is MP3; rate = $rate") rate } else -> { - App.printdbg(this, "music $name is ${gdxMusic::class.qualifiedName}; rate = default") +// App.printdbg(this, "music $name is ${gdxMusic::class.qualifiedName}; rate = default") TerrarumAudioMixerTrack.SAMPLING_RATE } } diff --git a/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt b/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt index 0c3e09993..a11e75d7f 100644 --- a/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt +++ b/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt @@ -5,11 +5,14 @@ import com.badlogic.gdx.backends.lwjgl3.audio.OpenALLwjgl3Audio import com.badlogic.gdx.utils.Disposable import com.badlogic.gdx.utils.Queue import net.torvald.terrarum.App +import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.audio.dsp.NullFilter import net.torvald.terrarum.audio.dsp.TerrarumAudioFilter import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.getHashStr import net.torvald.terrarum.hashStrMap +import net.torvald.terrarum.printStackTrace +import java.util.concurrent.atomic.AtomicBoolean import kotlin.math.log10 import kotlin.math.pow @@ -60,7 +63,7 @@ class TerrarumAudioMixerTrack( var trackingTarget: Actor? = null - internal var streamPlaying = false + internal val streamPlaying = AtomicBoolean(false) var playStartedTime = 0L; internal set @@ -70,7 +73,7 @@ class TerrarumAudioMixerTrack( other.nextTrack = this.nextTrack other.volume = this.volume other.trackingTarget = this.trackingTarget - other.streamPlaying = this.streamPlaying + other.streamPlaying.set(this.streamPlaying.get()) other.playStartedTime = this.playStartedTime filters.indices.forEach { i -> other.filters[i].copyParamsFrom(this.filters[i]) @@ -133,15 +136,18 @@ class TerrarumAudioMixerTrack( nextTrack = nextNext } + val playRequested = AtomicBoolean(false) + fun play() { playStartedTime = System.nanoTime() - streamPlaying = true + streamPlaying.set(true) + playRequested.set(false) // currentTrack?.gdxMusic?.play() } val isPlaying: Boolean - get() = streamPlaying//currentTrack?.gdxMusic?.isPlaying + get() = streamPlaying.get()//currentTrack?.gdxMusic?.isPlaying override fun dispose() { /*if (isMaster) { // uncomment to multithread @@ -158,7 +164,7 @@ class TerrarumAudioMixerTrack( fun stop() { currentTrack?.reset() - streamPlaying = false + streamPlaying.set(false) // playStartedTime = 0L if (trackingTarget != null && currentTrack != null) { diff --git a/src/net/torvald/terrarum/gameactors/Actor.kt b/src/net/torvald/terrarum/gameactors/Actor.kt index fe8b913f2..3242febf6 100644 --- a/src/net/torvald/terrarum/gameactors/Actor.kt +++ b/src/net/torvald/terrarum/gameactors/Actor.kt @@ -2,6 +2,7 @@ package net.torvald.terrarum.gameactors import net.torvald.random.HQRNG import net.torvald.terrarum.App +import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.INGAME import net.torvald.terrarum.Terrarum import net.torvald.terrarum.audio.MusicContainer @@ -12,6 +13,9 @@ import net.torvald.terrarum.modulebasegame.gameactors.ActorHumanoid import net.torvald.terrarum.modulebasegame.gameactors.Pocketed import net.torvald.terrarum.savegame.toBigEndian import net.torvald.terrarum.utils.PasswordBase32 +import java.util.* +import kotlin.collections.ArrayList +import kotlin.collections.HashMap typealias ActorID = Int @@ -72,6 +76,8 @@ abstract class Actor : Comparable, Runnable { @Transient open val canBeDespawned = true @Volatile internal var despawned = false + @Transient open val stopMusicOnDespawn = true + override fun equals(other: Any?): Boolean { if (other == null) return false @@ -105,8 +111,12 @@ abstract class Actor : Comparable, Runnable { musicTracks1.forEach { name -> val it = App.audioMixer.dynamicTracks[name.substring(2).toInt() - 1] - println("stop track $name") - it.stop() + printdbg(this, "stop track $name") + + if (stopMusicOnDespawn) { + it.stop() + } + it.filters[0] = NullFilter it.filters[1] = NullFilter it.processor.streamBuf?.pitch = 1f @@ -149,6 +159,7 @@ abstract class Actor : Comparable, Runnable { if (track != null) { musicTracks[music] = track musicTracks1.add(track.name) + track.stop() } } @@ -161,14 +172,20 @@ abstract class Actor : Comparable, Runnable { * To loop the audio, set `music.gdxMusic.isLooping` to `true` */ open fun startAudio(music: MusicContainer, volume: TrackVolume = 1.0, doSomethingWithTrack: (TerrarumAudioMixerTrack) -> Unit = {}) { - getTrackByAudio(music)?.let { - it.stop() - it.trackingTarget = this - it.currentTrack = music - it.maxVolumeFun = { volume } - it.volume = volume - doSomethingWithTrack(it) - it.play() + getTrackByAudio(music).let { + if (it == null) { + printdbg(this, "cannot startAudio $music") + } + else { + printdbg(this, "startAudio $music") + it.trackingTarget = this + it.currentTrack = music + it.maxVolumeFun = { volume } + it.volume = volume + doSomethingWithTrack(it) +// it.play() + it.playRequested.set(true) + } } } @@ -177,9 +194,15 @@ abstract class Actor : Comparable, Runnable { }*/ open fun stopAudio(music: MusicContainer, doSomethingWithTrack: (TerrarumAudioMixerTrack) -> Unit = {}) { - musicTracks[music]?.let { - doSomethingWithTrack(it) - it.stop() + musicTracks[music].let { + if (it == null) { +// printdbg(this, "cannot stopAudio $music") + } + else { +// printdbg(this, "stopAudio $music") + doSomethingWithTrack(it) + it.stop() + } } } diff --git a/src/net/torvald/terrarum/modulebasegame/ExplosionManager.kt b/src/net/torvald/terrarum/modulebasegame/ExplosionManager.kt index f2a32d1fc..94abd3cef 100644 --- a/src/net/torvald/terrarum/modulebasegame/ExplosionManager.kt +++ b/src/net/torvald/terrarum/modulebasegame/ExplosionManager.kt @@ -54,14 +54,14 @@ object ExplosionManager { Thread { while (true) { try { - val job = runners.first { !it.executed } - val executor = Executors.newSingleThreadExecutor() - executor.submit(job.runner).get(500L, TimeUnit.MILLISECONDS) - executor.shutdownNow() - job.executed = true + runners.toList().firstOrNull { !it.executed }?.let { job -> + val executor = Executors.newSingleThreadExecutor() + executor.submit(job.runner).get(500L, TimeUnit.MILLISECONDS) + executor.shutdownNow() + job.executed = true + } } catch (_: TimeoutException) { } - catch (_: NoSuchElementException) { } Thread.sleep(50L) } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorPrimedBomb.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorPrimedBomb.kt index cecd5ac08..acef6f511 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorPrimedBomb.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorPrimedBomb.kt @@ -38,10 +38,36 @@ open class ActorPrimedBomb( ) { this.flagDespawn() } + @Transient private val fuseSound = MusicContainer( + "fuse", ModMgr.getFile("basegame", "audio/effects/explosion/fuse.ogg") + ) { + this.flagDespawn() + } + @Transient private val fuseSoundCont = MusicContainer( + "fuse_continue", ModMgr.getFile("basegame", "audio/effects/explosion/fuse_continue.ogg") + ) { + this.flagDespawn() + } + + private var fuseSoundStatus = 0 // this value must be stored into the savegame + @Transient private var fuseSoundFired = false + + override val stopMusicOnDespawn: Boolean + get() = this.isVisible override fun updateImpl(delta: Float) { super.updateImpl(delta) + if (!fuseSoundFired && fuse > 0f) { + fuseSoundFired = true + if (fuseSoundStatus == 0) { + startAudio(fuseSound, 2.0) + fuseSoundStatus = 1 + } + else + startAudio(fuseSoundCont, 2.0) + } + fuse -= delta if (fuse <= 0f && !explosionCalled) { @@ -57,6 +83,7 @@ open class ActorPrimedBomb( ) { physProp.usePhysics = false this.isVisible = false // or play explosion anim + stopAudio(fuseSound) startAudio(boomSound, 10.0) } } @@ -65,6 +92,8 @@ open class ActorPrimedBomb( override fun dispose() { super.dispose() boomSound.dispose() + fuseSound.dispose() + fuseSoundCont.dispose() } } diff --git a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt index a65199ec1..b3d5fd0a1 100644 --- a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt +++ b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt @@ -805,7 +805,7 @@ class BasicDebugInfoWindow : UICanvas() { drawFaderHandle(batch, sliderX.toFloat(), faderY + 18f + meterHeight - faderKnobDbFs * meterHeight) // currently streaming - if (track.streamPlaying) { + if (track.streamPlaying.get()) { batch.color = ICON_GREEN App.fontSmallNumbers.draw(batch, "\u00C0", x + 17f, faderY + 1f) }