[PD-cvs] externals/mrpeach/osc packOSC.c,1.1,1.2

Martin Peach mrpeach at users.sourceforge.net
Fri Feb 16 00:07:20 CET 2007


Update of /cvsroot/pure-data/externals/mrpeach/osc
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2583

Modified Files:
	packOSC.c 
Log Message:
Added handler for sendtyped message



Index: packOSC.c
===================================================================
RCS file: /cvsroot/pure-data/externals/mrpeach/osc/packOSC.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** packOSC.c	16 Aug 2006 20:22:22 -0000	1.1
--- packOSC.c	15 Feb 2007 23:07:18 -0000	1.2
***************
*** 203,206 ****
--- 203,207 ----
  	    OSC_writeIntArg()
  	    OSC_writeStringArg()
+         OSC_writeNullArg()
  	  - Now your message is complete; you can send out the buffer or you can
  	    add another message to it.
***************
*** 214,217 ****
--- 215,219 ----
  static int OSC_writeIntArg(OSCbuf *buf, int4byte arg);
  static int OSC_writeStringArg(OSCbuf *buf, char *arg);
+ static int OSC_writeNullArg(OSCbuf *buf, char type);
  
  /* How many bytes will be needed in the OSC format to hold the given
***************
*** 231,235 ****
  } typedArg;
  
- static int useTypeTags = 0;
  static char bufferForOSCbuf[SC_BUFFER_SIZE];
  static t_atom bufferForOSClist[SC_BUFFER_SIZE];
--- 233,236 ----
***************
*** 253,264 ****
  static void packOSC_settypetags(t_packOSC *x, t_float *f);
  static void packOSC_sendtyped(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_free(t_packOSC *x);
- #ifdef MSW
- __declspec(dllexport)
- #endif
  void packOSC_setup(void);
  static typedArg packOSC_parseatom(t_atom *a);
! static int packOSC_writemessage(OSCbuf *buf, char *messageName, int numArgs, typedArg *args);
  static void packOSC_sendbuffer(t_packOSC *x);
  
--- 254,265 ----
  static void packOSC_settypetags(t_packOSC *x, t_float *f);
  static void packOSC_sendtyped(t_packOSC *x, t_symbol *s, int argc, t_atom *argv);
+ 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_free(t_packOSC *x);
  void packOSC_setup(void);
  static typedArg packOSC_parseatom(t_atom *a);
! static typedArg packOSC_forceatom(t_atom *a, char ctype);
! static int packOSC_writetypedmessage(t_packOSC *x, OSCbuf *buf, char *messageName, int numArgs, typedArg *args, char *typeStr);
! static int packOSC_writemessage(t_packOSC *x, OSCbuf *buf, char *messageName, int numArgs, typedArg *args);
  static void packOSC_sendbuffer(t_packOSC *x);
  
***************
*** 315,318 ****
--- 316,320 ----
  
  
+ 
  //////////////////////////////////////////////////////////////////////
  // this is the real and only sending routine now, for both typed and
***************
*** 321,327 ****
  static void packOSC_sendtyped(t_packOSC *x, t_symbol *s, int argc, t_atom *argv)
  {
!     char     messageName[MAXPDSTRING];
!     typedArg args[MAX_ARGS];
!     int      i;
  
      messageName[0] = '\0'; // empty
--- 323,331 ----
  static void packOSC_sendtyped(t_packOSC *x, t_symbol *s, int argc, t_atom *argv)
  {
!     char        messageName[MAXPDSTRING];
!     char        typeStr[MAX_ARGS];
!     typedArg    args[MAX_ARGS];
!     int         i, j, k, nTags, nArgs;
!     char        c;
  
      messageName[0] = '\0'; // empty
***************
*** 333,368 ****
      }
  
! #ifdef DEBUG
!     post ("packOSC: type tags? %d", useTypeTags);
! #endif
! 
!     atom_string(&argv[0], messageName, MAXPDSTRING);
!     for (i = 0; i < argc-1; i++)
!     {
!         args[i] = packOSC_parseatom(&argv[i+1]);
! #ifdef DEBUG
!         switch (args[i].type)
          {
!             case INT_osc:
!                 post("packOSC: cell-cont: %d\n", args[i].datum.i);
!                 break;
!             case FLOAT_osc:
!                 post("packOSC: cell-cont: %f\n", args[i].datum.f);
!                 break;
!             case STRING_osc:
!                 post("packOSC: cell-cont: %s\n", args[i].datum.s);
!                 break;
!             case NOTYPE_osc:
!                 post("packOSC: unknown type\n");
!                 break;
          }
-         post("packOSC:   type-id: %d\n", args[i].type);
- #endif
      }
! 
!     if(packOSC_writemessage(x->x_oscbuf, messageName, i, args))
      {
!         post("packOSC: usage error, write-msg failed.");
!         return;
      }
  
--- 337,401 ----
      }
  
!     atom_string(&argv[0], messageName, MAXPDSTRING); /* the OSC address string */
!     if (x->x_typetags & 2)
!     { /* first arg is typestring */
!         typeStr[0] = ',';
!         atom_string(&argv[1], &typeStr[1], MAXPDSTRING);
!         nArgs = argc-2;
!         for (i = nTags = 0; i < MAX_ARGS; ++i)
          {
!             if (typeStr[i+1] == 0) break;
!             if (!(typeStr[i+1] == 'T' || typeStr[i+1] == 'F' || typeStr[i+1] == 'N' || typeStr[i+1] == 'I'))
!                 ++nTags; /* these tags have data */
!         }
!         if (nTags != nArgs)
!         {
!             post("packOSC: Tags count %d doesn't match argument count %d", nTags, nArgs);
!             return;
!         }
!         for (j = k = 0; j < i; ++j) /* i is the number of tags */
!         {
!             c = typeStr[j+1];
!             if (!(c == 'T' || c == 'F' || c == 'N' || c == 'I')) /* not no data */
!             {
!                 args[k] = packOSC_forceatom(&argv[k+2], c);
!                 ++k;
!             }
!         }
!         if(packOSC_writetypedmessage(x, x->x_oscbuf, messageName, nArgs, args, typeStr))
!         {
!             post("packOSC: usage error, write-msg failed.");
!             return;
          }
      }
!     else
      {
!         for (i = 0; i < argc-1; i++)
!         {
!             args[i] = packOSC_parseatom(&argv[i+1]);
! #ifdef DEBUG
!             switch (args[i].type)
!             {
!                 case INT_osc:
!                     post("packOSC: cell-cont: %d\n", args[i].datum.i);
!                     break;
!                 case FLOAT_osc:
!                     post("packOSC: cell-cont: %f\n", args[i].datum.f);
!                     break;
!                 case STRING_osc:
!                     post("packOSC: cell-cont: %s\n", args[i].datum.s);
!                     break;
!                 case NOTYPE_osc:
!                     post("packOSC: unknown type\n");
!                     break;
!             }
!             post("packOSC:   type-id: %d\n", args[i].type);
! #endif
!         }
!         if(packOSC_writemessage(x, x->x_oscbuf, messageName, i, args))
!         {
!             post("packOSC: usage error, write-msg failed.");
!             return;
!         }
      }
  
***************
*** 374,377 ****
--- 407,417 ----
  }
  
+ static void packOSC_send_type_forced(t_packOSC *x, t_symbol *s, int argc, t_atom *argv)
+ { /* typetags are the argument following the OSC path */
+     x->x_typetags |= 2;/* tell packOSC_sendtyped to use the specified typetags... */
+     packOSC_sendtyped(x, s, argc, argv);
+     x->x_typetags &= ~2;/* ...this time only */
+ }
+ 
  static void packOSC_send(t_packOSC *x, t_symbol *s, int argc, t_atom *argv)
  {
***************
*** 381,394 ****
          return;
      }
!     if(x->x_typetags)
!     {
!         useTypeTags = 1;
!         packOSC_sendtyped(x, s, argc, argv);
!         useTypeTags = 0;
!     }
!     else
!     {
!         packOSC_sendtyped(x, s, argc, argv);
!     }
  }
  
--- 421,425 ----
          return;
      }
!     packOSC_sendtyped(x, s, argc, argv);
  }
  
***************
*** 397,403 ****
  }
  
- #ifdef MSW
- __declspec(dllexport)
- #endif
  void packOSC_setup(void)
  { 
--- 428,431 ----
***************
*** 411,415 ****
      class_addmethod(packOSC_class, (t_method)packOSC_send,
          gensym("senduntyped"), A_GIMME, 0);
!     class_addmethod(packOSC_class, (t_method)packOSC_send,
          gensym("sendtyped"), A_GIMME, 0);
      class_addmethod(packOSC_class, (t_method)packOSC_openbundle,
--- 439,443 ----
      class_addmethod(packOSC_class, (t_method)packOSC_send,
          gensym("senduntyped"), A_GIMME, 0);
!     class_addmethod(packOSC_class, (t_method)packOSC_send_type_forced,
          gensym("sendtyped"), A_GIMME, 0);
      class_addmethod(packOSC_class, (t_method)packOSC_openbundle,
***************
*** 462,494 ****
  }
  
! static int packOSC_writemessage(OSCbuf *buf, char *messageName, int numArgs, typedArg *args)
! {
!     int j, returnVal;
! 
!     returnVal = 0;
  #ifdef DEBUG
!     post("packOSC: packOSC_writemessage: %s ", messageName);
  
!     for (j = 0; j < numArgs; j++)
      {
          switch (args[j].type)
          {
              case INT_osc:
!                 post("packOSC: %d ", args[j].datum.i);
                  break;
              case FLOAT_osc:
!                 post("packOSC: %f ", args[j].datum.f);
                  break;
              case STRING_osc:
!                 post("packOSC: %s ", args[j].datum.s);
                  break;
              default:
!                 post("packOSC: Unrecognized arg type %d", args[j].type);
!                 break;
          }
      }
! #endif
  
!     if (!useTypeTags)
      {
          returnVal = OSC_writeAddress(buf, messageName);
--- 490,639 ----
  }
  
! static typedArg packOSC_forceatom(t_atom *a, char ctype)
! { /* ctype is one of i,f,s,T,F,N,I*/
!     typedArg    returnVal;
!     t_float     f;
!     t_int       i;
!     t_symbol    s;
!     static char buf[MAXPDSTRING];
!   
  #ifdef DEBUG
!     atom_string(a, buf, MAXPDSTRING);
!     post("packOSC: atom type %d (%s)", a->a_type, buf);
! #endif
!     /* the atom might be a float, or a symbol */
!     switch (a->a_type)
!     {
!         case A_FLOAT:
!             switch (ctype)
!             {
!                 case 'i':
!                     returnVal.type = INT_osc;
!                     returnVal.datum.i = atom_getint(a);
! #ifdef DEBUG
!                     post("packOSC_forceatom: float to integer %d", returnVal.datum.i);
! #endif
!                     break;
!                 case 'f':
!                     returnVal.type = FLOAT_osc;
!                     returnVal.datum.f = atom_getfloat(a);
! #ifdef DEBUG
!                     post("packOSC_forceatom: float to float %f", returnVal.datum.f);
! #endif
!                     break;
!                 case 's':
!                     f = atom_getfloat(a);
!                     sprintf(buf, "%f", f);
!                     returnVal.type = STRING_osc;
!                     returnVal.datum.s = buf;
! #ifdef DEBUG
!                     post("packOSC_forceatom: float to string %s", returnVal.datum.s);
! #endif
!                     break;
!                 default:
!                     post("packOSC: unknown OSC type %c", ctype);
!                     returnVal.type = NOTYPE_osc;
!                     returnVal.datum.s = NULL;
!                     break;
!             }
!             break;
!         case A_SYMBOL:
!             s = *atom_getsymbol(a);
!             switch (ctype)
!             {
!                 case 'i':
!                     i = atoi(s.s_name);
!                     returnVal.type = INT_osc;
!                     returnVal.datum.i = i;
! #ifdef DEBUG
!                     post("packOSC_forceatom: symbol to integer %d", returnVal.datum.i);
! #endif
!                     break;
!                 case 'f':
!                     f = atof(s.s_name);
!                     returnVal.type = FLOAT_osc;
!                     returnVal.datum.f = f;
! #ifdef DEBUG
!                     post("packOSC_forceatom: symbol to float %f", returnVal.datum.f);
! #endif
!                     break;
!                 case 's':
!                     returnVal.type = STRING_osc;
!                     returnVal.datum.s = s.s_name;
! #ifdef DEBUG
!                     post("packOSC_forceatom: symbol to string %s", returnVal.datum.s);
! #endif
!                     break;
!                 default:
!                     post("packOSC: unknown OSC type %c", ctype);
!                     returnVal.type = NOTYPE_osc;
!                     returnVal.datum.s = NULL;
!                     break;
!             }
!             break;
!         default:
!             atom_string(a, buf, MAXPDSTRING);
!             error("packOSC: atom type %d not implemented (%s)", a->a_type, buf);
!             returnVal.type = NOTYPE_osc;
!             returnVal.datum.s = NULL;
!             break;
!     }
!     return returnVal;
! }
  
! static int packOSC_writetypedmessage(t_packOSC *x, OSCbuf *buf, char *messageName, int numArgs, typedArg *args, char *typeStr)
! {
!     int i, j, returnVal = OSC_writeAddressAndTypes(buf, messageName, typeStr);
! 
!     if (returnVal)
      {
+         post("packOSC: Problem writing address.");
+         return returnVal;
+     }
+     for (j = i = 0; (typeStr[i+1]!= 0) || (j < numArgs); j++, i++)
+     {
+         while (typeStr[i+1] == 'T' || typeStr[i+1] == 'F' || typeStr[i+1] == 'I' || typeStr[i+1] == 'N')
+         {
+ #ifdef DEBUG
+             post("packOSC_writetypedmessage: NULL [%c]", typeStr[i+1]);
+ #endif
+             returnVal = OSC_writeNullArg(buf, typeStr[i+1]);
+             ++i;
+         }
          switch (args[j].type)
          {
              case INT_osc:
! #ifdef DEBUG
!                 post("packOSC_writetypedmessage: int [%d]", args[j].datum.i);
! #endif
!                 returnVal = OSC_writeIntArg(buf, args[j].datum.i);
                  break;
              case FLOAT_osc:
! #ifdef DEBUG
!                 post("packOSC_writetypedmessage: float [%f]", args[j].datum.f);
! #endif
!                 returnVal = OSC_writeFloatArg(buf, args[j].datum.f);
                  break;
              case STRING_osc:
! #ifdef DEBUG
!                 post("packOSC_writetypedmessage: string [%s]", args[j].datum.s);
! #endif
!                 returnVal = OSC_writeStringArg(buf, args[j].datum.s);
                  break;
              default:
! 
!                 break; /* types with no data */
          }
      }
!     return returnVal;
! }
  
! static int packOSC_writemessage(t_packOSC *x, OSCbuf *buf, char *messageName, int numArgs, typedArg *args)
! {
!     int j, returnVal;
! 
!     returnVal = 0;
! 
!     if (!x->x_typetags)
      {
          returnVal = OSC_writeAddress(buf, messageName);
***************
*** 504,508 ****
  
          typeTags[0] = ',';
-     
          for (j = 0; j < numArgs; ++j)
          {
--- 649,652 ----
***************
*** 530,534 ****
          }
      }
- 
      for (j = 0; j < numArgs; j++)
      {
--- 674,677 ----
***************
*** 536,555 ****
          {
              case INT_osc:
!                 if ((returnVal = OSC_writeIntArg(buf, args[j].datum.i)) != 0)
!                 {
!                     return returnVal;
!                 }
                  break;
              case FLOAT_osc:
!                 if ((returnVal = OSC_writeFloatArg(buf, args[j].datum.f)) != 0)
!                 {
!                     return returnVal;
!                 }
                  break;
              case STRING_osc:
!                 if ((returnVal = OSC_writeStringArg(buf, args[j].datum.s)) != 0)
!                 {
!                     return returnVal;
!                 }
                  break;
              default:
--- 679,689 ----
          {
              case INT_osc:
!                 returnVal = OSC_writeIntArg(buf, args[j].datum.i);
                  break;
              case FLOAT_osc:
!                 returnVal = OSC_writeFloatArg(buf, args[j].datum.f);
                  break;
              case STRING_osc:
!                 returnVal = OSC_writeStringArg(buf, args[j].datum.s);
                  break;
              default:
***************
*** 562,568 ****
  static void packOSC_sendbuffer(t_packOSC *x)
  {
!     int  i;
!     int  length;
!     char *buf;
  #ifdef DEBUG
      post("packOSC_sendbuffer: Sending buffer...\n");
--- 696,703 ----
  static void packOSC_sendbuffer(t_packOSC *x)
  {
!     int             i;
!     int             length;
!     unsigned char   *buf;
! 
  #ifdef DEBUG
      post("packOSC_sendbuffer: Sending buffer...\n");
***************
*** 586,590 ****
      for (i = 0; i < length; ++i) SETFLOAT(&x->x_osclist[i], buf[i]);
      /* send the list out the outlet */
!         outlet_list(x->x_listout, &s_list, length, x->x_osclist);
  }
  
--- 721,725 ----
      for (i = 0; i < length; ++i) SETFLOAT(&x->x_osclist[i], buf[i]);
      /* send the list out the outlet */
!     outlet_list(x->x_listout, &s_list, length, x->x_osclist);
  }
  
***************
*** 930,933 ****
--- 1065,1076 ----
  }
  
+ static int OSC_writeNullArg(OSCbuf *buf, char type)
+ { /* Don't write any data, just check the type tag */
+     if(OSC_CheckOverflow(buf, 4))return 1;
+     if (CheckTypeTag(buf, type)) return 9;
+     buf->gettingFirstUntypedArg = 0;
+     return 0;
+ }
+ 
  /* String utilities */
  





More information about the Pd-cvs mailing list