00001
00002
00003
00004
00005
00007
00009
00010
00011 #ifndef __OMAX_LEARN_MAX_API_
00012 #define __OMAX_LEARN_MAX_API_
00013
00014 #include "Oracle_data.hpp"
00015
00016 extern "C"
00017 {
00018
00019 #include "ext.h"
00020 #include "ext_obex.h"
00021 #include "jpatcher_api.h"
00022 #include "jgraphics.h"
00023
00024 #include "OMax.data.h"
00025
00030 typedef struct _OMax_build
00031 {
00032 t_object ob;
00033
00034 t_symbol* oname;
00035 t_symbol* odataname;
00036 O_data* odata;
00037 bool odatabound;
00038 t_symbol* idataname;
00039 O_data* idata;
00040 bool idatabound;
00041 O_DataType datatype;
00042
00043 long date;
00044 t_atom* addout;
00045
00046 void* out_state;
00047 void* out_added;
00048 void* out_date;
00049 } t_OMax_build;
00050
00052
00054
00056
00057
00058 void *OMax_build_new(t_symbol *s, long argc, t_atom *argv);
00059 void OMax_build_free(t_OMax_build *x);
00060 void OMax_build_assist(t_OMax_build *x, void *b, long io, long index, char *s);
00061
00062
00063 void OMax_build_bang(t_OMax_build *x);
00064 void OMax_build_add(t_OMax_build *x, long ostatenb);
00065
00066
00067 t_symbol* OMax_build_dataname(t_symbol* name);
00068 bool OMax_build_bind(t_OMax_build *x);
00069
00070
00071 t_class *OMax_build_class;
00072
00074
00076
00077 int main(void)
00078 {
00079 t_class *c;
00080
00081 c = class_new("OMax.build", (method)OMax_build_new, (method)OMax_build_free, (long)sizeof(t_OMax_build),
00082 0L , A_GIMME, 0);
00083
00084
00085 class_addmethod(c, (method)OMax_build_assist,"assist",A_CANT, 0);
00086
00087
00088 class_addmethod(c, (method)OMax_build_bang, "bang", 0);
00089 class_addmethod(c, (method)OMax_build_add, "int", A_LONG, 0);
00090
00091 class_register(CLASS_BOX, c);
00092 OMax_build_class = c;
00093
00094 return 0;
00095 }
00096
00098
00099
00102 void *OMax_build_new(t_symbol *s, long argc, t_atom *argv)
00103 {
00104 t_OMax_build *x = NULL;
00105
00106 if (x = (t_OMax_build *)object_alloc(OMax_build_class))
00107 {
00108
00109 char err;
00110 long i;
00111 atom_alloc_array(2,&i,&(x->addout),&err);
00112 if (!err && i!=2)
00113 object_error((t_object*)x, "Allocation error");
00114
00115
00116 x->out_date = intout(x);
00117 x->out_state = intout(x);
00118 x->out_added = listout(x);
00119
00121 x->odatabound = FALSE;
00122 x->idatabound = FALSE;
00123 if (argc < 2)
00124 object_error((t_object *)x,"Missing arguments (oracle's data & new sequence's data)");
00125 else
00126 {
00127 if (argv->a_type!=A_SYM && (argv+1)->a_type!=A_SYM)
00128 object_error((t_object *)x,"Both arguments must be symbols (oracle's data & new sequence's data)");
00129 else
00130 {
00131 x->oname = atom_getsym(argv);
00132 x->odataname = OMax_build_dataname(x->oname);
00133 x->idataname = OMax_build_dataname(atom_getsym(argv+1));
00134 }
00135
00136 }
00137
00138
00139 t_object *box;
00140 t_jrgba colorvals;
00141 jrgba_set(&colorvals, 0.30, 1.0, 0.15, 1.0);
00142 object_obex_lookup((t_object *)x, gensym("#B"), &box);
00143 jbox_set_color(box, &colorvals);
00144 }
00145 return (x);
00146 }
00147
00150 void OMax_build_free(t_OMax_build *x)
00151 {
00152 ;
00153 }
00154
00157 void OMax_build_assist(t_OMax_build *x, void *b, long io, long index, char *s)
00158 {
00159 switch (io)
00160 {
00161 case 1:
00162 switch (index)
00163 {
00164 case 0:
00165 sprintf(s, "int state to add");
00166 break;
00167 }
00168 break;
00169 case 2:
00170 switch (index)
00171 {
00172 case 0:
00173 sprintf(s, "added");
00174 break;
00175 case 1:
00176 sprintf(s, "size");
00177 break;
00178 case 2:
00179 sprintf(s, "ending date");
00180 break;
00181 }
00182 }
00183 }
00184
00186
00188
00189
00192 t_symbol * OMax_build_dataname(t_symbol * name)
00193 {
00194 char dataname[128];
00195 strcpy(dataname,name->s_name);
00197 strcat(dataname,"_data");
00198 return gensym(dataname);
00199 }
00200
00203 bool OMax_build_bind(t_OMax_build *x)
00204 {
00206 if ((x->odatabound==FALSE) || (x->idatabound==FALSE))
00207 {
00209 if ((x->odataname->s_thing) && (ob_sym(x->odataname->s_thing) == gensym("OMax.data")))
00210 {
00211 x->odata = &(((t_OMax_data*)(x->odataname->s_thing))->data);
00212 x->odatabound = TRUE;
00213 object_post((t_object *)x,"Builder bound to Data of Oracle %s", x->oname->s_name);
00214 }
00215 else
00216 {
00217 object_error((t_object *)x,"No data for Oracle %s declared", x->oname->s_name);
00218 }
00220 if ((x->idataname->s_thing) && (ob_sym(x->idataname->s_thing) == gensym("OMax.data")))
00221 {
00222 if (((t_OMax_data*)(x->idataname->s_thing))->datatype == ((t_OMax_data*)(x->odataname->s_thing))->datatype
00223 && ((t_OMax_data*)(x->idataname->s_thing))->noDelete == TRUE)
00224 {
00225 x->idata = &(((t_OMax_data*)(x->idataname->s_thing))->data);
00226 x->idatabound = TRUE;
00227 x->datatype = ((t_OMax_data*)(x->odataname->s_thing))->datatype;
00228 object_post((t_object *)x,"Builder writing Sequence %s", x->idataname->s_name);
00229 }
00230 else
00231 object_error((t_object *)x,"Data type mismatch");
00232 }
00233 else
00234 {
00235 object_error((t_object *)x,"No new data declared to write");
00236 }
00237 }
00239 return (x->odatabound && x->idatabound);
00240 }
00241
00243
00245
00246
00250 void OMax_build_bang(t_OMax_build *x)
00251 {
00252 if (OMax_build_bind(x))
00253 {
00254 ATOMIC_INCREMENT(&(((t_OMax_data *)(x->idataname->s_thing))->readcount));
00255 if(!(((t_OMax_data *)(x->idataname->s_thing))->wflag))
00256 {
00257 if(x->idata->get_size()<=1)
00258 x->date = 0;
00259 outlet_int(x->out_date, x->date);
00260 outlet_int(x->out_state, (long)x->idata->get_size());
00261 }
00262 else
00263 object_error((t_object*)x, "Data busy");
00264 ATOMIC_DECREMENT(&(((t_OMax_data *)(x->idataname->s_thing))->readcount));
00265 }
00266 }
00267
00271 void OMax_build_add(t_OMax_build *x, long statein)
00272 {
00273 if (OMax_build_bind(x))
00274 {
00275 ATOMIC_INCREMENT(&(((t_OMax_data *)(x->odataname->s_thing))->readcount));
00276 if(!(((t_OMax_data *)(x->odataname->s_thing))->wflag)
00277 && !(((t_OMax_data *)(x->idataname->s_thing))->wflag)
00278 && !(((t_OMax_data *)(x->idataname->s_thing))->readcount))
00279 {
00280
00281 if((*x->odata)[statein]!=NULL)
00282 {
00283 int statnb;
00284 if(x->idata->get_size()<=1)
00285 x->date = 0;
00287 switch (x->datatype)
00288 {
00289 case LETTERS:
00290 {
00291 ATOMIC_INCREMENT(&((t_OMax_data *)(x->idataname->s_thing))->wflag);
00292 statnb = x->idata->add<O_char>(x->date,(*x->odata)[statein]);
00293 ATOMIC_DECREMENT(&((t_OMax_data *)(x->idataname->s_thing))->wflag);
00294 break;
00295 }
00296 case MIDI_MONO:
00297 {
00298 ATOMIC_INCREMENT(&((t_OMax_data *)(x->idataname->s_thing))->wflag);
00299 statnb = x->idata->add<O_MIDI_mono>(x->date,(*x->odata)[statein]);
00300 ATOMIC_DECREMENT(&((t_OMax_data *)(x->idataname->s_thing))->wflag);
00301 break;
00302 }
00303 case SPECTRAL:
00304 {
00305 ATOMIC_INCREMENT(&((t_OMax_data *)(x->idataname->s_thing))->wflag);
00306 statnb = x->idata->add<O_spectral>(x->date,(*x->odata)[statein]);
00307 ATOMIC_DECREMENT(&((t_OMax_data *)(x->idataname->s_thing))->wflag);
00308 break;
00309 }
00310 }
00311
00313 x->date = (x->date + (*x->odata)[statein]->get_duration());
00314 outlet_int(x->out_date, x->date);
00315 outlet_int(x->out_state, (long)x->idata->get_size());
00316
00317 long added[2];
00318 added[0] = statnb;
00319 added[1] = statein;
00320 atom_setlong_array(2,x->addout,2,added);
00321 outlet_list(x->out_added, NULL, 2, x->addout);
00322 }
00323 }
00324 else
00325 object_error((t_object*)x, "Data of Oracle %s being read (%d)",x->idataname->s_name,((t_OMax_data *)(x->idataname->s_thing))->readcount);
00326 ATOMIC_DECREMENT(&(((t_OMax_data *)(x->odataname->s_thing))->readcount));
00327 }
00328 }
00329
00331 }
00332
00333 #endif