22 int JAMOMA_EXPORT_MAXOBJ
main(
void)
28 common_symbols_init();
35 class_addmethod(c, (method)
oscroute_int,
"int", A_DEFLONG, 0L);
36 class_addmethod(c, (method)
oscroute_float,
"float", A_DEFFLOAT, 0L);
37 class_addmethod(c, (method)
oscroute_list,
"list", A_GIMME, 0L);
40 class_addmethod(c, (method)object_obex_dumpout,
"dumpout", A_CANT, 0);
43 class_register(CLASS_BOX, c);
58 x->outlet_overflow = outlet_new(x, 0);
65 x->arguments[0] = gensym(
"/nil");
67 x->proxy_inlet[0] = proxy_new(x, 1, 0L);
68 x->outlets[0] = outlet_new(x, 0);
72 for (i=argc; i>0; i--)
73 x->proxy_inlet[i-1] = proxy_new(x, i, 0L);
74 for (i=x->num_args-1; i >= 0; i--) {
75 x->outlets[i] = outlet_new(x, 0);
76 switch(argv[i].a_type) {
79 x->arguments[i] = atom_getsym(argv+i);
80 x->arglen[i] = strlen(atom_getsym(argv+i)->s_name);
86 snprintf(tempstr, 256,
"%ld", atom_getlong(argv+i));
87 x->arguments[i] = gensym(tempstr);
88 x->arglen[i] = strlen(tempstr);
95 snprintf(tempstr, 256,
"%f", atom_getfloat(argv+i));
96 x->arguments[i] = gensym(tempstr);
97 x->arglen[i] = strlen(tempstr);
101 error(
"j.oscroute - invalid arguments - all args must be symbols");
114 for (i=0; i<x->num_args; i++)
115 freeobject((t_object *)(x->proxy_inlet[i]));
127 strcpy(dst,
"Input");
129 if (arg < x->num_args)
130 strcpy(dst, x->arguments[arg]->s_name);
132 strcpy(dst,
"dumpout / overflow from non-matching input");
140 outlet_bang(x->outlet_overflow);
146 outlet_int(x->outlet_overflow, n);
152 outlet_float(x->outlet_overflow, f);
158 outlet_list(x->outlet_overflow, _sym_list, argc , argv);
161 void output_msg(t_oscroute *x,
char *msg,
int outlet,
long argc, t_atom *argv)
167 outlet_bang(x->outlets[outlet]);
168 }
else if (argc==1) {
170 if (argv->a_type==A_LONG)
171 outlet_int(x->outlets[outlet],argv->a_w.w_long);
172 else if (argv->a_type==A_FLOAT)
173 outlet_float(x->outlets[outlet],argv->a_w.w_float);
174 else if (argv->a_type==A_SYM)
175 outlet_anything(x->outlets[outlet],argv->a_w.w_sym,0,0);
178 if (argv->a_type==A_SYM) {
179 output = argv->a_w.w_sym;
186 outlet_anything(x->outlets[outlet], output, argc, argv);
189 outlet_anything(x->outlets[outlet], gensym(msg), argc, argv);
197 char input[MAX_MESS_SIZE];
198 long inlet = proxy_getinlet((t_object *)x);
202 x->arguments[inlet-1] = msg;
203 x->arglen[inlet-1] = strlen(msg->s_name);
208 strcpy(input, msg->s_name);
221 bool overFlow =
true;
222 for (
int pos=0; pos < x->num_args; pos++) {
224 if (strncmp(msg->s_name, x->arguments[pos]->s_name, x->arglen[pos])==0) {
226 if (strlen(msg->s_name) > x->arglen[pos]) {
228 if (input[x->arglen[pos]] ==
'/') {
229 output = gensym(msg->s_name + x->arglen[pos] +1);
230 outlet_anything(x->outlets[pos], output, argc , argv);
241 outlet_bang(x->outlets[pos]);
249 if (argv->a_type==A_LONG) {
250 outlet_int(x->outlets[pos],argv->a_w.w_long);
254 else if (argv->a_type==A_FLOAT) {
255 outlet_float(x->outlets[pos],argv->a_w.w_float);
259 else if (argv->a_type==A_SYM) {
260 outlet_anything(x->outlets[pos],argv->a_w.w_sym,0,0);
264 outlet_anything(x->outlets[pos], _sym_list, 1, argv);
270 if (argv->a_type==A_SYM) {
271 output = argv->a_w.w_sym;
277 outlet_anything(x->outlets[pos], output, argc , argv);
287 for (
int index=0; index < x->num_args; index++) {
289 if (wc = strstr(x->arguments[index]->s_name,
"*")) {
291 if (*(wc+1) ==
'\0') {
293 if (strncmp(msg->s_name, x->arguments[index]->s_name, x->arglen[index] - 1) == 0) {
296 char *temp = msg->s_name + (x->arglen[index] - 1);
298 char *outMsg = strstr(temp,
"/");
300 output_msg(x, outMsg, index, argc, argv);
303 output_msg(x, NULL, index, argc, argv);
314 while (wc && *(wc) ==
'*') {
319 c += strlen(c) - strlen(wc);
320 if (strncmp(c, wc, strlen(c)) == 0) {
321 output_msg(x, c, index, argc, argv);
330 outlet_anything(x->outlet_overflow, msg, argc , argv);
void oscroute_assist(t_oscroute *x, void *b, long msg, long arg, char *dst)
Provide assistance on input and output while patching.
void oscroute_free(t_oscroute *x)
Object instance destructor, ensures that all memory assigned is properly freed.
void oscroute_float(t_oscroute *x, double f)
Method called when a "float" is passed to the object.
void oscroute_bang(t_oscroute *x)
Method called when a "bang" is passed to the object.
void oscroute_int(t_oscroute *x, long n)
Method called when an "int" is passed to the object.
int JAMOMA_EXPORT_MAXOBJ main(void)
Set up this class as a Max external the first time an object of this kind is instantiated.
j.oscroute - parse and pass OSC messages
t_class * oscroute_class
Required: Global pointer for our class.
void oscroute_list(t_oscroute *x, t_symbol *msg, long argc, t_atom *argv)
Method called when a list is passed to the object.
void oscroute_symbol(t_oscroute *x, t_symbol *msg, long argc, t_atom *argv)
Method called when a symbol is passed to the object.
void * oscroute_new(t_symbol *s, long argc, t_atom *argv)
Object instance constructor.