From 5973327ed624207b315d3436caea92f910ea5fb9 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Thu, 11 Jan 2024 15:19:14 +0900 Subject: [PATCH] optimising dynamic source processing by NOT multithreading it --- src/net/torvald/terrarum/audio/AudioMixer.kt | 38 ++++++++++--------- .../terrarum/audio/MixerTrackProcessor.kt | 1 - 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/net/torvald/terrarum/audio/AudioMixer.kt b/src/net/torvald/terrarum/audio/AudioMixer.kt index a326d5945..e232416f6 100644 --- a/src/net/torvald/terrarum/audio/AudioMixer.kt +++ b/src/net/torvald/terrarum/audio/AudioMixer.kt @@ -115,27 +115,33 @@ object AudioMixer: Disposable { } private val processingExecutor = ThreadExecutor() -// private lateinit var processingSubthreads: List val processingThread = Thread { - /*while (processing) { + // serial precessing + while (processing) { + actorNowPlaying = Terrarum.ingame?.actorNowPlaying + // process + dynamicTracks.forEach { + if (!it.processor.paused) { + try { it.processor.run() } + catch (e: Throwable) { e.printStackTrace() } + } + } tracks.forEach { if (!it.processor.paused) { - it.processor.run() + try { it.processor.run() } + catch (e: Throwable) { e.printStackTrace() } } } masterTrack.processor.run() - /*while (masterTrack.pcmQueue.size >= BACK_BUF_COUNT && masterTrack.processor.running && processing) { - Thread.sleep(1) - }*/ - - while (!masterTrack.pcmQueue.isEmpty) { + while (processing && !masterTrack.pcmQueue.isEmpty) { masterTrack.adev!!.writeSamples(masterTrack.pcmQueue.removeFirst()) // it blocks until the queue is consumed } - }*/ + } - while (processing) { + // parallel processing, it seems even on the 7950X this is less efficient than serial processing... + /*while (processing) { actorNowPlaying = Terrarum.ingame?.actorNowPlaying for (tracks in parallelProcessingSchedule) { @@ -161,13 +167,10 @@ object AudioMixer: Disposable { while (processing && !masterTrack.pcmQueue.isEmpty) { masterTrack.adev!!.writeSamples(masterTrack.pcmQueue.removeFirst()) // it blocks until the queue is consumed } - } + }*/ } - val parallelProcessingSchedule: Array> - -// val feeder = FeedSamplesToAdev(BUFFER_SIZE, SAMPLING_RATE, masterTrack) -// val feedingThread = Thread(feeder) +// val parallelProcessingSchedule: Array> init { @@ -216,12 +219,13 @@ object AudioMixer: Disposable { sfxSumBus.addSidechainInput(it, 1.0) } - parallelProcessingSchedule = + // unused for now + /*parallelProcessingSchedule = arrayOf(musicTrack, ambientTrack, guiTrack).sliceEvenly(THREAD_COUNT / 2).toTypedArray() + dynamicTracks.sliceEvenly(THREAD_COUNT / 2).toTypedArray() + arrayOf(sfxSumBus, sumBus, convolveBusOpen, convolveBusCave).sliceEvenly(THREAD_COUNT / 2).toTypedArray() + arrayOf(fadeBus) + - arrayOf(masterTrack) + arrayOf(masterTrack)*/ processingThread.priority = MAX_PRIORITY // higher = more predictable; audio delay is very noticeable so it gets high priority diff --git a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt index 6efadc77f..c822e4602 100644 --- a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt +++ b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt @@ -16,7 +16,6 @@ import kotlin.math.* class MixerTrackProcessor(val buffertaille: Int, val rate: Int, val track: TerrarumAudioMixerTrack): Runnable { companion object { - val BACK_BUF_COUNT = 1 } @Volatile var running = true; private set