footsteps using dynamic track wip

This commit is contained in:
minjaesong
2023-12-02 22:45:26 +09:00
parent 6da28b943a
commit 18f8fa881f
41 changed files with 225 additions and 17 deletions

View File

@@ -0,0 +1,34 @@
package net.torvald.terrarum.audio
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.audio.Music
import com.badlogic.gdx.files.FileHandle
import com.badlogic.gdx.utils.Disposable
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.modulebasegame.MusicContainer
import net.torvald.terrarum.tryDispose
typealias MaterialID = String
/**
* Created by minjaesong on 2023-12-02.
*/
class AudioCodex: Disposable {
@Transient val footsteps = HashMap<MaterialID, HashSet<MusicContainer>>()
internal constructor()
fun addToFootstepPool(materialID: MaterialID, music: FileHandle) {
if (footsteps[materialID] == null) footsteps[materialID] = HashSet()
footsteps[materialID]!!.add(
MusicContainer(music.nameWithoutExtension(), music.file(), Gdx.audio.newMusic(music)) {}
)
}
fun getRandomFootstep(materialID: MaterialID) = footsteps[materialID]?.random()
override fun dispose() {
footsteps.values.forEach { it.forEach { it.gdxMusic.tryDispose() } }
}
}

View File

@@ -101,18 +101,14 @@ object AudioMixer: Disposable {
* Return oldest dynamic track, even if the track is currently playing
*/
fun getFreeTrackNoMatterWhat(): TerrarumAudioMixerTrack {
return dynamicTracks.minBy { it.playStartedTime }
return getFreeTrack() ?: dynamicTracks.minBy { it.playStartedTime }
}
/**
* Return oldest dynamic track that is not playing
*/
fun getFreeTrack(): TerrarumAudioMixerTrack? {
val oldestTrack = dynamicTracks.minBy { it.playStartedTime }
return if (oldestTrack.isPlaying)
null
else
oldestTrack
return dynamicTracks.filter { it.trackingTarget == null && !it.isPlaying }.minByOrNull { it.playStartedTime }
}
private val processingExecutor = ThreadExecutor()

View File

@@ -2,6 +2,7 @@ package net.torvald.terrarum.audio
import com.badlogic.gdx.utils.Queue
import net.torvald.reflection.forceInvoke
import net.torvald.terrarum.App
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.audio.dsp.BinoPan
import net.torvald.terrarum.audio.dsp.NullFilter
@@ -41,7 +42,7 @@ class MixerTrackProcessor(val bufferSize: Int, val rate: Int, val track: Terraru
private val distFalloff = 2048.0
private fun printdbg(msg: Any) {
if (true) println("[AudioAdapter ${track.name}] $msg")
if (true) App.printdbg("AudioAdapter ${track.name}", msg)
}
override fun run() {
// while (running) { // uncomment to multithread
@@ -80,8 +81,8 @@ class MixerTrackProcessor(val bufferSize: Int, val rate: Int, val track: Terraru
track.volume = track.maxVolume
(track.filters[0] as BinoPan).pan = 0f
}
else {
val relativeXpos = relativeXposition(AudioMixer.actorNowPlaying!!, track.trackingTarget!!)
else if (track.trackingTarget is ActorWithBody) {
val relativeXpos = relativeXposition(AudioMixer.actorNowPlaying!!, track.trackingTarget as ActorWithBody)
track.volume = track.maxVolume * (1.0 - relativeXpos.absoluteValue.pow(0.5) / distFalloff)
(track.filters[0] as BinoPan).pan = ((2*asin(relativeXpos / distFalloff)) / Math.PI).toFloat()
}
@@ -91,6 +92,10 @@ class MixerTrackProcessor(val bufferSize: Int, val rate: Int, val track: Terraru
// fetch deviceBufferSize amount of sample from the disk
if (track.trackType != TrackType.MASTER && track.trackType != TrackType.BUS && track.streamPlaying) {
if (track.trackType == TrackType.DYNAMIC_SOURCE) {
printdbg("${track.name} streaming")
}
streamBuf.fetchBytes {
val bytesRead = track.currentTrack?.gdxMusic?.forceInvoke<Int>("read", arrayOf(it))
if (bytesRead == null || bytesRead <= 0) { // some class (namely Mp3) may return 0 instead of negative value

View File

@@ -9,6 +9,7 @@ import net.torvald.reflection.forceInvoke
import net.torvald.terrarum.App
import net.torvald.terrarum.audio.dsp.NullFilter
import net.torvald.terrarum.audio.dsp.TerrarumAudioFilter
import net.torvald.terrarum.gameactors.Actor
import net.torvald.terrarum.gameactors.ActorWithBody
import net.torvald.terrarum.getHashStr
import net.torvald.terrarum.hashStrMap
@@ -22,7 +23,7 @@ enum class TrackType {
STATIC_SOURCE, DYNAMIC_SOURCE, BUS, MASTER
}
class TerrarumAudioMixerTrack(val name: String, val trackType: TrackType, private val maxVolumeFun: () -> Double = {1.0}): Disposable {
class TerrarumAudioMixerTrack(val name: String, val trackType: TrackType, var maxVolumeFun: () -> Double = {1.0}): Disposable {
companion object {
const val SAMPLING_RATE = 48000
@@ -57,7 +58,7 @@ class TerrarumAudioMixerTrack(val name: String, val trackType: TrackType, privat
val filters: Array<TerrarumAudioFilter> = Array(4) { NullFilter }
var trackingTarget: ActorWithBody? = null
var trackingTarget: Actor? = null
var playStartedTime = 0L; private set
@@ -140,9 +141,16 @@ class TerrarumAudioMixerTrack(val name: String, val trackType: TrackType, privat
fun stop() {
currentTrack?.gdxMusic?.forceInvoke<Int>("reset", arrayOf())
streamPlaying = false
playStartedTime = 0L
// playStartedTime = 0L
if (trackingTarget != null && currentTrack != null) {
trackingTarget!!.onAudioInterrupt(currentTrack!!)
}
fireSongFinishHook()
// fireSoundFinishHook()
trackingTarget = null
}
fun fireSongFinishHook() {