fixed daisy seed buffer handling, hopefully

This commit is contained in:
Stefano D'Angelo 2024-02-08 07:54:27 +01:00
parent 173fa632b4
commit d2b19e97e8
2 changed files with 94 additions and 7 deletions

View File

@ -1,11 +1,36 @@
#define NUM_AUDIO_BUSES_IN {{=it.product.buses.filter(x => x.type == "audio" && x.direction == "input").length}}
#define NUM_AUDIO_BUSES_OUT {{=it.product.buses.filter(x => x.type == "audio" && x.direction == "output").length}}
#define AUDIO_BUS_IN {{=it.product.buses.findIndex(x => x.type == "audio" && x.direction == "input" && !x.cv && !x.sidechain)}}
#define AUDIO_BUS_OUT {{=it.product.buses.findIndex(x => x.type == "audio" && x.direction == "output" && !x.cv && !x.sidechain)}}
#define NUM_CHANNELS_IN {{=it.product.buses.filter(x => x.type == "audio" && x.direction == "input" && !x.cv && !x.sidechain) ? (it.product.buses.filter(x => x.type == "audio" && x.direction == "input" && !x.cv && !x.sidechain)[0].channels == "mono" ? 1 : 2) : 0}}
#define NUM_CHANNELS_OUT {{=it.product.buses.filter(x => x.type == "audio" && x.direction == "output" && !x.cv && !x.sidechain) ? (it.product.buses.filter(x => x.type == "audio" && x.direction == "output" && !x.cv && !x.sidechain)[0].channels == "mono" ? 1 : 2) : 0}}
#define NUM_NON_OPT_CHANNELS_IN {{=it.product.buses.filter(x => x.type == "audio" && x.direction == "input" && !x.optional).reduce((a, x) => a + (x.channels == "mono" ? 1 : 2), 0)}}
#define NUM_NON_OPT_CHANNELS_OUT {{=it.product.buses.filter(x => x.type == "audio" && x.direction == "output" && !x.optional).reduce((a, x) => a + (x.channels == "mono" ? 1 : 2), 0)}}
#define NUM_ALL_CHANNELS_IN {{=it.product.buses.filter(x => x.type == "audio" && x.direction == "input").reduce((a, x) => a + (x.channels == "mono" ? 1 : 2), 0)}}
#define NUM_ALL_CHANNELS_OUT {{=it.product.buses.filter(x => x.type == "audio" && x.direction == "output").reduce((a, x) => a + (x.channels == "mono" ? 1 : 2), 0)}}
#define MIDI_BUS_IN {{=it.product.buses.findIndex(x => x.type == "midi" && x.direction == "input")}}
#if NUM_AUDIO_BUSES_IN + NUM_AUDIO_BUSES_OUT > 0
static struct {
char out;
char optional;
char channels;
} audio_bus_data[NUM_AUDIO_BUSES_IN + NUM_AUDIO_BUSES_OUT] = {
{{~it.product.buses :b:i}}
{{?b.type == "audio"}}
{
/* .out = */ {{=b.direction == "output" ? 1 : 0}},
/* .optional = */ {{=b.optional ? 1 : 0}},
/* .channels = */ {{=b.channels == "mono" ? 1 : 2}}
},
{{?}}
{{~}}
};
#endif
#define NUM_PARAMETERS {{=it.product.parameters.length}}
#define NUM_ADC {{=it.product.parameters.filter((x, i) => x.direction == "input" && it.daisy_seed.parameterPins[i] >= 0).length}}

View File

@ -1,5 +1,6 @@
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "data.h"
#include "plugin.h"
@ -22,8 +23,29 @@ CpuLoadMeter loadMeter;
plugin instance;
float buf[2][BLOCK_SIZE];
float *bufs[2] = { buf[0], buf[1] };
#if NUM_NON_OPT_CHANNELS_IN > NUM_CHANNELS_IN
float zero[BLOCK_SIZE];
#endif
#if NUM_CHANNELS_IN > 0
float x_buf[NUM_CHANNELS_IN * BLOCK_SIZE];
float * x_in[NUM_CHANNELS_IN];
#endif
#if NUM_ALL_CHANNELS_IN > 0
const float * x[NUM_ALL_CHANNELS_IN];
#else
const float ** x;
#endif
#if NUM_CHANNELS_IN > 0
float * y_out[NUM_CHANNELS_OUT];
#endif
#if NUM_NON_OPT_CHANNELS_OUT > 0
float y_buf[NUM_NON_OPT_CHANNELS_OUT * BLOCK_SIZE];
#endif
#if NUM_ALL_CHANNELS_OUT > 0
float * y[NUM_ALL_CHANNELS_IN];
#else
float ** y;
#endif
#if NUM_ADC >= 0
static float clampf(float x, float m, float M) {
@ -74,24 +96,24 @@ static void AudioCallback(
#if NUM_CHANNELS_IN > 0
for (size_t i = 0; i < n; i++) {
const size_t j = i << 1;
buf[0][i] = in[j];
x_in[0][i] = in[j];
# if NUM_CHANNELS_IN > 1
buf[1][i] = in[j + 1];
x_in[1][i] = in[j + 1];
# endif
}
#endif
plugin_process(&instance, (const float **)bufs, bufs, n);
plugin_process(&instance, x, y, n);
for (size_t i = 0; i < n; i++) {
const size_t j = i << 1;
#if NUM_CHANNELS_OUT > 0
out[j] = buf[0][i];
out[j] = y_out[0][i];
#else
out[j] = 0.f;
#endif
#if NUM_CHANNELS_OUT > 1
out[j + 1] = buf[1][i];
out[j + 1] = y_out[1][i];
#else
out[j + 1] = 0.f;
#endif
@ -146,6 +168,46 @@ int main() {
#endif
plugin_reset(&instance);
#if NUM_ALL_CHANNELS_IN > 0
for (size_t i = 0, j = 0, k = 0; i < NUM_ALL_CHANNELS_IN + NUM_ALL_CHANNELS_OUT; i++) {
if (audio_bus_data[i].out)
continue;
for (int l = 0; l < audio_bus_data[i].channels; l++) {
if (audio_bus_data[i].optional)
x[j] = NULL;
else {
float * b = x_buf + BLOCK_SIZE * k;
x[j] = b;
if (AUDIO_BUS_IN == i)
x_in[l] = b;
k++;
}
j++;
}
}
#else
x = NULL;
#endif
#if NUM_ALL_CHANNELS_OUT > 0
for (size_t i = 0, j = 0; i < NUM_ALL_CHANNELS_IN + NUM_ALL_CHANNELS_OUT; i++) {
if (!audio_bus_data[i].out)
continue;
for (int k = 0; k < audio_bus_data[i].channels; k++) {
y[j] = y_buf + BLOCK_SIZE * j;
if (AUDIO_BUS_OUT == i)
y_out[k] = y[j];
j++;
}
}
#else
y = NULL;
#endif
#if NUM_NON_OPT_CHANNELS_IN > NUM_CHANNELS_IN
memset(zero, 0, BLOCK_SIZE * sizeof(float));
#endif
hardware.StartAudio(AudioCallback);
while (1) {