From fc92fe6f5522a78cc0d898770ccb8c58e471523e Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 16 Aug 2024 22:38:47 +0900 Subject: [PATCH] random sound audio bank --- src/net/torvald/terrarum/audio/AudioBank.kt | 8 +-- .../terrarum/audio/MixerTrackProcessor.kt | 36 ++++--------- .../audio/audiobank/MusicContainer.kt | 6 +-- .../terrarum/modulebasegame/WorldSimulator.kt | 2 +- .../audio/audiobank/AudioBankMusicBox.kt | 6 +-- .../audiobank/AudioBankTemplateRandomSound.kt | 53 +++++++++++++++++++ 6 files changed, 75 insertions(+), 36 deletions(-) create mode 100644 src/net/torvald/terrarum/modulebasegame/audio/audiobank/AudioBankTemplateRandomSound.kt diff --git a/src/net/torvald/terrarum/audio/AudioBank.kt b/src/net/torvald/terrarum/audio/AudioBank.kt index d998a660a..c6315fa23 100644 --- a/src/net/torvald/terrarum/audio/AudioBank.kt +++ b/src/net/torvald/terrarum/audio/AudioBank.kt @@ -19,9 +19,9 @@ abstract class AudioBank : Disposable { abstract val name: String - abstract val samplingRate: Float - abstract val channels: Int - abstract val totalSizeInSamples: Long + abstract var samplingRate: Float + abstract var channels: Int + abstract var totalSizeInSamples: Long abstract fun currentPositionInSamples(): Long open fun sendMessage(msg: String) {} @@ -30,5 +30,5 @@ abstract class AudioBank : Disposable { abstract fun readSamples(bufferL: FloatArray, bufferR: FloatArray): Int abstract fun reset() - abstract val songFinishedHook: (AudioBank) -> Unit + abstract var songFinishedHook: (AudioBank) -> Unit } \ No newline at end of file diff --git a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt index df8acd81c..1446ff7cd 100644 --- a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt +++ b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt @@ -382,33 +382,19 @@ class FeedSamplesToAdev(val bufferSize: Int, val rate: Int, val track: TerrarumA if (track.trackType != TrackType.MASTER) throw IllegalArgumentException("Track is not master") } - val sleepTime = (1000000000.0 * ((bufferSize / 4.0) / TerrarumAudioMixerTrack.SAMPLING_RATED)).toLong() - val sleepMS = sleepTime / 1000000 - val sleepNS = (sleepTime % 1000000).toInt() - - private fun printdbg(msg: Any) { - if (true) println("[AudioAdapter ${track.name}] $msg") - } - @Volatile private var exit = false override fun run() { - while (!exit) { - - val writeQueue = track.pcmQueue - val queueSize = writeQueue.size - if (queueSize > 0) { -// printdbg("PULL; Queue size: $queueSize") - val samples = writeQueue.removeFirst() - track.adev!!.writeSamples(samples) + while (!Thread.currentThread().isInterrupted) { + try { + val writeQueue = track.pcmQueue + val queueSize = writeQueue.size + if (queueSize > 0) { + val samples = writeQueue.removeFirst() + track.adev!!.writeSamples(samples) + } + } + catch (_: InterruptedException) { + Thread.currentThread().interrupt() } -// else { -// printdbg("QUEUE EMPTY QUEUE EMPTY QUEUE EMPTY ") -// } - -// Thread.sleep(sleepMS, sleepNS) } } - - fun stop() { - exit = true - } } diff --git a/src/net/torvald/terrarum/audio/audiobank/MusicContainer.kt b/src/net/torvald/terrarum/audio/audiobank/MusicContainer.kt index 60ed56eb5..c17a95f08 100644 --- a/src/net/torvald/terrarum/audio/audiobank/MusicContainer.kt +++ b/src/net/torvald/terrarum/audio/audiobank/MusicContainer.kt @@ -30,8 +30,8 @@ class MusicContainer( val samplingRateOverride: Float?, // this is FIXED sampling rate override var songFinishedHook: (AudioBank) -> Unit = {} ): AudioBank() { - override val samplingRate: Float - override val channels: Int + override var samplingRate: Float + override var channels: Int val codec: String // make Java code shorter @@ -58,7 +58,7 @@ class MusicContainer( var samplesReadCount = 0L; internal set - override val totalSizeInSamples: Long + override var totalSizeInSamples: Long private val totalSizeInBytes: Long private val gdxMusic: Music = Gdx.audio.newMusic(FileHandle(file)) diff --git a/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt b/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt index 02925782d..1f33b895d 100644 --- a/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt +++ b/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt @@ -120,7 +120,7 @@ object WorldSimulator { fun growOrKillGrass() { // season-dependent growth rate - // https://www.desmos.com/calculator/ivxyxuj0bm + // https://www.desmos.com/calculator/4u5npfxgak val baseCount = 2 * world.worldTime.timeDelta val season = world.worldTime.ecologicalSeason.coerceIn(0f, 5f) // 1->1.0, 2.5->3.0, 4->1.0 val seasonalMult = 1f + sech2((season - 2.5f)) * 2f diff --git a/src/net/torvald/terrarum/modulebasegame/audio/audiobank/AudioBankMusicBox.kt b/src/net/torvald/terrarum/modulebasegame/audio/audiobank/AudioBankMusicBox.kt index 534ab418e..2224de4d4 100644 --- a/src/net/torvald/terrarum/modulebasegame/audio/audiobank/AudioBankMusicBox.kt +++ b/src/net/torvald/terrarum/modulebasegame/audio/audiobank/AudioBankMusicBox.kt @@ -19,15 +19,15 @@ class AudioBankMusicBox(override var songFinishedHook: (AudioBank) -> Unit = {}) } override val name = "spieluhr" - override val samplingRate = 48000f // 122880 // use 122880 to make each tick is 2048 samples - override val channels = 1 + override var samplingRate = 48000f // 122880 // use 122880 to make each tick is 2048 samples + override var channels = 1 private val getSample = // usage: getSample(noteNum 0..60) InstrumentLoader.load("spieluhr", "basegame", "audio/effects/notes/spieluhr.ogg", 41) private val SAMPLES_PER_TICK = samplingRate / App.TICK_SPEED // should be 800 on default setting - override val totalSizeInSamples = getSample(0).first.size.toLong() // length of lowest-pitch note + override var totalSizeInSamples = getSample(0).first.size.toLong() // length of lowest-pitch note private val messageQueue = ArrayList() diff --git a/src/net/torvald/terrarum/modulebasegame/audio/audiobank/AudioBankTemplateRandomSound.kt b/src/net/torvald/terrarum/modulebasegame/audio/audiobank/AudioBankTemplateRandomSound.kt new file mode 100644 index 000000000..c9247255b --- /dev/null +++ b/src/net/torvald/terrarum/modulebasegame/audio/audiobank/AudioBankTemplateRandomSound.kt @@ -0,0 +1,53 @@ +package net.torvald.terrarum.modulebasegame.audio.audiobank + +import net.torvald.terrarum.audio.AudioBank +import net.torvald.terrarum.audio.AudioCodex +import net.torvald.terrarum.tryDispose + +/** + * Created by minjaesong on 2024-08-16. + */ +open class AudioBankTemplateRandomSound( + private val audioCodex: AudioCodex, + /** Name must be equal to the name in the AudioCodex identifier */ + override val name: String, + + override var songFinishedHook: (AudioBank) -> Unit +) : AudioBank() { + + override var samplingRate: Float = 48000f + override var channels: Int = 1 + override var totalSizeInSamples: Long = 1152L + + + private var currentSample = audioCodex.getRandomAudio(name)!!.makeCopy() + set(value) { + field = value + samplingRate = value.samplingRate + channels = value.channels + totalSizeInSamples = value.totalSizeInSamples + } + + private fun getNextRandomSample() { + currentSample = audioCodex.getRandomAudio(name)!! + } + + override fun makeCopy(): AudioBank { + return AudioBankTemplateRandomSound(audioCodex, name, songFinishedHook) + } + + override fun currentPositionInSamples() = currentSample.currentPositionInSamples() + + override fun readSamples(bufferL: FloatArray, bufferR: FloatArray): Int { + return currentSample.readSamples(bufferL, bufferR) + } + + override fun reset() { + currentSample.tryDispose() + getNextRandomSample() + } + + override fun dispose() { + currentSample.tryDispose() + } +} \ No newline at end of file