Skip to content
Snippets Groups Projects
Commit 4b7f18c9 authored by moon2's avatar moon2 :speech_balloon: Committed by dx
Browse files

bl00mbox: restore original c formatting

parent 95d0b9a2
No related branches found
No related tags found
No related merge requests found
...@@ -20,41 +20,28 @@ radspa_descriptor_t trad_osc_desc = { ...@@ -20,41 +20,28 @@ radspa_descriptor_t trad_osc_desc = {
#define TRAD_OSC_LIN_FM 3 #define TRAD_OSC_LIN_FM 3
radspa_t * trad_osc_create(uint32_t init_var){ radspa_t * trad_osc_create(uint32_t init_var){
radspa_t* trad_osc = radspa_standard_plugin_create( radspa_t * trad_osc = radspa_standard_plugin_create(&trad_osc_desc, TRAD_OSC_NUM_SIGNALS, sizeof(trad_osc_data_t), 0);
&trad_osc_desc, TRAD_OSC_NUM_SIGNALS, sizeof(trad_osc_data_t), 0);
trad_osc->render = trad_osc_run; trad_osc->render = trad_osc_run;
radspa_signal_set(trad_osc, TRAD_OSC_OUTPUT, "output", radspa_signal_set(trad_osc, TRAD_OSC_OUTPUT, "output", RADSPA_SIGNAL_HINT_OUTPUT, 0);
RADSPA_SIGNAL_HINT_OUTPUT, 0); radspa_signal_set(trad_osc, TRAD_OSC_PITCH, "pitch", RADSPA_SIGNAL_HINT_INPUT | RADSPA_SIGNAL_HINT_SCT, 18367);
radspa_signal_set(trad_osc, TRAD_OSC_PITCH, "pitch", radspa_signal_set(trad_osc, TRAD_OSC_WAVEFORM, "waveform", RADSPA_SIGNAL_HINT_INPUT, -16000);
RADSPA_SIGNAL_HINT_INPUT | RADSPA_SIGNAL_HINT_SCT, 18367); radspa_signal_set(trad_osc, TRAD_OSC_LIN_FM, "lin_fm", RADSPA_SIGNAL_HINT_INPUT, 0);
radspa_signal_set(trad_osc, TRAD_OSC_WAVEFORM, "waveform",
RADSPA_SIGNAL_HINT_INPUT, -16000);
radspa_signal_set(trad_osc, TRAD_OSC_LIN_FM, "lin_fm",
RADSPA_SIGNAL_HINT_INPUT, 0);
return trad_osc; return trad_osc;
} }
void trad_osc_run(radspa_t* trad_osc, uint16_t num_samples, void trad_osc_run(radspa_t * trad_osc, uint16_t num_samples, uint32_t render_pass_id){
uint32_t render_pass_id) {
trad_osc_data_t * plugin_data = trad_osc->plugin_data; trad_osc_data_t * plugin_data = trad_osc->plugin_data;
radspa_signal_t* output_sig = radspa_signal_t * output_sig = radspa_signal_get_by_index(trad_osc, TRAD_OSC_OUTPUT);
radspa_signal_get_by_index(trad_osc, TRAD_OSC_OUTPUT); radspa_signal_t * pitch_sig = radspa_signal_get_by_index(trad_osc, TRAD_OSC_PITCH);
radspa_signal_t* pitch_sig = radspa_signal_t * waveform_sig = radspa_signal_get_by_index(trad_osc, TRAD_OSC_WAVEFORM);
radspa_signal_get_by_index(trad_osc, TRAD_OSC_PITCH); radspa_signal_t * lin_fm_sig = radspa_signal_get_by_index(trad_osc, TRAD_OSC_LIN_FM);
radspa_signal_t* waveform_sig =
radspa_signal_get_by_index(trad_osc, TRAD_OSC_WAVEFORM);
radspa_signal_t* lin_fm_sig =
radspa_signal_get_by_index(trad_osc, TRAD_OSC_LIN_FM);
if(output_sig->buffer == NULL) return; if(output_sig->buffer == NULL) return;
int16_t ret = 0; int16_t ret = 0;
for(uint16_t i = 0; i < num_samples; i++){ for(uint16_t i = 0; i < num_samples; i++){
int16_t pitch = int16_t pitch = pitch_sig->get_value(pitch_sig, i, num_samples, render_pass_id);
pitch_sig->get_value(pitch_sig, i, num_samples, render_pass_id); int16_t wave = waveform_sig->get_value(waveform_sig, i, num_samples, render_pass_id);
int16_t wave = waveform_sig->get_value(waveform_sig, i, num_samples, int32_t lin_fm = lin_fm_sig->get_value(lin_fm_sig, i, num_samples, render_pass_id);
render_pass_id);
int32_t lin_fm =
lin_fm_sig->get_value(lin_fm_sig, i, num_samples, render_pass_id);
if(pitch != plugin_data->prev_pitch){ if(pitch != plugin_data->prev_pitch){
plugin_data->incr = radspa_sct_to_rel_freq(pitch, 0); plugin_data->incr = radspa_sct_to_rel_freq(pitch, 0);
...@@ -116,12 +103,13 @@ inline int16_t waveshaper(int16_t saw, int16_t shape) { ...@@ -116,12 +103,13 @@ inline int16_t waveshaper(int16_t saw, int16_t shape) {
} }
// plugin: trad_env // plugin: trad_env
radspa_descriptor_t trad_env_desc = { .name = "env_adsr", radspa_descriptor_t trad_env_desc = {
.name = "env_adsr",
.id = 42, .id = 42,
.description = "simple ADSR envelope", .description = "simple ADSR envelope",
.create_plugin_instance = trad_env_create, .create_plugin_instance = trad_env_create,
.destroy_plugin_instance = .destroy_plugin_instance = radspa_standard_plugin_destroy
radspa_standard_plugin_destroy }; };
#define TRAD_ENV_NUM_SIGNALS 9 #define TRAD_ENV_NUM_SIGNALS 9
#define TRAD_ENV_OUTPUT 0 #define TRAD_ENV_OUTPUT 0
...@@ -141,27 +129,17 @@ radspa_descriptor_t trad_env_desc = { .name = "env_adsr", ...@@ -141,27 +129,17 @@ radspa_descriptor_t trad_env_desc = { .name = "env_adsr",
#define TRAD_ENV_PHASE_RELEASE 4 #define TRAD_ENV_PHASE_RELEASE 4
radspa_t * trad_env_create(uint32_t init_var){ radspa_t * trad_env_create(uint32_t init_var){
radspa_t* trad_env = radspa_standard_plugin_create( radspa_t * trad_env = radspa_standard_plugin_create(&trad_env_desc, TRAD_ENV_NUM_SIGNALS, sizeof(trad_env_data_t),0);
&trad_env_desc, TRAD_ENV_NUM_SIGNALS, sizeof(trad_env_data_t), 0);
trad_env->render = trad_env_run; trad_env->render = trad_env_run;
radspa_signal_set(trad_env, TRAD_ENV_OUTPUT, "output", radspa_signal_set(trad_env, TRAD_ENV_OUTPUT, "output", RADSPA_SIGNAL_HINT_OUTPUT, 0);
RADSPA_SIGNAL_HINT_OUTPUT, 0); radspa_signal_set(trad_env, TRAD_ENV_PHASE, "phase", RADSPA_SIGNAL_HINT_OUTPUT, 0);
radspa_signal_set(trad_env, TRAD_ENV_PHASE, "phase", radspa_signal_set(trad_env, TRAD_ENV_INPUT, "input", RADSPA_SIGNAL_HINT_INPUT, 32767);
RADSPA_SIGNAL_HINT_OUTPUT, 0); radspa_signal_set(trad_env, TRAD_ENV_TRIGGER, "trigger", RADSPA_SIGNAL_HINT_INPUT | RADSPA_SIGNAL_HINT_TRIGGER, 0);
radspa_signal_set(trad_env, TRAD_ENV_INPUT, "input", radspa_signal_set(trad_env, TRAD_ENV_ATTACK, "attack", RADSPA_SIGNAL_HINT_INPUT, 100);
RADSPA_SIGNAL_HINT_INPUT, 32767); radspa_signal_set(trad_env, TRAD_ENV_DECAY, "decay", RADSPA_SIGNAL_HINT_INPUT, 250);
radspa_signal_set(trad_env, TRAD_ENV_TRIGGER, "trigger", radspa_signal_set(trad_env, TRAD_ENV_SUSTAIN, "sustain", RADSPA_SIGNAL_HINT_INPUT, 16000);
RADSPA_SIGNAL_HINT_INPUT | RADSPA_SIGNAL_HINT_TRIGGER, 0); radspa_signal_set(trad_env, TRAD_ENV_RELEASE, "release", RADSPA_SIGNAL_HINT_INPUT, 50);
radspa_signal_set(trad_env, TRAD_ENV_ATTACK, "attack", radspa_signal_set(trad_env, TRAD_ENV_GATE, "gate", RADSPA_SIGNAL_HINT_INPUT,0);
RADSPA_SIGNAL_HINT_INPUT, 100);
radspa_signal_set(trad_env, TRAD_ENV_DECAY, "decay",
RADSPA_SIGNAL_HINT_INPUT, 250);
radspa_signal_set(trad_env, TRAD_ENV_SUSTAIN, "sustain",
RADSPA_SIGNAL_HINT_INPUT, 16000);
radspa_signal_set(trad_env, TRAD_ENV_RELEASE, "release",
RADSPA_SIGNAL_HINT_INPUT, 50);
radspa_signal_set(trad_env, TRAD_ENV_GATE, "gate", RADSPA_SIGNAL_HINT_INPUT,
0);
radspa_signal_get_by_index(trad_env, TRAD_ENV_ATTACK)->unit = "ms"; radspa_signal_get_by_index(trad_env, TRAD_ENV_ATTACK)->unit = "ms";
radspa_signal_get_by_index(trad_env, TRAD_ENV_DECAY)->unit = "ms"; radspa_signal_get_by_index(trad_env, TRAD_ENV_DECAY)->unit = "ms";
radspa_signal_get_by_index(trad_env, TRAD_ENV_SUSTAIN)->unit = "ms"; radspa_signal_get_by_index(trad_env, TRAD_ENV_SUSTAIN)->unit = "ms";
...@@ -177,8 +155,7 @@ static int16_t trad_env_run_single(trad_env_data_t* env) { ...@@ -177,8 +155,7 @@ static int16_t trad_env_run_single(trad_env_data_t* env) {
uint32_t tmp; uint32_t tmp;
switch(env->env_phase){ switch(env->env_phase){
case TRAD_ENV_PHASE_OFF: case TRAD_ENV_PHASE_OFF:
env->env_counter = 0; env->env_counter = 0;;
;
break; break;
case TRAD_ENV_PHASE_ATTACK: case TRAD_ENV_PHASE_ATTACK:
tmp = env->env_counter + env->attack; tmp = env->env_counter + env->attack;
...@@ -228,8 +205,8 @@ static int16_t trad_env_run_single(trad_env_data_t* env) { ...@@ -228,8 +205,8 @@ static int16_t trad_env_run_single(trad_env_data_t* env) {
#define SAMPLE_RATE_SORRY 48000 #define SAMPLE_RATE_SORRY 48000
#define TRAD_ENV_UNDERSAMPLING 5 #define TRAD_ENV_UNDERSAMPLING 5
static inline uint32_t trad_env_time_ms_to_val_rise(uint16_t time_ms,
uint32_t val) { static inline uint32_t trad_env_time_ms_to_val_rise(uint16_t time_ms, uint32_t val){
if(!time_ms) return UINT32_MAX; if(!time_ms) return UINT32_MAX;
uint32_t div = time_ms * ((SAMPLE_RATE_SORRY)/1000); uint32_t div = time_ms * ((SAMPLE_RATE_SORRY)/1000);
return val/div; return val/div;
...@@ -241,18 +218,14 @@ static inline uint32_t uint32_sat_leftshift(uint32_t input, uint16_t left) { ...@@ -241,18 +218,14 @@ static inline uint32_t uint32_sat_leftshift(uint32_t input, uint16_t left) {
return input << left; return input << left;
} }
void trad_env_run(radspa_t* trad_env, uint16_t num_samples,
uint32_t render_pass_id) { void trad_env_run(radspa_t * trad_env, uint16_t num_samples, uint32_t render_pass_id){
trad_env_data_t * plugin_data = trad_env->plugin_data; trad_env_data_t * plugin_data = trad_env->plugin_data;
radspa_signal_t* output_sig = radspa_signal_t * output_sig = radspa_signal_get_by_index(trad_env, TRAD_ENV_OUTPUT);
radspa_signal_get_by_index(trad_env, TRAD_ENV_OUTPUT); radspa_signal_t * phase_sig = radspa_signal_get_by_index(trad_env, TRAD_ENV_PHASE);
radspa_signal_t* phase_sig =
radspa_signal_get_by_index(trad_env, TRAD_ENV_PHASE);
if((output_sig->buffer == NULL) && (phase_sig->buffer == NULL)) return; if((output_sig->buffer == NULL) && (phase_sig->buffer == NULL)) return;
radspa_signal_t* trigger_sig = radspa_signal_t * trigger_sig = radspa_signal_get_by_index(trad_env, TRAD_ENV_TRIGGER);
radspa_signal_get_by_index(trad_env, TRAD_ENV_TRIGGER); radspa_signal_t * input_sig = radspa_signal_get_by_index(trad_env, TRAD_ENV_INPUT);
radspa_signal_t* input_sig =
radspa_signal_get_by_index(trad_env, TRAD_ENV_INPUT);
radspa_signal_t * attack_sig = NULL; radspa_signal_t * attack_sig = NULL;
radspa_signal_t * decay_sig = NULL; radspa_signal_t * decay_sig = NULL;
radspa_signal_t * sustain_sig = NULL; radspa_signal_t * sustain_sig = NULL;
...@@ -264,8 +237,7 @@ void trad_env_run(radspa_t* trad_env, uint16_t num_samples, ...@@ -264,8 +237,7 @@ void trad_env_run(radspa_t* trad_env, uint16_t num_samples,
for(uint16_t i = 0; i < num_samples; i++){ for(uint16_t i = 0; i < num_samples; i++){
static int16_t env = 0; static int16_t env = 0;
int16_t trigger = int16_t trigger = trigger_sig->get_value(trigger_sig, i, num_samples, render_pass_id);
trigger_sig->get_value(trigger_sig, i, num_samples, render_pass_id);
int16_t vel = radspa_trigger_get(trigger, &(plugin_data->trigger_prev)); int16_t vel = radspa_trigger_get(trigger, &(plugin_data->trigger_prev));
if(vel < 0){ // stop if(vel < 0){ // stop
...@@ -286,78 +258,56 @@ void trad_env_run(radspa_t* trad_env, uint16_t num_samples, ...@@ -286,78 +258,56 @@ void trad_env_run(radspa_t* trad_env, uint16_t num_samples,
break; break;
case TRAD_ENV_PHASE_ATTACK: case TRAD_ENV_PHASE_ATTACK:
if(attack_sig == NULL){ if(attack_sig == NULL){
attack_sig = radspa_signal_get_by_index( attack_sig = radspa_signal_get_by_index(trad_env, TRAD_ENV_ATTACK);
trad_env, TRAD_ENV_ATTACK);
} }
time_ms = attack_sig->get_value(attack_sig, i, num_samples, time_ms = attack_sig->get_value(attack_sig, i, num_samples, render_pass_id);
render_pass_id);
if(time_ms != plugin_data->attack_prev_ms){ if(time_ms != plugin_data->attack_prev_ms){
plugin_data->attack = uint32_sat_leftshift( plugin_data->attack = uint32_sat_leftshift(trad_env_time_ms_to_val_rise(time_ms, UINT32_MAX), TRAD_ENV_UNDERSAMPLING);
trad_env_time_ms_to_val_rise(time_ms, UINT32_MAX),
TRAD_ENV_UNDERSAMPLING);
plugin_data->attack_prev_ms = time_ms; plugin_data->attack_prev_ms = time_ms;
} }
break; break;
case TRAD_ENV_PHASE_DECAY: case TRAD_ENV_PHASE_DECAY:
if(sustain_sig == NULL){ if(sustain_sig == NULL){
sustain_sig = radspa_signal_get_by_index( sustain_sig = radspa_signal_get_by_index(trad_env, TRAD_ENV_SUSTAIN);
trad_env, TRAD_ENV_SUSTAIN);
} }
sus = sustain_sig->get_value(sustain_sig, i, num_samples, sus = sustain_sig->get_value(sustain_sig, i, num_samples, render_pass_id);
render_pass_id);
plugin_data->sustain = sus<<17; plugin_data->sustain = sus<<17;
if(gate_sig == NULL){ if(gate_sig == NULL){
gate_sig = gate_sig = radspa_signal_get_by_index(trad_env, TRAD_ENV_GATE);
radspa_signal_get_by_index(trad_env, TRAD_ENV_GATE);
} }
sus = gate_sig->get_value(gate_sig, i, num_samples, sus = gate_sig->get_value(gate_sig, i, num_samples, render_pass_id);
render_pass_id);
plugin_data->gate = sus<<17; plugin_data->gate = sus<<17;
if(decay_sig == NULL){ if(decay_sig == NULL){
decay_sig = radspa_signal_get_by_index(trad_env, decay_sig = radspa_signal_get_by_index(trad_env, TRAD_ENV_DECAY);
TRAD_ENV_DECAY);
} }
time_ms = decay_sig->get_value(decay_sig, i, num_samples, time_ms = decay_sig->get_value(decay_sig, i, num_samples, render_pass_id);
render_pass_id);
if(time_ms != plugin_data->decay_prev_ms){ if(time_ms != plugin_data->decay_prev_ms){
plugin_data->decay = uint32_sat_leftshift( plugin_data->decay = uint32_sat_leftshift(trad_env_time_ms_to_val_rise(time_ms, UINT32_MAX-plugin_data->sustain), TRAD_ENV_UNDERSAMPLING);
trad_env_time_ms_to_val_rise(
time_ms, UINT32_MAX - plugin_data->sustain),
TRAD_ENV_UNDERSAMPLING);
plugin_data->decay_prev_ms = time_ms; plugin_data->decay_prev_ms = time_ms;
} }
break; break;
case TRAD_ENV_PHASE_SUSTAIN: case TRAD_ENV_PHASE_SUSTAIN:
if(sustain_sig == NULL){ if(sustain_sig == NULL){
sustain_sig = radspa_signal_get_by_index( sustain_sig = radspa_signal_get_by_index(trad_env, TRAD_ENV_SUSTAIN);
trad_env, TRAD_ENV_SUSTAIN);
} }
sus = sustain_sig->get_value(sustain_sig, i, num_samples, sus = sustain_sig->get_value(sustain_sig, i, num_samples, render_pass_id);
render_pass_id);
plugin_data->sustain = sus<<17; plugin_data->sustain = sus<<17;
break; break;
case TRAD_ENV_PHASE_RELEASE: case TRAD_ENV_PHASE_RELEASE:
if(gate_sig == NULL){ if(gate_sig == NULL){
gate_sig = gate_sig = radspa_signal_get_by_index(trad_env, TRAD_ENV_GATE);
radspa_signal_get_by_index(trad_env, TRAD_ENV_GATE);
} }
sus = gate_sig->get_value(gate_sig, i, num_samples, sus = gate_sig->get_value(gate_sig, i, num_samples, render_pass_id);
render_pass_id);
plugin_data->gate = sus<<17; plugin_data->gate = sus<<17;
if(release_sig == NULL){ if(release_sig == NULL){
release_sig = radspa_signal_get_by_index( release_sig = radspa_signal_get_by_index(trad_env, TRAD_ENV_RELEASE);
trad_env, TRAD_ENV_RELEASE);
} }
time_ms = release_sig->get_value( time_ms = release_sig->get_value(release_sig, i, num_samples, render_pass_id);
release_sig, i, num_samples, render_pass_id);
if(time_ms != plugin_data->release_prev_ms){ if(time_ms != plugin_data->release_prev_ms){
plugin_data->release = uint32_sat_leftshift( plugin_data->release = uint32_sat_leftshift(trad_env_time_ms_to_val_rise(time_ms, plugin_data->release_init_val), TRAD_ENV_UNDERSAMPLING);
trad_env_time_ms_to_val_rise(
time_ms, plugin_data->release_init_val),
TRAD_ENV_UNDERSAMPLING);
plugin_data->release_prev_ms = time_ms; plugin_data->release_prev_ms = time_ms;
} }
break; break;
...@@ -365,14 +315,12 @@ void trad_env_run(radspa_t* trad_env, uint16_t num_samples, ...@@ -365,14 +315,12 @@ void trad_env_run(radspa_t* trad_env, uint16_t num_samples,
env = trad_env_run_single(plugin_data); env = trad_env_run_single(plugin_data);
} }
if(env){ if(env){
int16_t input = int16_t input = input_sig->get_value(input_sig, i, num_samples, render_pass_id);
input_sig->get_value(input_sig, i, num_samples, render_pass_id);
ret = radspa_mult_shift(env, input); ret = radspa_mult_shift(env, input);
} else { } else {
ret = 0; ret = 0;
} }
if (phase_sig->buffer != NULL) if(phase_sig->buffer != NULL) (phase_sig->buffer)[i] = plugin_data->env_phase;
(phase_sig->buffer)[i] = plugin_data->env_phase;
if(output_sig->buffer != NULL) (output_sig->buffer)[i] = ret; if(output_sig->buffer != NULL) (output_sig->buffer)[i] = ret;
} }
phase_sig->value = plugin_data->env_phase; phase_sig->value = plugin_data->env_phase;
......
...@@ -3,13 +3,11 @@ ...@@ -3,13 +3,11 @@
#include "radspa.h" #include "radspa.h"
#include "radspa_helpers.h" #include "radspa_helpers.h"
/* provides traditional synthesizer functionality distributed over several /* provides traditional synthesizer functionality distributed over several plugins.
* plugins.
*/ */
/* plugin: trad_osc /* plugin: trad_osc
* oscillator that can generate sine, square, saw and triangle waves in the * oscillator that can generate sine, square, saw and triangle waves in the audio band. uses trad_wave.
* audio band. uses trad_wave.
*/ */
typedef struct { typedef struct {
...@@ -42,3 +40,4 @@ typedef struct { ...@@ -42,3 +40,4 @@ typedef struct {
extern radspa_descriptor_t trad_env_desc; extern radspa_descriptor_t trad_env_desc;
radspa_t * trad_env_create(uint32_t init_var); radspa_t * trad_env_create(uint32_t init_var);
void trad_env_run(radspa_t * osc, uint16_t num_samples, uint32_t render_pass_id); void trad_env_run(radspa_t * osc, uint16_t num_samples, uint32_t render_pass_id);
...@@ -4,27 +4,26 @@ ...@@ -4,27 +4,26 @@
/* Realtime Audio Developer's Simple Plugin Api /* Realtime Audio Developer's Simple Plugin Api
* *
* Written from scratch but largely inspired by faint memories of the excellent * Written from scratch but largely inspired by faint memories of the excellent ladspa.h
* ladspa.h For a simple plugin implementation example check ampliverter.c/.h :D * For a simple plugin implementation example check ampliverter.c/.h :D
*/ */
#pragma once #pragma once
#include <string.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include <string.h>
/* CONVENTIONS /* CONVENTIONS
* *
* All plugins communicate all signals in int16_t data. * All plugins communicate all signals in int16_t data.
* *
* SCT (semi-cent, 2/ct) is a mapping between int16_t pitch values and frequency * SCT (semi-cent, 2/ct) is a mapping between int16_t pitch values and frequency values comparable
* values comparable to 1V/oct. in analog music electronics. A cent is a common * to 1V/oct. in analog music electronics. A cent is a common unit in music theory and describes
* unit in music theory and describes 1/100 of a semitone or 1/1200 of an * 1/100 of a semitone or 1/1200 of an octave. Typically 1 cent is precise enough for synth
* octave. Typically 1 cent is precise enough for synth applications, however * applications, however 1/2 cent is better and allows for a 27 octave range. INT16_MAX
* 1/2 cent is better and allows for a 27 octave range. INT16_MAX represents a * represents a frequency of 28160Hz, 6 octaves above middle A (440Hz) which is represented by
* frequency of 28160Hz, 6 octaves above middle A (440Hz) which is represented * INT16_MAX - 6 * 2400.
* by INT16_MAX - 6 * 2400.
*/ */
// signal hints // signal hints
...@@ -44,8 +43,7 @@ typedef struct _radspa_descriptor_t { ...@@ -44,8 +43,7 @@ typedef struct _radspa_descriptor_t {
uint32_t id; // unique id number uint32_t id; // unique id number
char * description; char * description;
struct _radspa_t * (* create_plugin_instance)(uint32_t init_var); struct _radspa_t * (* create_plugin_instance)(uint32_t init_var);
void (*destroy_plugin_instance)( void (* destroy_plugin_instance)(struct _radspa_t * plugin); // point to radspa_t
struct _radspa_t* plugin); // point to radspa_t
} radspa_descriptor_t; } radspa_descriptor_t;
typedef struct _radspa_signal_t{ typedef struct _radspa_signal_t{
...@@ -61,8 +59,7 @@ typedef struct _radspa_signal_t { ...@@ -61,8 +59,7 @@ typedef struct _radspa_signal_t {
int16_t value; //static value, should be used if buffer is NULL. int16_t value; //static value, should be used if buffer is NULL.
uint32_t render_pass_id; uint32_t render_pass_id;
// function to retrieve value. radspa_helpers provides an example. // function to retrieve value. radspa_helpers provides an example.
int16_t (*get_value)(struct _radspa_signal_t* sig, int16_t index, int16_t (* get_value)(struct _radspa_signal_t * sig, int16_t index, uint16_t num_samples, uint32_t render_pass_id);
uint16_t num_samples, uint32_t render_pass_id);
struct _radspa_signal_t * next; //signals are in a linked list struct _radspa_signal_t * next; //signals are in a linked list
} radspa_signal_t; } radspa_signal_t;
...@@ -76,14 +73,13 @@ typedef struct _radspa_t { ...@@ -76,14 +73,13 @@ typedef struct _radspa_t {
// renders all signal outputs for num_samples if render_pass_id has changed // renders all signal outputs for num_samples if render_pass_id has changed
// since the last call, else does nothing. // since the last call, else does nothing.
void (*render)(struct _radspa_t* plugin, uint16_t num_samples, void (* render)(struct _radspa_t * plugin, uint16_t num_samples, uint32_t render_pass_id);
uint32_t render_pass_id);
// stores id number of render pass. // stores id number of render pass.
uint32_t render_pass_id; uint32_t render_pass_id;
void* plugin_data; // internal data for the plugin to use. should not be
// accessed from outside. void * plugin_data; // internal data for the plugin to use. should not be accessed from outside.
uint32_t plugin_table_len; uint32_t plugin_table_len;
int16_t * plugin_table; int16_t * plugin_table;
} radspa_t; } radspa_t;
...@@ -92,17 +88,14 @@ typedef struct _radspa_t { ...@@ -92,17 +88,14 @@ typedef struct _radspa_t {
* Hosts must provide implementations for the following functions: * Hosts must provide implementations for the following functions:
*/ */
/* The return value should equal frequency(sct) * UINT32_MAX / /* The return value should equal frequency(sct) * UINT32_MAX / (sample_rate>>undersample_pow) with:
* (sample_rate>>undersample_pow) with: frequency(sct) = pow(2, (sct + * frequency(sct) = pow(2, (sct + 2708)/2400)
* 2708)/2400) * /!\ Performance critical, might be called on a per-sample basis, do _not_ just use pow()!
* /!\ Performance critical, might be called on a per-sample basis, do _not_
* just use pow()!
*/ */
extern uint32_t radspa_sct_to_rel_freq(int16_t sct, int16_t undersample_pow); extern uint32_t radspa_sct_to_rel_freq(int16_t sct, int16_t undersample_pow);
// Return 1 if the buffer wasn't rendered already, 0 otherwise. // Return 1 if the buffer wasn't rendered already, 0 otherwise.
extern bool radspa_host_request_buffer_render(int16_t* buf, extern bool radspa_host_request_buffer_render(int16_t * buf, uint16_t num_samples);
uint16_t num_samples);
// limit a to -32767..32767 // limit a to -32767..32767
extern int16_t radspa_clip(int32_t a); extern int16_t radspa_clip(int32_t a);
......
//SPDX-License-Identifier: CC0-1.0 //SPDX-License-Identifier: CC0-1.0
#include "radspa_helpers.h" #include "radspa_helpers.h"
radspa_signal_t* radspa_signal_get_by_index(radspa_t* plugin, radspa_signal_t * radspa_signal_get_by_index(radspa_t * plugin, uint16_t signal_index){
uint16_t signal_index) {
radspa_signal_t * ret = plugin->signals; radspa_signal_t * ret = plugin->signals;
for(uint16_t i = 0; i < signal_index; i++){ for(uint16_t i = 0; i < signal_index; i++){
ret = ret->next; ret = ret->next;
...@@ -11,8 +10,7 @@ radspa_signal_t* radspa_signal_get_by_index(radspa_t* plugin, ...@@ -11,8 +10,7 @@ radspa_signal_t* radspa_signal_get_by_index(radspa_t* plugin,
return ret; return ret;
} }
void radspa_signal_set(radspa_t* plugin, uint8_t signal_index, char* name, void radspa_signal_set(radspa_t * plugin, uint8_t signal_index, char * name, uint32_t hints, int16_t value){
uint32_t hints, int16_t value) {
radspa_signal_t * sig = radspa_signal_get_by_index(plugin, signal_index); radspa_signal_t * sig = radspa_signal_get_by_index(plugin, signal_index);
if(sig == NULL) return; if(sig == NULL) return;
sig->name = name; sig->name = name;
...@@ -20,8 +18,7 @@ void radspa_signal_set(radspa_t* plugin, uint8_t signal_index, char* name, ...@@ -20,8 +18,7 @@ void radspa_signal_set(radspa_t* plugin, uint8_t signal_index, char* name,
sig->value = value; sig->value = value;
} }
int16_t radspa_signal_add(radspa_t* plugin, char* name, uint32_t hints, int16_t radspa_signal_add(radspa_t * plugin, char * name, uint32_t hints, int16_t value){
int16_t value) {
radspa_signal_t * sig = calloc(1,sizeof(radspa_signal_t)); radspa_signal_t * sig = calloc(1,sizeof(radspa_signal_t));
if(sig == NULL) return -1; // allocation failed if(sig == NULL) return -1; // allocation failed
sig->name = name; sig->name = name;
...@@ -47,19 +44,15 @@ int16_t radspa_signal_add(radspa_t* plugin, char* name, uint32_t hints, ...@@ -47,19 +44,15 @@ int16_t radspa_signal_add(radspa_t* plugin, char* name, uint32_t hints,
} }
sigs->next = sig; sigs->next = sig;
} }
if (plugin->len_signals != list_index) { if(plugin->len_signals != list_index){ abort(); }
abort();
}
plugin->len_signals++; plugin->len_signals++;
return list_index; return list_index;
} }
int16_t radspa_signal_get_value(radspa_signal_t* sig, int16_t index, int16_t radspa_signal_get_value(radspa_signal_t * sig, int16_t index, uint16_t num_samples, uint32_t render_pass_id){
uint16_t num_samples, uint32_t render_pass_id) {
if(sig->buffer != NULL){ if(sig->buffer != NULL){
if(sig->render_pass_id != render_pass_id){ if(sig->render_pass_id != render_pass_id){
radspa_host_request_buffer_render( radspa_host_request_buffer_render(sig->buffer, num_samples); //, render_pass_id);
sig->buffer, num_samples); //, render_pass_id);
sig->render_pass_id = render_pass_id; sig->render_pass_id = render_pass_id;
} }
return sig->buffer[index]; return sig->buffer[index];
...@@ -67,10 +60,7 @@ int16_t radspa_signal_get_value(radspa_signal_t* sig, int16_t index, ...@@ -67,10 +60,7 @@ int16_t radspa_signal_get_value(radspa_signal_t* sig, int16_t index,
return sig->value; return sig->value;
} }
radspa_t* radspa_standard_plugin_create(radspa_descriptor_t* desc, radspa_t * radspa_standard_plugin_create(radspa_descriptor_t * desc, uint8_t num_signals, size_t plugin_data_size, uint32_t plugin_table_size){
uint8_t num_signals,
size_t plugin_data_size,
uint32_t plugin_table_size) {
radspa_t * ret = calloc(1, sizeof(radspa_t)); radspa_t * ret = calloc(1, sizeof(radspa_t));
if(ret == NULL) return NULL; if(ret == NULL) return NULL;
if(plugin_data_size){ if(plugin_data_size){
......
...@@ -2,30 +2,21 @@ ...@@ -2,30 +2,21 @@
#pragma once #pragma once
#include "radspa.h" #include "radspa.h"
// adds signal to plugin instance struct. typically used to initiate a plugin // adds signal to plugin instance struct. typically used to initiate a plugin instance.
// instance. int16_t radspa_signal_add(radspa_t * plugin, char * name, uint32_t hints, int16_t value);
int16_t radspa_signal_add(radspa_t* plugin, char* name, uint32_t hints, // as above, but sets parameters of an already existing signal with at list position signal_index
int16_t value); void radspa_signal_set(radspa_t * plugin, uint8_t signal_index, char * name, uint32_t hints, int16_t value);
// as above, but sets parameters of an already existing signal with at list
// position signal_index
void radspa_signal_set(radspa_t* plugin, uint8_t signal_index, char* name,
uint32_t hints, int16_t value);
// get signal struct from a signal index // get signal struct from a signal index
radspa_signal_t* radspa_signal_get_by_index(radspa_t* plugin, radspa_signal_t * radspa_signal_get_by_index(radspa_t * plugin, uint16_t signal_index);
uint16_t signal_index);
radspa_t* radspa_standard_plugin_create(radspa_descriptor_t* desc, radspa_t * radspa_standard_plugin_create(radspa_descriptor_t * desc, uint8_t num_signals, size_t plugin_data_size, uint32_t plugin_table_size);
uint8_t num_signals,
size_t plugin_data_size,
uint32_t plugin_table_size);
void radspa_standard_plugin_destroy(radspa_t * plugin); void radspa_standard_plugin_destroy(radspa_t * plugin);
// frees all signal structs. typically used to destroy a plugin instance. // frees all signal structs. typically used to destroy a plugin instance.
void radspa_signals_free(radspa_t * plugin); void radspa_signals_free(radspa_t * plugin);
/* returns the value that a signal has at a given moment in time. time is /* returns the value that a signal has at a given moment in time. time is
* represented as the buffer index. requests rendering from host and requires * represented as the buffer index. requests rendering from host and requires implementation
* implementation of radspa_host_request_buffer_render. * of radspa_host_request_buffer_render.
*/ */
int16_t radspa_signal_get_value(radspa_signal_t* sig, int16_t index, int16_t radspa_signal_get_value(radspa_signal_t * sig, int16_t index, uint16_t num_samples, uint32_t render_pass_id);
uint16_t num_samples, uint32_t render_pass_id);
...@@ -17,6 +17,7 @@ find . \ ...@@ -17,6 +17,7 @@ find . \
-path './components/micropython/vendor' -o \ -path './components/micropython/vendor' -o \
-path './components/tinyusb' -o \ -path './components/tinyusb' -o \
-path './components/ctx' -o \ -path './components/ctx' -o \
-path './components/bl00mbox' -o \
-path './components/bmi270' -o \ -path './components/bmi270' -o \
-path './components/bmp581' -o \ -path './components/bmp581' -o \
-path './sim' \ -path './sim' \
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment