From d2b19e97e8f9efb368cc846692b4288db0e1dcc9 Mon Sep 17 00:00:00 2001 From: Stefano D'Angelo Date: Thu, 8 Feb 2024 07:54:27 +0100 Subject: [PATCH] fixed daisy seed buffer handling, hopefully --- templates/daisy-seed/src/data.h | 25 ++++++++++ templates/daisy-seed/src/main.cpp | 76 ++++++++++++++++++++++++++++--- 2 files changed, 94 insertions(+), 7 deletions(-) diff --git a/templates/daisy-seed/src/data.h b/templates/daisy-seed/src/data.h index d4221d2..77d78be 100644 --- a/templates/daisy-seed/src/data.h +++ b/templates/daisy-seed/src/data.h @@ -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}} diff --git a/templates/daisy-seed/src/main.cpp b/templates/daisy-seed/src/main.cpp index 02fd54a..5f5effb 100644 --- a/templates/daisy-seed/src/main.cpp +++ b/templates/daisy-seed/src/main.cpp @@ -1,5 +1,6 @@ #include #include +#include #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) {