Update of /cvsroot/pure-data/externals/mrpeach/osc In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21813
Modified Files: packOSC.c Log Message: Implemented IOhannes' prefix and anything methods.
Index: packOSC.c =================================================================== RCS file: /cvsroot/pure-data/externals/mrpeach/osc/packOSC.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** packOSC.c 4 Jun 2007 21:18:24 -0000 1.4 --- packOSC.c 20 Jun 2007 20:28:05 -0000 1.5 *************** *** 3,6 **** --- 3,7 ---- /* Started by Martin Peach 20060403 */ /* 20060425 version independent of libOSC */ + /* 20070620 added packOSC_path and packOSC_anything methods by zmoelnig */ /* packOSC.c makes extensive use of code from OSC-client.c and sendOSC.c */ /* as well as some from OSC-timetag.c. These files have the following header: */ *************** *** 246,252 **** --- 247,255 ---- char *x_bufferForOSCbuf; /*[SC_BUFFER_SIZE];*/ t_atom *x_bufferForOSClist; /*[SC_BUFFER_SIZE];*/ + char *x_prefix; } t_packOSC;
static void *packOSC_new(t_floatarg udpflag); + static void packOSC_path(t_packOSC *x, t_symbol*s); static void packOSC_openbundle(t_packOSC *x); static void packOSC_closebundle(t_packOSC *x); *************** *** 256,259 **** --- 259,263 ---- static void packOSC_send_type_forced(t_packOSC *x, t_symbol *s, int argc, t_atom *argv); static void packOSC_send(t_packOSC *x, t_symbol *s, int argc, t_atom *argv); + static void packOSC_anything(t_packOSC *x, t_symbol *s, int argc, t_atom *argv); static void packOSC_free(t_packOSC *x); void packOSC_setup(void); *************** *** 283,286 **** --- 287,305 ---- }
+ static void packOSC_path(t_packOSC *x, t_symbol*s) + { + /* Set a default prefix to the OSC path */ + if(s == gensym("")) + { + x->x_prefix = 0; + return; + } + if ((*s->s_name) != '/') + { + pd_error(x, "packOSC: bad path: '%s'", s->s_name); + return; + } + x->x_prefix = s->s_name; + }
static void packOSC_openbundle(t_packOSC *x) *************** *** 357,362 **** } messageName[0] = '\0'; /* empty */
- atom_string(&argv[0], messageName, MAXPDSTRING); /* the OSC address string */ if (x->x_typetags & 2) { /* second arg is typestring */ --- 376,391 ---- } messageName[0] = '\0'; /* empty */ + if(x->x_prefix) /* if there is a prefix, prefix it to the path */ + { + size_t len = strlen(x->x_prefix); + if(len >= MAXPDSTRING) + len = MAXPDSTRING-1; + + strncpy(messageName, x->x_prefix, MAXPDSTRING); + atom_string(&argv[0], messageName+len, MAXPDSTRING-len); + } + else + atom_string(&argv[0], messageName, MAXPDSTRING); /* the OSC address string */
if (x->x_typetags & 2) { /* second arg is typestring */ *************** *** 464,467 **** --- 493,517 ---- }
+ static void packOSC_anything(t_packOSC *x, t_symbol *s, int argc, t_atom *argv) + { + /* If the message starts with '/', assume it's an OSC path and send it */ + t_atom*ap = 0; + + if ((*s->s_name)!='/') + { + pd_error(x, "packOSC: bad path: '%s'", s->s_name); + return; + } + + ap = (t_atom*)getbytes((argc+1)*sizeof(t_atom)); + SETSYMBOL(ap, s); + memcpy(ap+1, argv, argc * sizeof(t_atom)); + + packOSC_send(x, gensym("send"), argc+1, ap); + + freebytes(ap, (argc+1)*sizeof(t_atom)); + + } + static void packOSC_free(t_packOSC *x) { *************** *** 475,478 **** --- 525,530 ---- (t_method)packOSC_free, sizeof(t_packOSC), 0, A_DEFFLOAT, 0); + class_addmethod(packOSC_class, (t_method)packOSC_path, + gensym("prefix"), A_DEFSYM, 0); class_addmethod(packOSC_class, (t_method)packOSC_settypetags, gensym("typetags"), A_DEFFLOAT, 0); *************** *** 489,492 **** --- 541,545 ---- class_addmethod(packOSC_class, (t_method)packOSC_closebundle, gensym("]"), 0, 0); + class_addanything(packOSC_class, (t_method)packOSC_anything); }