diff options
author | cbdev <cb@cbcdn.com> | 2017-06-04 18:13:29 +0200 |
---|---|---|
committer | cbdev <cb@cbcdn.com> | 2017-06-04 18:13:29 +0200 |
commit | 11e9dec049e64989c5f3656415d00c6c69851e8e (patch) | |
tree | f087aa41ead18a8b09657fd400bd8b20df80b13f | |
parent | bae15293ddc859a1ea426f15e7fa476f71ece020 (diff) | |
download | midimonster-11e9dec049e64989c5f3656415d00c6c69851e8e.tar.gz midimonster-11e9dec049e64989c5f3656415d00c6c69851e8e.tar.bz2 midimonster-11e9dec049e64989c5f3656415d00c6c69851e8e.zip |
Move instance allocator to backend object, introduce backend start function
-rw-r--r-- | artnet.c | 15 | ||||
-rw-r--r-- | artnet.h | 4 | ||||
-rw-r--r-- | backend.c | 79 | ||||
-rw-r--r-- | backend.h | 3 | ||||
-rw-r--r-- | config.c | 5 | ||||
-rw-r--r-- | midi.c | 5 | ||||
-rw-r--r-- | midi.h | 1 | ||||
-rw-r--r-- | midimonster.c | 69 | ||||
-rw-r--r-- | midimonster.h | 5 | ||||
-rw-r--r-- | monster.cfg | 1 |
10 files changed, 123 insertions, 64 deletions
@@ -13,6 +13,7 @@ int artnet_init(){ .channel = artnet_channel, .handle = artnet_set, .process = artnet_handle, + .start = artnet_start, .shutdown = artnet_shutdown }; @@ -64,6 +65,15 @@ static int artnet_configure_instance(instance* instance, char* option, char* val data->uni = strtoul(value, NULL, 10); return 0; } + else if(!strcmp(option, "output")){ + if(!strcmp(value, "true")){ + data->mode |= MODE_OUTPUT; + } + else{ + data->mode &= ~MODE_OUTPUT; + } + return 0; + } fprintf(stderr, "Unknown ArtNet instance option %s\n", option); return 1; @@ -85,6 +95,11 @@ static int artnet_handle(size_t num, int* fd, void** data){ return 1; } +static int artnet_start(){ + //TODO + return 1; +} + static int artnet_shutdown(){ size_t n, p; instance** inst = NULL; @@ -7,9 +7,13 @@ static instance* artnet_instance(); static channel* artnet_channel(instance* instance, char* spec); static int artnet_set(size_t num, channel* c, channel_value* v); static int artnet_handle(size_t num, int* fd, void** data); +static int artnet_start(); static int artnet_shutdown(); +#define MODE_OUTPUT 1 + typedef struct /*_artnet_instance_model*/ { uint8_t net; uint8_t uni; + uint8_t mode; } artnet_instance_data; @@ -4,6 +4,66 @@ static size_t nbackends = 0; static backend* backends = NULL; +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; +} + +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; +} backend* backend_match(char* name){ size_t u; @@ -15,6 +75,16 @@ backend* backend_match(char* name){ return NULL; } +instance* instance_match(char* name){ + size_t u; + for(u = 0; u < ninstances; u++){ + if(!strcmp(instances[u]->name, name)){ + return instances[u]; + } + } + return NULL; +} + int mm_backend_register(backend b){ if(!backend_match(b.name)){ backends = realloc(backends, (nbackends + 1) * sizeof(backend)); @@ -32,6 +102,15 @@ int mm_backend_register(backend b){ return 1; } +int backends_start(){ + int rv = 0; + size_t u; + for(u = 0; u < nbackends; u++){ + rv |= backends[u].start(); + } + return rv; +} + int backends_stop(){ size_t u; for(u = 0; u < nbackends; u++){ @@ -1,2 +1,5 @@ backend* backend_match(char* name); +instance* instance_match(char* name); +int backends_start(); int backends_stop(); +void instances_free(); @@ -85,6 +85,11 @@ int config_read(char* cfg_file){ goto bail; } + if(instance_match(separator)){ + fprintf(stderr, "Duplicate instance name %s\n", separator); + goto bail; + } + current_instance = current_backend->create(); if(!current_instance){ fprintf(stderr, "Failed to instantiate backend %s\n", line); @@ -14,6 +14,7 @@ int midi_init(){ .channel = midi_channel, .handle = midi_set, .process = midi_handle, + .start = midi_start, .shutdown = midi_shutdown }; @@ -82,6 +83,10 @@ static int midi_handle(size_t num, int* fd, void** data){ return 1; } +static int midi_start(){ + return 1; +} + static int midi_shutdown(){ size_t n, p; instance** inst = NULL; @@ -7,4 +7,5 @@ static instance* midi_instance(); static channel* midi_channel(instance* instance, char* spec); static int midi_set(size_t num, channel* c, channel_value* v); static int midi_handle(size_t num, int* fd, void** data); +static int midi_start(); static int midi_shutdown(); diff --git a/midimonster.c b/midimonster.c index 765c1ce..e59b7f9 100644 --- a/midimonster.c +++ b/midimonster.c @@ -8,67 +8,6 @@ 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"); @@ -98,7 +37,13 @@ int main(int argc, char** argv){ return usage(argv[0]); } - //wait for events + //start backends + if(backends_start()){ + fprintf(stderr, "Failed to start backends\n"); + goto bail; + } + + //TODO wait for & translate events rv = EXIT_SUCCESS; bail: diff --git a/midimonster.h b/midimonster.h index f15d39c..9026222 100644 --- a/midimonster.h +++ b/midimonster.h @@ -34,19 +34,20 @@ typedef struct /*_mm_backend*/ { mmbackend_parse_channel channel; mmbackend_handle_event handle; mmbackend_process_fd process; + mmbackend_start start; mmbackend_shutdown shutdown; } backend; typedef struct _backend_instance { backend* backend; - size_t ident; + uint64_t ident; /*FIXME needed? identification provided by name*/ void* impl; char* name; } instance; typedef struct _backend_channel { instance* instance; - size_t ident; + uint64_t ident; void* impl; } channel; diff --git a/monster.cfg b/monster.cfg index ccb0d11..4bb7bd2 100644 --- a/monster.cfg +++ b/monster.cfg @@ -22,6 +22,7 @@ port = Translation Output 1 [artnet net1] net = 1 uni = 1 +output = true [artnet foo] net = 0 |