missing commit in generator.h
[galan.git] / plugins / libarrmul.c
blob406099e07082d5941d52e91579be7aacd3a83664
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 <glib.h>
27 #include <gmodule.h>
29 #include "global.h"
30 #include "generator.h"
31 #include "comp.h"
32 #include "control.h"
33 #include "gencomp.h"
35 #define GENERATOR_CLASS_NAME "arrmul"
36 #define GENERATOR_CLASS_PATH "Array/Multiply"
38 #define EVT_INPUT 0
39 #define EVT_FACTOR 1
40 #define NUM_EVENT_INPUTS 2
42 #define EVT_OUTPUT 0
43 #define NUM_EVENT_OUTPUTS 1
45 typedef struct Data {
46 int len;
47 gdouble *factor;
48 } Data;
50 PRIVATE int init_instance(Generator *g) {
51 Data *data = safe_malloc(sizeof(Data));
52 g->data = data;
54 data->factor = NULL;
55 data->len = 0;
57 return 1;
60 PRIVATE void destroy_instance(Generator *g) {
61 Data *data = g->data;
62 if( data->factor )
63 free( data->factor );
64 free(data);
67 PRIVATE void unpickle_instance(Generator *g, ObjectStoreItem *item, ObjectStore *db) {
68 Data *data = safe_malloc(sizeof(Data));
69 ObjectStoreDatum *array;
70 int i;
72 g->data = data;
74 array = objectstore_item_get(item, "arrmul_factor");
76 data->len = objectstore_item_get_double(item, "arrmul_len", 0);
77 data->factor = safe_malloc( sizeof( gdouble ) * data->len );
78 for(i=0; i<data->len; i++ )
79 data->factor[i] = objectstore_datum_double_value(
80 objectstore_datum_array_get(array, i) );
83 PRIVATE void pickle_instance(Generator *g, ObjectStoreItem *item, ObjectStore *db) {
85 ObjectStoreDatum *array;
86 Data *data = g->data;
87 int i;
89 array = objectstore_datum_new_array(data->len);
90 objectstore_item_set_integer(item, "arrmul_len", data->len);
91 objectstore_item_set(item, "arrmul_factor", array);
92 for (i = 0; i < data->len; i++) {
93 objectstore_datum_array_set(array, i,
94 objectstore_datum_new_double( data->factor[i]) );
98 PRIVATE void evt_input_handler(Generator *g, AEvent *event) {
99 int i;
100 Data *data = g->data;
102 switch( event->kind ) {
103 case AE_NUMARRAY:
104 if( event->d.array.len != data->len )
106 g_print( "arrmul dimension mismatch (data->len, event->len ) = ( %d, %d )\n", data->len, event->d.array.len );
107 else {
109 for( i=0; i<data->len; i++ )
110 event->d.array.numbers[i] *= data->factor[i];
112 gen_send_events(g, EVT_OUTPUT, -1, event);
114 break;
115 default:
116 g_warning( "arrmul does not support this eventkind\n" );
117 break;
121 PRIVATE void evt_factor_handler(Generator *g, AEvent *event) {
122 Data *data = g->data;
123 int i;
125 switch( event->kind ) {
126 case AE_NUMARRAY:
127 if( event->d.array.len != data->len ) {
128 free( data->factor );
129 data->len = event->d.array.len;
130 data->factor = safe_malloc( sizeof( gdouble ) * data->len );
133 // use memcpy here;
134 for( i=0; i<data->len; i++ )
135 data->factor[i] = event->d.array.numbers[i];
137 break;
138 default:
139 g_warning( "arrmul does not support this eventkind\n" );
140 break;
144 PRIVATE ControlDescriptor controls[] = {
145 /* { kind, name, min,max,step,page, size,editable, is_dst,queue_number,
146 init,destroy,refresh,refresh_data }, */
147 { CONTROL_KIND_NONE, }
150 PRIVATE void setup_class(void) {
151 GeneratorClass *k = gen_new_generatorclass(GENERATOR_CLASS_NAME, FALSE,
152 NUM_EVENT_INPUTS, NUM_EVENT_OUTPUTS,
153 NULL, NULL, controls,
154 init_instance, destroy_instance,
155 unpickle_instance, pickle_instance);
157 gen_configure_event_input(k, EVT_INPUT, "Input", evt_input_handler);
158 gen_configure_event_input(k, EVT_FACTOR, "Factor", evt_factor_handler);
159 gen_configure_event_output(k, EVT_OUTPUT, "Output");
161 gencomp_register_generatorclass(k, FALSE, GENERATOR_CLASS_PATH,
162 NULL,
163 NULL);
166 PUBLIC void init_plugin(void) {
167 setup_class();