diff --git a/src/net/torvald/terrarum/audio/AudioMixer.kt b/src/net/torvald/terrarum/audio/AudioMixer.kt index e9057402e..1b17d56a8 100644 --- a/src/net/torvald/terrarum/audio/AudioMixer.kt +++ b/src/net/torvald/terrarum/audio/AudioMixer.kt @@ -53,19 +53,21 @@ class AudioMixer(val bufferSize: Int): Disposable { val dynamicSourceCount: Int get() = App.getConfigInt("audio_dynamic_source_max") - val tracks = Array(8) { TerrarumAudioMixerTrack( + val tracks = Array(10) { TerrarumAudioMixerTrack( if (it == 0) "Music" - else if (it == 1) "Ambient" - else if (it == 2) "GUI" - else if (it == 3) "\u00E4SFX" - else if (it == 4) "\u00F0 \u00E4 \u00F0" // summation - else if (it == 5) "\u00D9Open\u00D9" // convolution1 - else if (it == 6) "\u00D9Cave\u00D9" // convolution2 - else if (it == 7) "\u00F0 \u00DA \u00F0" // fade + else if (it == 1) "Amb1" + else if (it == 2) "Amb2" + else if (it == 3) "GUI" + else if (it == 4) "\u00E4AMB" + else if (it == 5) "\u00E4SFX" + else if (it == 6) "\u00F0 \u00E4 \u00F0" // summation + else if (it == 7) "\u00D9Open\u00D9" // convolution1 + else if (it == 8) "\u00D9Cave\u00D9" // convolution2 + else if (it == 9) "\u00F0 \u00DA \u00F0" // fade else "Trk${it+1}", trackType = if (it >= 3) TrackType.BUS else TrackType.STATIC_SOURCE, maxVolumeFun = { when (it) { 0 -> { musicVolume } - 1 -> { ambientVolume } + 4 -> { ambientVolume } 2 -> { sfxVolume } 3 -> { guiVolume } else -> { 1.0 } @@ -82,21 +84,25 @@ class AudioMixer(val bufferSize: Int): Disposable { val musicTrack: TerrarumAudioMixerTrack get() = tracks[0] - val ambientTrack: TerrarumAudioMixerTrack + val ambientTrack1: TerrarumAudioMixerTrack get() = tracks[1] - val guiTrack: TerrarumAudioMixerTrack + val ambientTrack2: TerrarumAudioMixerTrack get() = tracks[2] - val sfxSumBus: TerrarumAudioMixerTrack + val guiTrack: TerrarumAudioMixerTrack get() = tracks[3] - val sumBus: TerrarumAudioMixerTrack + val ambSumBus: TerrarumAudioMixerTrack get() = tracks[4] - val convolveBusOpen: TerrarumAudioMixerTrack + val sfxSumBus: TerrarumAudioMixerTrack get() = tracks[5] - val convolveBusCave: TerrarumAudioMixerTrack + val sumBus: TerrarumAudioMixerTrack get() = tracks[6] - val fadeBus: TerrarumAudioMixerTrack + val convolveBusOpen: TerrarumAudioMixerTrack get() = tracks[7] + val convolveBusCave: TerrarumAudioMixerTrack + get() = tracks[8] + val fadeBus: TerrarumAudioMixerTrack + get() = tracks[9] var processing = false @@ -195,7 +201,7 @@ class AudioMixer(val bufferSize: Int): Disposable { init { // initialise audio paths // - listOf(musicTrack, ambientTrack, sfxSumBus, guiTrack).forEach { + listOf(musicTrack, ambientTrack1, ambientTrack2, sfxSumBus, guiTrack).forEach { it.filters[0] = Gain(1f) } @@ -206,15 +212,21 @@ class AudioMixer(val bufferSize: Int): Disposable { musicTrack.filters[1] = Vecto() musicTrack.filters[2] = Spectro() - ambientTrack.filters[1] = Vecto(decibelsToFullscale(24.0).toFloat()) - ambientTrack.filters[2] = Spectro() - ambientTrack.filters[3] = Gain(1f) + ambientTrack1.filters[1] = Vecto(decibelsToFullscale(32.0).toFloat()) + ambientTrack1.filters[2] = Spectro() + ambientTrack2.filters[1] = Vecto(decibelsToFullscale(32.0).toFloat()) + ambientTrack2.filters[2] = Spectro() sfxSumBus.filters[1] = Vecto(0.7071f) sfxSumBus.filters[2] = Spectro() + ambSumBus.addSidechainInput(ambientTrack1, 1.0) + ambSumBus.addSidechainInput(ambientTrack2, 1.0) + ambSumBus.filters[0] = Gain(1f) // controlled by the ambient volume config + ambSumBus.filters[1] = Gain(1f) // controlled by the "openness" controller + listOf(sumBus, convolveBusOpen, convolveBusCave).forEach { it.addSidechainInput(musicTrack, 1.0) - it.addSidechainInput(ambientTrack, 1.0) + it.addSidechainInput(ambSumBus, 1.0) it.addSidechainInput(sfxSumBus, 1.0) } @@ -268,7 +280,7 @@ class AudioMixer(val bufferSize: Int): Disposable { ) private val fadeReqs = HashMap().also { map -> - listOf(musicTrack, ambientTrack, guiTrack, fadeBus).forEach { + listOf(musicTrack, ambientTrack1, ambientTrack2, guiTrack, ambSumBus, fadeBus).forEach { map[it] = FadeRequest() } } @@ -335,7 +347,7 @@ class AudioMixer(val bufferSize: Int): Disposable { (Gdx.audio as? Lwjgl3Audio)?.update() masterTrack.volume = masterVolume musicTrack.getFilter().gain = musicVolume.toFloat() * 0.5f - ambientTrack.getFilter().gain = ambientVolume.toFloat() * 2 + ambSumBus.getFilter().gain = ambientVolume.toFloat() * 2 sfxSumBus.getFilter().gain = sfxVolume.toFloat() guiTrack.getFilter().gain = guiVolume.toFloat() @@ -356,9 +368,13 @@ class AudioMixer(val bufferSize: Int): Disposable { musicTrack.stop() musicTrack.currentTrack = null } - if (req.fadeTarget == 0.0 && (track == musicTrack || track == fadeBus)) { - ambientTrack.stop() - ambientTrack.currentTrack = null + if (req.fadeTarget == 0.0 && track == ambientTrack1) { + ambientTrack1.stop() + ambientTrack1.currentTrack = null + } + if (req.fadeTarget == 0.0 && track == ambientTrack2) { + ambientTrack2.stop() + ambientTrack2.currentTrack = null } req.callback() @@ -408,13 +424,13 @@ class AudioMixer(val bufferSize: Int): Disposable { musicTrack.play() } - if (!ambientTrack.isPlaying && ambientTrack.nextTrack != null) { - ambientTrack.queueNext(null) + if (!ambientTrack1.isPlaying && ambientTrack1.nextTrack != null) { + ambientTrack1.queueNext(null) if (ambientStopped) { - requestFadeIn(ambientTrack, DEFAULT_FADEOUT_LEN * 4, 1.0, 0.00001) + requestFadeIn(ambientTrack1, DEFAULT_FADEOUT_LEN * 4, 1.0, 0.00001) } - ambientTrack.volume = 1.0 - ambientTrack.play() + ambientTrack1.volume = 1.0 + ambientTrack1.play() ambientStopped = false } } @@ -433,6 +449,15 @@ class AudioMixer(val bufferSize: Int): Disposable { } fun startAmb(song: MusicContainer) { + val ambientTrack = if (!ambientTrack1.streamPlaying) + ambientTrack1 + else if (!ambientTrack2.streamPlaying) + ambientTrack2 + else if (ambientTrack1.playStartedTime < ambientTrack2.playStartedTime) + ambientTrack1 + else + ambientTrack2 + if (ambientTrack.isPlaying == true) { requestFadeOut(musicTrack, DEFAULT_FADEOUT_LEN) } @@ -440,10 +465,6 @@ class AudioMixer(val bufferSize: Int): Disposable { // fade will be processed by the update() } - fun stopAmb() { - requestFadeOut(ambientTrack, DEFAULT_FADEOUT_LEN * 4) - } - fun requestFadeOut(track: TerrarumAudioMixerTrack, length: Double = DEFAULT_FADEOUT_LEN, target: Double = 0.0, source: Double? = null, jobAfterFadeout: () -> Unit = {}) { val req = fadeReqs[track]!! if (!req.fadeoutFired) { diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index 613e25456..106afcda2 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -913,7 +913,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { App.audioMixer.convolveBusCave.volume = 0.0 } val openness = (TileSurvey.getRatio("basegame.Ingame.openness") ?: 0.0).times(1.74).coerceIn(0.0, 1.0) - (App.audioMixer.ambientTrack.filters[3] as Gain).gain = openness.pow(2.0 / 3.0).toFloat() + (App.audioMixer.ambSumBus.filters[1] as Gain).gain = openness.pow(2.0 / 3.0).toFloat() diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt index 7b29393a2..759bc9ee4 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt @@ -15,6 +15,7 @@ import net.torvald.reflection.forceInvoke import net.torvald.terrarum.* import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.audio.AudioMixer +import net.torvald.terrarum.audio.TerrarumAudioMixerTrack import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATE import java.io.File import java.io.FileInputStream @@ -371,8 +372,8 @@ class TerrarumMusicGovernor : MusicGovernor() { } private fun stopAmbient() { - if (::currentAmbientTrack.isInitialized) - App.audioMixer.ambientTrack.nextTrack = currentAmbientTrack +// if (::currentAmbientTrack.isInitialized) +// App.audioMixer.ambientTrack.nextTrack = currentAmbientTrack } private fun startAmbient(song: MusicContainer) { diff --git a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt index d12e6106e..f8b6e8425 100644 --- a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt +++ b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt @@ -266,7 +266,7 @@ class TitleScreen(batch: FlippingSpriteBatch) : IngameInstance(batch) { App.bogoflops = maxOf(App.bogoflops, bogoflops) - App.audioMixer.ambientTrack.let { + listOf(App.audioMixer.ambientTrack1, App.audioMixer.ambientTrack2).forEach { it.stop() it.currentTrack = null it.nextTrack = null