Skip to content
Snippets Groups Projects
Select Git revision
  • 65f14260d6e70264651fcfe82173ad0a96e155fc
  • main default protected
  • phhw
  • captouch-threshold
  • t
  • dos
  • test2
  • test
  • slewtest
  • simtest
  • view-think
  • vm-pending
  • media-buf
  • scope
  • passthrough
  • wave
  • vsync
  • dos-main-patch-50543
  • json-error
  • rahix/big-flow3r
  • pippin/media_framework
  • v1.3.0
  • v1.2.0
  • v1.2.0+rc1
  • v1.1.1
  • v1.1.0
  • v1.1.0+rc1
  • v1.0.0
  • v1.0.0+rc6
  • v1.0.0+rc5
  • v1.0.0+rc4
  • v1.0.0+rc3
  • v1.0.0+rc2
  • v1.0.0+rc1
34 results

delay.c

Blame
  • Forked from flow3r / flow3r firmware
    Source project has a limited visibility.
    delay.c 3.97 KiB
    #include "delay.h"
    
    radspa_t * delay_create(uint32_t init_var);
    radspa_descriptor_t delay_desc = {
        .name = "delay_static",
        .id = 42069,
        .description = "simple delay with ms input and feedback\n"
                        "init_var: delay buffer length in ms, default 500",
        .create_plugin_instance = delay_create,
        .destroy_plugin_instance = radspa_standard_plugin_destroy
    };
    
    #define DELAY_NUM_SIGNALS 7
    #define DELAY_OUTPUT 0
    #define DELAY_INPUT 1
    #define DELAY_TIME 2
    #define DELAY_FEEDBACK 3
    #define DELAY_LEVEL 4
    #define DELAY_DRY_VOL 5
    #define DELAY_REC_VOL 6
    
    void delay_run(radspa_t * delay, uint16_t num_samples, uint32_t render_pass_id){
        radspa_signal_t * output_sig = radspa_signal_get_by_index(delay, DELAY_OUTPUT);
        delay_data_t * data = delay->plugin_data;
        int16_t * buf = delay->plugin_table;
        radspa_signal_t * input_sig = radspa_signal_get_by_index(delay, DELAY_INPUT);
        radspa_signal_t * time_sig = radspa_signal_get_by_index(delay, DELAY_TIME);
        radspa_signal_t * feedback_sig = radspa_signal_get_by_index(delay, DELAY_FEEDBACK);
        radspa_signal_t * level_sig = radspa_signal_get_by_index(delay, DELAY_LEVEL);
        radspa_signal_t * dry_vol_sig = radspa_signal_get_by_index(delay, DELAY_DRY_VOL);
        radspa_signal_t * rec_vol_sig = radspa_signal_get_by_index(delay, DELAY_REC_VOL);
    
        static int16_t ret = 0;
        
        int32_t buffer_size = delay->plugin_table_len;
        int32_t time = radspa_signal_get_value(time_sig, 0, render_pass_id);
        if(time < 0) time = -time;
        if(time > data->max_delay) time = data->max_delay;
        if(time != data->time_prev){
            data->read_head_position = data->write_head_position;
            data->read_head_position -= time * (48000/1000);
            if(data->read_head_position < 0) data->read_head_position += buffer_size;
            data->time_prev = time;
        }
        int16_t fb = radspa_signal_get_value(feedback_sig, 0, render_pass_id);
        int16_t level = radspa_signal_get_value(level_sig, 0, render_pass_id);
    
        int16_t dry_vol = radspa_signal_get_value(dry_vol_sig, 0, render_pass_id);
        int16_t rec_vol = radspa_signal_get_value(rec_vol_sig, 0, render_pass_id);
    
        
        for(uint16_t i = 0; i < num_samples; i++){
    
            data->write_head_position++;
            while(data->write_head_position >= buffer_size) data->write_head_position -= buffer_size; // maybe faster than %
            data->read_head_position++;
            while(data->read_head_position >= buffer_size) data->read_head_position -= buffer_size;
        
            int16_t dry = radspa_signal_get_value(input_sig, i, render_pass_id);
            int16_t wet = buf[data->read_head_position];
    
            if(rec_vol){
                buf[data->write_head_position] = radspa_add_sat(radspa_mult_shift(rec_vol, dry), radspa_mult_shift(wet,fb));
            }
            
            ret = radspa_add_sat(radspa_mult_shift(dry_vol,dry), radspa_mult_shift(wet,level));
    
            radspa_signal_set_value(output_sig, i, ret);
        }
    }