aboutsummaryrefslogtreecommitdiffhomepage
path: root/backends
diff options
context:
space:
mode:
authorcbdev <cb@cbcdn.com>2020-03-10 21:57:47 +0100
committercbdev <cb@cbcdn.com>2020-03-10 21:57:47 +0100
commit04494e4543150567a461dd478ce9ccdc067131b2 (patch)
tree64f088246824f4437430c502f619e8b8aa5171c3 /backends
parentb09f93ea146812c9a3a3a15cc7654868f9c5a468 (diff)
downloadmidimonster-04494e4543150567a461dd478ce9ccdc067131b2.tar.gz
midimonster-04494e4543150567a461dd478ce9ccdc067131b2.tar.bz2
midimonster-04494e4543150567a461dd478ce9ccdc067131b2.zip
Move ArtNet and sACN to local channel stores
Diffstat (limited to 'backends')
-rw-r--r--backends/artnet.c29
-rw-r--r--backends/artnet.h1
-rw-r--r--backends/sacn.c18
-rw-r--r--backends/sacn.h1
4 files changed, 33 insertions, 16 deletions
diff --git a/backends/artnet.c b/backends/artnet.c
index 0a1ed11..5d26b31 100644
--- a/backends/artnet.c
+++ b/backends/artnet.c
@@ -104,12 +104,18 @@ static int artnet_configure(char* option, char* value){
static int artnet_instance(instance* inst){
artnet_instance_data* data = calloc(1, sizeof(artnet_instance_data));
+ size_t u;
+
if(!data){
LOG("Failed to allocate memory");
return 1;
}
data->net = default_net;
+ for(u = 0; u < sizeof(data->data.channel) / sizeof(channel); u++){
+ data->data.channel[u].ident = u;
+ data->data.channel[u].instance = inst;
+ }
inst->impl = data;
return 0;
@@ -197,7 +203,7 @@ static channel* artnet_channel(instance* inst, char* spec, uint8_t flags){
}
data->data.map[chan_a] = (*spec_next == '+') ? (MAP_COARSE | chan_b) : (MAP_SINGLE | chan_a);
- return mm_channel(inst, chan_a, 1);
+ return data->data.channel + chan_a;
}
static int artnet_transmit(instance* inst){
@@ -233,7 +239,7 @@ static int artnet_transmit(instance* inst){
static int artnet_set(instance* inst, size_t num, channel** c, channel_value* v){
uint32_t frame_delta = 0;
- size_t u, mark = 0;
+ size_t u, mark = 0, channel_offset = 0;
artnet_instance_data* data = (artnet_instance_data*) inst->impl;
if(!data->dest_len){
@@ -242,22 +248,23 @@ static int artnet_set(instance* inst, size_t num, channel** c, channel_value* v)
}
for(u = 0; u < num; u++){
- if(IS_WIDE(data->data.map[c[u]->ident])){
+ channel_offset = c[u]->ident;
+ if(IS_WIDE(data->data.map[channel_offset])){
uint32_t val = v[u].normalised * ((double) 0xFFFF);
//the primary (coarse) channel is the one registered to the core, so we don't have to check for that
- if(data->data.out[c[u]->ident] != ((val >> 8) & 0xFF)){
+ if(data->data.out[channel_offset] != ((val >> 8) & 0xFF)){
mark = 1;
- data->data.out[c[u]->ident] = (val >> 8) & 0xFF;
+ data->data.out[channel_offset] = (val >> 8) & 0xFF;
}
- if(data->data.out[MAPPED_CHANNEL(data->data.map[c[u]->ident])] != (val & 0xFF)){
+ if(data->data.out[MAPPED_CHANNEL(data->data.map[channel_offset])] != (val & 0xFF)){
mark = 1;
- data->data.out[MAPPED_CHANNEL(data->data.map[c[u]->ident])] = val & 0xFF;
+ data->data.out[MAPPED_CHANNEL(data->data.map[channel_offset])] = val & 0xFF;
}
}
- else if(data->data.out[c[u]->ident] != (v[u].normalised * 255.0)){
+ else if(data->data.out[channel_offset] != (v[u].normalised * 255.0)){
mark = 1;
- data->data.out[c[u]->ident] = v[u].normalised * 255.0;
+ data->data.out[channel_offset] = v[u].normalised * 255.0;
}
}
@@ -310,10 +317,10 @@ static inline int artnet_process_frame(instance* inst, artnet_pkt* frame){
if(data->data.map[p] & MAP_MARK){
data->data.map[p] &= ~MAP_MARK;
if(data->data.map[p] & MAP_FINE){
- chan = mm_channel(inst, MAPPED_CHANNEL(data->data.map[p]), 0);
+ chan = data->data.channel + MAPPED_CHANNEL(data->data.map[p]);
}
else{
- chan = mm_channel(inst, p, 0);
+ chan = data->data.channel + p;
}
if(!chan){
diff --git a/backends/artnet.h b/backends/artnet.h
index ac69b3d..a517aa0 100644
--- a/backends/artnet.h
+++ b/backends/artnet.h
@@ -37,6 +37,7 @@ typedef struct /*_artnet_universe_model*/ {
uint8_t in[512];
uint8_t out[512];
uint16_t map[512];
+ channel channel[512];
} artnet_universe;
typedef struct /*_artnet_instance_model*/ {
diff --git a/backends/sacn.c b/backends/sacn.c
index 9c7f890..dd05dc7 100644
--- a/backends/sacn.c
+++ b/backends/sacn.c
@@ -209,12 +209,20 @@ static int sacn_configure_instance(instance* inst, char* option, char* value){
}
static int sacn_instance(instance* inst){
- inst->impl = calloc(1, sizeof(sacn_instance_data));
- if(!inst->impl){
+ sacn_instance_data* data = calloc(1, sizeof(sacn_instance_data));
+ size_t u;
+
+ if(!data){
LOG("Failed to allocate memory");
return 1;
}
+ for(u = 0; u < sizeof(data->data.channel) / sizeof(channel); u++){
+ data->data.channel[u].ident = u;
+ data->data.channel[u].instance = inst;
+ }
+
+ inst->impl = data;
return 0;
}
@@ -264,7 +272,7 @@ static channel* sacn_channel(instance* inst, char* spec, uint8_t flags){
}
data->data.map[chan_a] = (*spec_next == '+') ? (MAP_COARSE | chan_b) : (MAP_SINGLE | chan_a);
- return mm_channel(inst, chan_a, 1);
+ return data->data.channel + chan_a;
}
static int sacn_transmit(instance* inst){
@@ -424,10 +432,10 @@ static int sacn_process_frame(instance* inst, sacn_frame_root* frame, sacn_frame
//unmark and get channel
inst_data->data.map[u] &= ~MAP_MARK;
if(inst_data->data.map[u] & MAP_FINE){
- chan = mm_channel(inst, MAPPED_CHANNEL(inst_data->data.map[u]), 0);
+ chan = inst_data->data.channel + MAPPED_CHANNEL(inst_data->data.map[u]);
}
else{
- chan = mm_channel(inst, u, 0);
+ chan = inst_data->data.channel + u;
}
if(!chan){
diff --git a/backends/sacn.h b/backends/sacn.h
index f2cd49f..4138f45 100644
--- a/backends/sacn.h
+++ b/backends/sacn.h
@@ -36,6 +36,7 @@ typedef struct /*_sacn_universe_model*/ {
uint8_t in[512];
uint8_t out[512];
uint16_t map[512];
+ channel channel[512];
} sacn_universe;
typedef struct /*_sacn_instance_model*/ {