make midimap obey channels
[galan.git] / plugins / libarradd.c
blob1750e72eb43df79fe5bca3d857d613ca6ffaa4ba
1 /* gAlan - Graphical Audio Language
2 * Copyright (C) 1999 Tony Garnock-Jones
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #include <stdlib.h>
20 #include <string.h>
21 #include <stdio.h>
22 #include <stddef.h>
24 #include <gdk/gdk.h>
25 #include <gtk/gtk.h>
26 #include <gmodule.h>
28 #include "global.h"
29 #include "generator.h"
30 #include "comp.h"
31 #include "control.h"
32 #include "gencomp.h"
34 #define GENERATOR_CLASS_NAME "arradd"
35 #define GENERATOR_CLASS_PATH "Array/Add"
37 #define EVT_INPUT 0
38 #define EVT_FACTOR 1
39 #define NUM_EVENT_INPUTS 2
41 #define EVT_OUTPUT 0
42 #define NUM_EVENT_OUTPUTS 1
44 typedef struct Data {
45 int len;
46 gdouble *factor;
47 } Data;
49 PRIVATE int init_instance(Generator *g) {
50 Data *data = safe_malloc(sizeof(Data));
51 g->data = data;
53 data->factor = NULL;
54 data->len = 0;
56 return 1;
59 PRIVATE void destroy_instance(Generator *g) {
60 Data *data = g->data;
61 if( data->factor )
62 free( data->factor );
63 free(data);
66 PRIVATE void unpickle_instance(Generator *g, ObjectStoreItem *item, ObjectStore *db) {
67 Data *data = safe_malloc(sizeof(Data));
68 ObjectStoreDatum *array;
69 int i;
71 g->data = data;
73 array = objectstore_item_get(item, "arrmul_factor");
75 data->len = objectstore_item_get_double(item, "arrmul_len", 0);
76 data->factor = safe_malloc( sizeof( gdouble ) * data->len );
77 for(i=0; i<data->len; i++ )
78 data->factor[i] = objectstore_datum_double_value(
79 objectstore_datum_array_get(array, i) );
82 PRIVATE void pickle_instance(Generator *g, ObjectStoreItem *item, ObjectStore *db) {
84 ObjectStoreDatum *array;
85 Data *data = g->data;
86 int i;
88 array = objectstore_datum_new_array(data->len);
89 objectstore_item_set_integer(item, "arrmul_len", data->len);
90 objectstore_item_set(item, "arrmul_factor", array);
91 for (i = 0; i < data->len; i++) {
92 objectstore_datum_array_set(array, i,
93 objectstore_datum_new_double( data->factor[i]) );
97 PRIVATE void evt_input_handler(Generator *g, AEvent *event) {
98 int i;
99 Data *data = g->data;
101 switch( event->kind ) {
102 case AE_NUMARRAY:
103 if( event->d.array.len != data->len )
104 g_warning( "arrmul dimension mismatch" );
106 for( i=0; i<data->len; i++ )
107 event->d.array.numbers[i] += data->factor[i];
109 gen_send_events(g, EVT_OUTPUT, -1, event);
110 break;
111 default:
112 g_warning( "arradd does not support this eventkind\n" );
113 break;
117 PRIVATE void evt_factor_handler(Generator *g, AEvent *event) {
118 Data *data = g->data;
119 int i;
121 switch( event->kind ) {
122 case AE_NUMARRAY:
123 if( event->d.array.len != data->len ) {
124 free( data->factor );
125 data->len = event->d.array.len;
126 data->factor = safe_malloc( sizeof( gdouble ) * data->len );
129 // use memcpy here;
130 for( i=0; i<data->len; i++ )
131 data->factor[i] = event->d.array.numbers[i];
133 break;
134 default:
135 g_warning( "arrmul does not support this eventkind\n" );
136 break;
140 PRIVATE ControlDescriptor controls[] = {
141 /* { kind, name, min,max,step,page, size,editable, is_dst,queue_number,
142 init,destroy,refresh,refresh_data }, */
143 { CONTROL_KIND_NONE, }
146 PRIVATE void setup_class(void) {
147 GeneratorClass *k = gen_new_generatorclass(GENERATOR_CLASS_NAME, FALSE,
148 NUM_EVENT_INPUTS, NUM_EVENT_OUTPUTS,
149 NULL, NULL, controls,
150 init_instance, destroy_instance,
151 unpickle_instance, pickle_instance);
153 gen_configure_event_input(k, EVT_INPUT, "Input", evt_input_handler);
154 gen_configure_event_input(k, EVT_FACTOR, "Offset", evt_factor_handler);
155 gen_configure_event_output(k, EVT_OUTPUT, "Output");
157 gencomp_register_generatorclass(k, FALSE, GENERATOR_CLASS_PATH,
158 NULL,
159 NULL);
162 PUBLIC void init_plugin(void) {
163 setup_class();