diff options
Diffstat (limited to 'midimonster.c')
-rw-r--r-- | midimonster.c | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/midimonster.c b/midimonster.c index 5d7ec7f..765c1ce 100644 --- a/midimonster.c +++ b/midimonster.c @@ -1,3 +1,4 @@ +#include <string.h> #include "midimonster.h" #include "config.h" #include "backend.h" @@ -7,6 +8,67 @@ int artnet_init(); int midi_init(); int osc_init(); +static size_t ninstances = 0; +static instance** instances = NULL; + +instance* mm_instance(){ + instance** new_inst = realloc(instances, (ninstances + 1) * sizeof(instance*)); + if(!new_inst){ + //TODO free + fprintf(stderr, "Failed to allocate memory\n"); + ninstances = 0; + return NULL; + } + instances = new_inst; + instances[ninstances] = calloc(1, sizeof(instance)); + if(!instances[ninstances]){ + fprintf(stderr, "Failed to allocate memory\n"); + return NULL; + } + + return instances[ninstances++]; +} + +int mm_backend_instances(char* name, size_t* ninst, instance*** inst){ + backend* b = backend_match(name); + size_t n = 0, u; + //count number of affected instances + for(u = 0; u < ninstances; u++){ + if(instances[u]->backend == b){ + n++; + } + } + + *ninst = n; + *inst = calloc(n, sizeof(instance*)); + if(!*inst){ + fprintf(stderr, "Failed to allocate memory\n"); + return 1; + } + + n = 0; + for(u = 0; u < ninstances; u++){ + if(instances[u]->backend == b){ + (*inst)[n] = instances[u]; + n++; + } + } + return 0; +} + +static void instances_free(){ + size_t u; + for(u = 0; u < ninstances; u++){ + free(instances[u]->name); + instances[u]->name = NULL; + instances[u]->backend = NULL; + free(instances[u]); + instances[u] = NULL; + } + free(instances); + ninstances = 0; +} + int usage(char* fn){ fprintf(stderr, "MIDIMonster v0.1\n"); fprintf(stderr, "Usage:\n"); @@ -23,7 +85,7 @@ int main(int argc, char** argv){ //initialize backends //TODO replace this with loading shared objects - if(artnet_init() /*|| midi_init() || osc_init()*/){ + if(artnet_init() || midi_init() /* || osc_init()*/){ fprintf(stderr, "Failed to initialize a backend\n"); goto bail; } @@ -32,6 +94,7 @@ int main(int argc, char** argv){ if(config_read(cfg_file)){ fprintf(stderr, "Failed to read configuration file %s\n", cfg_file); backends_stop(); + instances_free(); return usage(argv[0]); } @@ -41,6 +104,7 @@ int main(int argc, char** argv){ bail: //free all data backends_stop(); + instances_free(); return rv; } |