audioengine: filter stack processing

This commit is contained in:
minjaesong
2023-11-17 20:52:25 +09:00
parent 452e20488c
commit a09397dbd6
3 changed files with 21 additions and 20 deletions

View File

@@ -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

View File

@@ -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) {

View File

@@ -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<TerrarumAudioFilter> = Array(4) { NullFilter }
internal val sidechainInputs = Array<Pair<TerrarumAudioMixerTrack, TrackVolume>?>(16) { null }
internal fun getSidechains(): List<TerrarumAudioMixerTrack?> = sidechainInputs.map { it?.first }