mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 12:21:52 +09:00
music disc jockeying wip
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
28
src/net/torvald/terrarum/AudioManagerRunnable.kt
Normal file
28
src/net/torvald/terrarum/AudioManagerRunnable.kt
Normal file
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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() {
|
||||
|
||||
}
|
||||
|
||||
@@ -36,34 +36,37 @@ class TerrarumMusicGovernor : MusicGovernor() {
|
||||
|
||||
private var musicBin: ArrayList<Int> = 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() }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user