Skip to content
Snippets Groups Projects
Select Git revision
  • f12f09e50f7fb7f24e8e9f5b6976a5a361c17676
  • main default protected
  • blm_dev_chan
  • release/1.4.0 protected
  • widgets_draw
  • return_of_melodic_demo
  • task_cleanup
  • mixer2
  • dx/fb-save-restore
  • dx/dldldld
  • fpletz/flake
  • dx/jacksense-headset-mic-only
  • release/1.3.0 protected
  • fil3s-limit-filesize
  • allow-reloading-sunmenu
  • wifi-json-error-handling
  • app_text_viewer
  • shoegaze-fps
  • media_has_video_has_audio
  • fil3s-media
  • more-accurate-battery
  • v1.4.0
  • 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
35 results

radspa_helpers.c

Blame
  • 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);
    }