music disc jockeying wip

This commit is contained in:
minjaesong
2023-11-08 16:59:22 +09:00
parent 31b328fb48
commit beb7f1fb73
5 changed files with 146 additions and 58 deletions

View File

@@ -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();

View File

@@ -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
}
}
}

View 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
}
}
}
}

View File

@@ -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() {
}

View File

@@ -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() }
}
}