From b67c0837d8a79770d13d16d937e6fa50cd7fd1bc Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 24 Jan 2024 19:10:04 +0900 Subject: [PATCH] fix: track fader was applied at PRE instead of POST --- src/net/torvald/terrarum/audio/AudioProcessBuf.kt | 8 +++++--- .../torvald/terrarum/audio/MixerTrackProcessor.kt | 14 +++++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/net/torvald/terrarum/audio/AudioProcessBuf.kt b/src/net/torvald/terrarum/audio/AudioProcessBuf.kt index b4daf6d8d..eb053d708 100644 --- a/src/net/torvald/terrarum/audio/AudioProcessBuf.kt +++ b/src/net/torvald/terrarum/audio/AudioProcessBuf.kt @@ -188,10 +188,12 @@ class AudioProcessBuf(val inputSamplingRate: Int, val audioReadFun: (ByteArray) // printdbg(this, "phase = $fPhaseL") } - fun getLR(volume: Double): Pair { + fun getLR(): Pair { // copy into the out - val outL = FloatArray(App.audioBufferSize) { (foutL[it] * volume).toFloat() } - val outR = FloatArray(App.audioBufferSize) { (foutR[it] * volume).toFloat() } + val outL = FloatArray(App.audioBufferSize) + val outR = FloatArray(App.audioBufferSize) + System.arraycopy(foutL, 0, outL, 0, App.audioBufferSize) + System.arraycopy(foutR, 0, outR, 0, App.audioBufferSize) // shift bytes in the fout System.arraycopy(foutL, App.audioBufferSize, foutL, 0, validSamplesInBuf - App.audioBufferSize) System.arraycopy(foutR, App.audioBufferSize, foutR, 0, validSamplesInBuf - App.audioBufferSize) diff --git a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt index c81ca35d8..a9185f715 100644 --- a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt +++ b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt @@ -184,8 +184,8 @@ class MixerTrackProcessor(bufferSize: Int, val rate: Int, val track: TerrarumAud // add all up sidechains.forEach { (side, mix) -> for (i in samplesL1.indices) { - samplesL1[i] += side.processor.fout1[0][i] * (mix * track.volume).toFloat() - samplesR1[i] += side.processor.fout1[1][i] * (mix * track.volume).toFloat() + samplesL1[i] += side.processor.fout1[0][i] * mix.toFloat() + samplesR1[i] += side.processor.fout1[1][i] * mix.toFloat() } } } @@ -198,7 +198,7 @@ class MixerTrackProcessor(bufferSize: Int, val rate: Int, val track: TerrarumAud bufEmpty = true } else { - streamBuf!!.getLR(track.volume).let { + streamBuf!!.getLR().let { samplesL1 = it.first samplesR1 = it.second } @@ -225,6 +225,14 @@ class MixerTrackProcessor(bufferSize: Int, val rate: Int, val track: TerrarumAud } + // apply fader at post + fout1.forEach { ch -> + ch.forEachIndexed { index, sample -> + ch[index] = (sample * track.volume).toFloat() + } + } + + // scan the finished sample for mapping signal level and clipping detection fout1.map { it.maxOf { it.absoluteValue } }.forEachIndexed { index, fl -> maxSigLevel[index] = fl.toDouble()