mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-10 22:01:52 +09:00
musicplayer: working stop and next button, button pos on transition
This commit is contained in:
@@ -6,6 +6,7 @@ import com.badlogic.gdx.backends.lwjgl3.audio.Lwjgl3Audio
|
||||
import com.badlogic.gdx.utils.Disposable
|
||||
import com.jme3.math.FastMath
|
||||
import net.torvald.terrarum.*
|
||||
import net.torvald.terrarum.App.printdbg
|
||||
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATE
|
||||
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATED
|
||||
import net.torvald.terrarum.audio.dsp.*
|
||||
@@ -235,6 +236,7 @@ object AudioMixer: Disposable {
|
||||
var fadeinFired: Boolean = false,
|
||||
var fadeTarget: Double = 0.0,
|
||||
var fadeStart: Double = 0.0,
|
||||
var callback: () -> Unit = {},
|
||||
)
|
||||
|
||||
private val fadeReqs = HashMap<TerrarumAudioMixerTrack, FadeRequest>().also { map ->
|
||||
@@ -322,13 +324,16 @@ object AudioMixer: Disposable {
|
||||
track.volume = req.fadeTarget
|
||||
|
||||
// stop streaming if fadeBus is muted
|
||||
if (req.fadeTarget == 0.0 && track == fadeBus) {
|
||||
if (req.fadeTarget == 0.0 && (track == musicTrack || track == fadeBus)) {
|
||||
musicTrack.stop()
|
||||
musicTrack.currentTrack = null
|
||||
|
||||
}
|
||||
if (req.fadeTarget == 0.0 && (track == musicTrack || track == fadeBus)) {
|
||||
ambientTrack.stop()
|
||||
ambientTrack.currentTrack = null
|
||||
}
|
||||
|
||||
req.callback()
|
||||
}
|
||||
}
|
||||
else if (req.fadeinFired) {
|
||||
@@ -340,6 +345,8 @@ object AudioMixer: Disposable {
|
||||
track.volume = req.fadeTarget
|
||||
req.fadeinFired = false
|
||||
}
|
||||
|
||||
req.callback
|
||||
}
|
||||
}
|
||||
|
||||
@@ -369,18 +376,20 @@ object AudioMixer: Disposable {
|
||||
if (!musicTrack.isPlaying && musicTrack.nextTrack != null) {
|
||||
musicTrack.queueNext(null)
|
||||
fadeBus.volume = 1.0
|
||||
musicTrack.volume = 1.0
|
||||
musicTrack.play()
|
||||
}
|
||||
|
||||
if (!ambientTrack.isPlaying && ambientTrack.nextTrack != null) {
|
||||
ambientTrack.queueNext(null)
|
||||
requestFadeIn(ambientTrack, DEFAULT_FADEOUT_LEN * 4, 1.0, 0.00001)
|
||||
ambientTrack.volume = 1.0
|
||||
ambientTrack.play()
|
||||
}
|
||||
}
|
||||
|
||||
fun startMusic(song: MusicContainer) {
|
||||
if (musicTrack.isPlaying == true) {
|
||||
if (musicTrack.isPlaying) {
|
||||
requestFadeOut(musicTrack, DEFAULT_FADEOUT_LEN)
|
||||
}
|
||||
musicTrack.nextTrack = song
|
||||
@@ -402,7 +411,7 @@ object AudioMixer: Disposable {
|
||||
requestFadeOut(ambientTrack, DEFAULT_FADEOUT_LEN * 4)
|
||||
}
|
||||
|
||||
fun requestFadeOut(track: TerrarumAudioMixerTrack, length: Double, target: Double = 0.0, source: Double? = null) {
|
||||
fun requestFadeOut(track: TerrarumAudioMixerTrack, length: Double, target: Double = 0.0, source: Double? = null, jobAfterFadeout: () -> Unit = {}) {
|
||||
val req = fadeReqs[track]!!
|
||||
if (!req.fadeoutFired) {
|
||||
req.fadeLength = length.coerceAtLeast(1.0/1024.0)
|
||||
@@ -410,10 +419,11 @@ object AudioMixer: Disposable {
|
||||
req.fadeoutFired = true
|
||||
req.fadeTarget = target * track.maxVolume
|
||||
req.fadeStart = source ?: fadeBus.volume
|
||||
req.callback = jobAfterFadeout
|
||||
}
|
||||
}
|
||||
|
||||
fun requestFadeIn(track: TerrarumAudioMixerTrack, length: Double, target: Double = 1.0, source: Double? = null) {
|
||||
fun requestFadeIn(track: TerrarumAudioMixerTrack, length: Double, target: Double = 1.0, source: Double? = null, jobAfterFadeout: () -> Unit = {}) {
|
||||
val req = fadeReqs[track]!!
|
||||
if (!req.fadeinFired) {
|
||||
req.fadeLength = length.coerceAtLeast(1.0/1024.0)
|
||||
@@ -421,6 +431,7 @@ object AudioMixer: Disposable {
|
||||
req.fadeinFired = true
|
||||
req.fadeTarget = target * track.maxVolume
|
||||
req.fadeStart = source ?: fadeBus.volume
|
||||
req.callback = jobAfterFadeout
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -259,13 +259,30 @@ class TerrarumMusicGovernor : MusicGovernor() {
|
||||
protected var ambState = 0
|
||||
protected var ambFired = false
|
||||
|
||||
private fun stopMusic(song: MusicContainer?) {
|
||||
musicState = STATE_INTERMISSION
|
||||
intermissionAkku = 0f
|
||||
intermissionLength = if (diskJockeyingMode == "intermittent") 30f + 30f * Math.random().toFloat() else 0f // 30s-60s
|
||||
musicFired = false
|
||||
if (musicStopHooks.isNotEmpty()) musicStopHooks.forEach { if (song != null) { it(song) } }
|
||||
printdbg(this, "StopMusic Intermission: $intermissionLength seconds")
|
||||
private fun stopMusic(song: MusicContainer?, callStopMusicHook: Boolean = true) {
|
||||
if (intermissionLength < Float.POSITIVE_INFINITY) {
|
||||
musicState = STATE_INTERMISSION
|
||||
intermissionAkku = 0f
|
||||
intermissionLength =
|
||||
if (diskJockeyingMode == "intermittent") 30f + 30f * Math.random().toFloat() else 0f // 30s-60s
|
||||
musicFired = false
|
||||
if (callStopMusicHook && musicStopHooks.isNotEmpty()) musicStopHooks.forEach {
|
||||
if (song != null) {
|
||||
it(song)
|
||||
}
|
||||
}
|
||||
printdbg(this, "StopMusic Intermission: $intermissionLength seconds")
|
||||
}
|
||||
}
|
||||
|
||||
fun stopMusic(callStopMusicHook: Boolean = true, pauseLen: Float = Float.POSITIVE_INFINITY) {
|
||||
stopMusic(AudioMixer.musicTrack.currentTrack, callStopMusicHook)
|
||||
intermissionLength = pauseLen
|
||||
printdbg(this, "StopMusic Intermission2: $intermissionLength seconds")
|
||||
}
|
||||
|
||||
fun startMusic() {
|
||||
startMusic(pullNextMusicTrack())
|
||||
}
|
||||
|
||||
private fun startMusic(song: MusicContainer) {
|
||||
@@ -274,16 +291,19 @@ class TerrarumMusicGovernor : MusicGovernor() {
|
||||
// INGAME.sendNotification("Now Playing $EMDASH ${song.name}")
|
||||
if (musicStartHooks.isNotEmpty()) musicStartHooks.forEach { it(song) }
|
||||
musicState = STATE_PLAYING
|
||||
intermissionLength = 42.42424f
|
||||
}
|
||||
|
||||
// MixerTrackProcessor will call this function externally to make gapless playback work
|
||||
fun pullNextMusicTrack(callNextMusicHook: Boolean = false): MusicContainer {
|
||||
// printStackTrace(this)
|
||||
|
||||
// prevent same song to play twice in row (for the most time)
|
||||
if (musicBin.isEmpty()) {
|
||||
restockMUsicBin()
|
||||
}
|
||||
return songs[musicBin.removeAt(0)].also { mus ->
|
||||
if (musicStartHooks.isNotEmpty()) musicStartHooks.forEach { it(mus) }
|
||||
if (callNextMusicHook && musicStartHooks.isNotEmpty()) musicStartHooks.forEach { it(mus) }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user