From a09397dbd6ca1e9bffe27d29fd2ad707c1d9506f Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 17 Nov 2023 20:52:25 +0900 Subject: [PATCH] audioengine: filter stack processing --- src/net/torvald/terrarum/audio/AudioMixer.kt | 1 + .../terrarum/audio/MixerTrackProcessor.kt | 38 +++++++++---------- .../terrarum/audio/TerrarumAudioMixerTrack.kt | 2 +- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/net/torvald/terrarum/audio/AudioMixer.kt b/src/net/torvald/terrarum/audio/AudioMixer.kt index 1c28050a6..5ed1e04bc 100644 --- a/src/net/torvald/terrarum/audio/AudioMixer.kt +++ b/src/net/torvald/terrarum/audio/AudioMixer.kt @@ -32,6 +32,7 @@ object AudioMixer: Disposable { private val masterTrack = TerrarumAudioMixerTrack("Master", true).also { master -> tracks.forEach { master.addSidechainInput(it, 1.0) } +// master.filters[0] = Lowpass(240, TerrarumAudioMixerTrack.SAMPLING_RATE) } private val musicTrack: TerrarumAudioMixerTrack diff --git a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt index c1490ee6f..97acb5510 100644 --- a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt +++ b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt @@ -19,13 +19,6 @@ class MixerTrackProcessor(val bufferSize: Int, val track: TerrarumAudioMixerTrac internal val streamBuf = AudioProcessBuf(bufferSize) internal val sideChainBufs = Array(track.sidechainInputs.size) { AudioProcessBuf(bufferSize) } -// internal val outBufL0 = FloatArray(bufferSize / 4) -// internal val outBufR0 = FloatArray(bufferSize / 4) -// internal val outBufL1 = FloatArray(bufferSize / 4) -// internal val outBufR1 = FloatArray(bufferSize / 4) - - - private val testFilter = Lowpass(240, SAMPLING_RATE) private var fout0 = listOf(FloatArray(bufferSize / 4), FloatArray(bufferSize / 4)) private var fout1 = listOf(FloatArray(bufferSize / 4), FloatArray(bufferSize / 4)) @@ -97,21 +90,28 @@ class MixerTrackProcessor(val bufferSize: Int, val track: TerrarumAudioMixerTrac // run the input through the stack of filters - val filterStack = track.filters.filter { !it.bypass } + val filterStack = track.filters.filter { !it.bypass && it !is NullFilter } - val fin0 = listOf(samplesL0, samplesR0) - val fin1 = listOf(samplesL1, samplesR1) - fout0 = fout1 - fout1 = listOf(FloatArray(bufferSize / 4), FloatArray(bufferSize / 4)) - val filter = if (track.isMaster) testFilter else NullFilter - filter(fin0, fin1, fout0, fout1) + if (filterStack.isEmpty()) { + fout1 = listOf(samplesL1, samplesR1) + } + else { + var fin0 = listOf(samplesL0, samplesR0) + var fin1 = listOf(samplesL1, samplesR1) + fout0 = fout1 + fout1 = listOf(FloatArray(bufferSize / 4), FloatArray(bufferSize / 4)) + filterStack.forEachIndexed { index, it -> + it(fin0, fin1, fout0, fout1) + fin0 = fout0 + fin1 = fout1 + if (index < filterStack.lastIndex) { + fout0 = listOf(FloatArray(bufferSize / 4), FloatArray(bufferSize / 4)) + fout1 = listOf(FloatArray(bufferSize / 4), FloatArray(bufferSize / 4)) + } + } + } - // final writeout -// System.arraycopy(samplesL0, 0, outBufL0, 0, outBufL0.size) -// System.arraycopy(samplesR0, 0, outBufR0, 0, outBufR0.size) -// System.arraycopy(samplesL1, 0, outBufL1, 0, outBufL1.size) -// System.arraycopy(samplesR1, 0, outBufR1, 0, outBufR1.size) // by this time, the output buffer is filled with processed results, pause the execution if (!track.isMaster) { diff --git a/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt b/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt index 6e701bbdb..8eeb89f0b 100644 --- a/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt +++ b/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt @@ -35,7 +35,7 @@ class TerrarumAudioMixerTrack(val name: String, val isMaster: Boolean = false): get() = fullscaleToDecibels(volume) set(value) { volume = decibelsToFullscale(value) } - val filters = Array(4) { NullFilter } + val filters: Array = Array(4) { NullFilter } internal val sidechainInputs = Array?>(16) { null } internal fun getSidechains(): List = sidechainInputs.map { it?.first }