Skip to content
Snippets Groups Projects
Select Git revision
  • 5425d21d48f898eefeeed6b1dba759226ea9e9d2
  • master default protected
  • backslash
  • nickname-match-configs
  • genofire/leds_rgb_get_state
  • genofire/rockets-state
  • genofire/ble-follow-py
  • plaetzchen/ios-workaround
  • blinkisync-as-preload
  • genofire/haule-ble-fs-deactive
  • schneider/max30001-pycardium
  • schneider/max30001-epicaridum
  • schneider/max30001
  • schneider/stream-locks
  • ios-workarounds
  • schneider/fundamental-test
  • schneider/ble-buffers
  • schneider/maxim-sdk-update
  • ch3/splashscreen
  • koalo/bhi160-works-but-dirty
  • koalo/wip/i2c-for-python
  • v1.9
  • v1.8
  • v1.7
  • v1.6
  • v1.5
  • v1.4
  • v1.3
  • v1.2
  • v1.1
  • v1.0
  • release-1
  • bootloader-v1
  • v0.0
34 results

Makefile

Blame
  • Forked from card10 / firmware
    Source project has a limited visibility.
    radspa_helpers.c 4.91 KiB
    //SPDX-License-Identifier: CC0-1.0
    #include "radspa_helpers.h"
    
    // #define RADSPA_SIGNAL_CACHING
    
    radspa_signal_t * radspa_signal_get_by_index(radspa_t * plugin, uint16_t signal_index){
        radspa_signal_t * ret = NULL;
        if(plugin == NULL) return ret; // clang-tidy
    #ifdef RADSPA_SIGNAL_CACHING
        static radspa_signal_t * cache_s = NULL;
        static radspa_t * cache_p = NULL;
        static uint16_t cache_i = 0;
    
        if((plugin == cache_p) && (signal_index == cache_i + 1) && (cache_s != NULL)){
            ret = cache_s->next;
        }
        if(ret == NULL){
    #endif
            ret = plugin->signals;
            for(uint16_t i = 0; i < signal_index; i++){
                ret = ret->next;
                if(ret == NULL) break;
            }
    #ifdef RADSPA_SIGNAL_CACHING
        }
        cache_s = ret;
        cache_p = plugin;
        cache_i = signal_index;
    #endif
        return ret;
    }
    
    void radspa_signal_set(radspa_t * plugin, uint8_t signal_index, char * name, uint32_t hints, int16_t value){
        radspa_signal_t * sig = radspa_signal_get_by_index(plugin, signal_index);
        if(sig == NULL) return;
        sig->name = name;
        sig->hints = hints;
        sig->value = value;
    }
    
    void radspa_signal_set_description(radspa_t * plugin, uint8_t signal_index, char * description){
        radspa_signal_t * sig = radspa_signal_get_by_index(plugin, signal_index);
        if(sig == NULL) return;
        sig->description = description;
    }
    
    void radspa_signal_set_group(radspa_t * plugin, uint8_t group_len, uint8_t step, uint8_t signal_index, char * name,
                                        uint32_t hints, int16_t value){
        for(uint8_t i = 0; i < group_len; i++){
            radspa_signal_t * sig = radspa_signal_get_by_index(plugin, signal_index + i * step);
            if(sig == NULL) return;
            sig->name = name;
            sig->hints = hints;
            sig->value = value;
            sig->name_multiplex = i;
        }
    }
    
    void radspa_signal_set_group_description(radspa_t * plugin, uint8_t group_len, uint8_t step, uint8_t signal_index,
                                        char * description){
        for(uint8_t i = 0; i < group_len; i++){
            radspa_signal_t * sig = radspa_signal_get_by_index(plugin, signal_index + i * step);
            if(sig == NULL) return;
            sig->description = description;
        }
    }
    
    int16_t radspa_signal_add(radspa_t * plugin, char * name, uint32_t hints, int16_t value){
        radspa_signal_t * sig = calloc(1,sizeof(radspa_signal_t));
        if(sig == NULL) return -1; // allocation failed
        sig->name = name;
        sig->hints = hints;
        sig->unit = "";
        sig->description = "";
        sig->buffer = NULL;
        sig->next = NULL;
        sig->value = value;
        sig->name_multiplex = -1;
        sig->get_value = radspa_signal_get_value;
        
        //find end of linked list
        uint16_t list_index = 0;
        if(plugin->signals == NULL){
            plugin->signals = sig;
        } else {
            radspa_signal_t * sigs = plugin->signals;
            list_index++;
            while(sigs->next != NULL){
                sigs = sigs->next;
                list_index++;
            }
            sigs->next = sig;
        }
        if(plugin->len_signals != list_index){ abort(); }  
        plugin->len_signals++;
        return list_index;
    }
    
    int16_t radspa_signal_get_value(radspa_signal_t * sig, int16_t index, uint16_t num_samples, uint32_t render_pass_id){
        if(sig->buffer != NULL){
            if(sig->render_pass_id != render_pass_id){
                radspa_host_request_buffer_render(sig->buffer, num_samples); //, render_pass_id);
                sig->render_pass_id = render_pass_id;
            }
            return sig->buffer[index];
        }
        return sig->value;
    }
    
    radspa_t * radspa_standard_plugin_create(radspa_descriptor_t * desc, uint8_t num_signals, size_t plugin_data_size, uint32_t plugin_table_size){
        radspa_t * ret = calloc(1, sizeof(radspa_t));
        if(ret == NULL) return NULL;
        if(plugin_data_size){
            ret->plugin_data = calloc(1,plugin_data_size);
            if(ret->plugin_data == NULL){
                free(ret);
                return NULL;
            }
        }
        ret->signals = NULL;
        ret->len_signals = 0;
        ret->render = NULL;
        ret->descriptor = desc;
        ret->plugin_table_len = plugin_table_size;
    
        bool init_failed = false;
        for(uint8_t i = 0; i < num_signals; i++){
            if(radspa_signal_add(ret,"UNINITIALIZED",0,0) == -1){
                init_failed = true;
                break;
            }
        }
    
        if(ret->plugin_table_len){
            ret->plugin_table = calloc(plugin_table_size, sizeof(int16_t));
            if(ret->plugin_table == NULL) init_failed = true;
        } else {
            ret->plugin_table = NULL;
        }
    
        if(init_failed){
            radspa_standard_plugin_destroy(ret);
            return NULL;
        }
        return ret;
    }
    
    void radspa_standard_plugin_destroy(radspa_t * plugin){
        radspa_signal_t * sig = plugin->signals;
        while(sig != NULL){
            radspa_signal_t * sig_next = sig->next;
            free(sig);
            sig = sig_next;
        }
        if(plugin->plugin_table != NULL) free(plugin->plugin_table);
        if(plugin->plugin_data != NULL) free(plugin->plugin_data);
        free(plugin);
    }