213 lines
7.2 KiB
C
213 lines
7.2 KiB
C
#include <config.h>
|
|
|
|
#if !defined(IPHONE) && !defined(_ANDROID) && !defined(GLES2) && !defined(AQUA)
|
|
|
|
/* DJTRACK_OSCSENSORS */
|
|
|
|
typedef int (*functions)(const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) ;
|
|
|
|
int nullOSC_handler(const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) ;
|
|
int defaultOSC_handler(const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) ;
|
|
|
|
int nullOSC_handler(const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data)
|
|
{
|
|
struct X3D_OSC_Sensor *realnode ;
|
|
realnode = (struct X3D_OSC_Sensor *) user_data ;
|
|
|
|
printf("nullOSC_handler (%s,%d) : description='%s'\n",__FILE__,__LINE__, realnode->description->strptr) ;
|
|
printf("nullOSC_handler (%s,%d) : filter=%s\n",__FILE__,__LINE__, realnode->filter->strptr) ;
|
|
printf("nullOSC_handler (%s,%d) : listenfor=%s\n",__FILE__,__LINE__, realnode->listenfor->strptr);
|
|
|
|
printf("%s (%d,%s) <-", path, argc,types);
|
|
int i ;
|
|
for (i=0 ; i < argc ; i++) {
|
|
switch (types[i]) {
|
|
case 'f':
|
|
printf(" %c:%f", types[i], argv[i]->f) ;
|
|
break;
|
|
case 'i':
|
|
printf(" %c:%d", types[i], argv[i]->i) ;
|
|
break;
|
|
default:
|
|
printf(" %c:??", types[i]) ;
|
|
break;
|
|
}
|
|
}
|
|
printf("\n\n") ;
|
|
fflush(stdout);
|
|
|
|
return 0;
|
|
}
|
|
int defaultOSC_handler(const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data)
|
|
{
|
|
struct X3D_OSC_Sensor *realnode ;
|
|
realnode = (struct X3D_OSC_Sensor *) user_data ;
|
|
|
|
int willOverflow = 0;
|
|
int freeCount;
|
|
int iFltCount;
|
|
int iIntCount;
|
|
int iStrCount;
|
|
int iBlobCount;
|
|
int iMidiCount;
|
|
int iOtherCount;
|
|
/* Get the incoming counts */
|
|
utilOSCcounts((char*) types,&iIntCount,&iFltCount,&iStrCount,&iBlobCount,&iMidiCount,&iOtherCount);
|
|
|
|
/*
|
|
* If we have FIFOs operative, then use them...
|
|
* We need to do an atomic transaction, ie do not push
|
|
* any values unless there is space for all the values.
|
|
*/
|
|
if (realnode->FIFOsize > 0) {
|
|
freeCount = RingBuffer_freeLen(realnode->_floatInpFIFO) ;
|
|
if (iFltCount > freeCount) {willOverflow++;}
|
|
|
|
freeCount = RingBuffer_freeLen(realnode->_int32InpFIFO ) ;
|
|
if ((iIntCount+iMidiCount) > freeCount) {willOverflow++;}
|
|
|
|
freeCount = RingBuffer_freeLen(realnode->_stringInpFIFO) ;
|
|
if ((iStrCount+iBlobCount+iOtherCount) > freeCount) {willOverflow++;}
|
|
}
|
|
|
|
/*
|
|
printf("defaultOSC_handler : description='%s'\n", realnode->description->strptr) ;
|
|
printf("defaultOSC_handler : filter=%s\n", realnode->filter->strptr) ;
|
|
printf("defaultOSC_handler : listenfor=%s (got %s)\n", realnode->listenfor->strptr,types);
|
|
printf("defaultOSC_handler : enabled=%d\n", realnode->enabled);
|
|
printf("defaultOSC_handler : gotEvents=%d\n", realnode->gotEvents);
|
|
printf("defaultOSC_handler : FIFOsize=%d\n", realnode->FIFOsize);
|
|
printf("defaultOSC_handler : _status=%d\n", realnode->_status);
|
|
*/
|
|
|
|
/*
|
|
printf("defaultOSC_handler int _renderFlags=%d\n", realnode->_renderFlags);
|
|
printf("defaultOSC_handler int _hit=%d\n", realnode->_hit);
|
|
printf("defaultOSC_handler int _change=%d\n", realnode->_change);
|
|
printf("defaultOSC_handler int _nparents=%d\n", realnode->_nparents);
|
|
printf("defaultOSC_handler int _nparalloc=%d\n", realnode->_nparalloc);
|
|
printf("defaultOSC_handler int _ichange=%d\n", realnode->_ichange);
|
|
printf("defaultOSC_handler int _nodeType=%d\n", realnode->_nodeType);
|
|
printf("defaultOSC_handler int referenceCount=%d\n", realnode->referenceCount);
|
|
printf("defaultOSC_handler int _defaultContainer=%d\n", realnode->_defaultContainer);
|
|
*/
|
|
|
|
/*
|
|
printf("defaultOSC_handler struct Multi_Float _floatInpFIFO;
|
|
printf("defaultOSC_handler struct Multi_Float _floatOutFIFO;
|
|
printf("defaultOSC_handler struct Multi_Int32 _int32InpFIFO;
|
|
printf("defaultOSC_handler struct Multi_Int32 _int32OutFIFO;
|
|
printf("defaultOSC_handler struct Multi_Node _nodeInpFIFO;
|
|
printf("defaultOSC_handler struct Multi_Node _nodeOutFIFO;
|
|
printf("defaultOSC_handler struct Multi_String _stringInpFIFO;
|
|
printf("defaultOSC_handler struct Multi_String _stringOutFIFO;
|
|
*/
|
|
if (willOverflow > 0) {
|
|
printf("defaultOSC_handler would overflow in %s,%d\n", __FILE__,__LINE__);
|
|
} else {
|
|
/* stringInp */
|
|
#if TRACK_OSC_MSG
|
|
printf("%s (%d,%s) <-", path, argc,types);
|
|
#endif
|
|
int i ;
|
|
int pushBuffError = 0 ;
|
|
for (i=0 ; i < argc ; i++) {
|
|
switch (types[i]) {
|
|
case 'f':
|
|
#if TRACK_OSC_MSG
|
|
printf(" %c:%f", types[i], argv[i]->f) ;
|
|
#endif
|
|
realnode->floatInp = (argv[i]->f) ;
|
|
if (realnode->FIFOsize > 0) {
|
|
#if TRACK_OSC_MSG
|
|
printf("_floatInpFIFO = %p\n",realnode->_floatInpFIFO) ;
|
|
#endif
|
|
pushBuffError = RingBuffer_pushFloat(realnode->_floatInpFIFO, argv[i]->f) ;
|
|
}
|
|
break;
|
|
case 'i':
|
|
#if TRACK_OSC_MSG
|
|
printf(" %c:%d", types[i], argv[i]->i) ;
|
|
#endif
|
|
realnode->int32Inp = (argv[i]->i) ;
|
|
if (realnode->FIFOsize > 0) {
|
|
#if TRACK_OSC_MSG
|
|
printf("_int32InpFIFO = %p\n",realnode->_int32InpFIFO) ;
|
|
#endif
|
|
pushBuffError = RingBuffer_pushInt(realnode->_int32InpFIFO, argv[i]->i) ;
|
|
}
|
|
break;
|
|
case 's':
|
|
#if TRACK_OSC_MSG
|
|
printf(" %c:%s", types[i], (char *)argv[i]) ;
|
|
#endif
|
|
if (realnode->stringInp != NULL) {free(realnode->stringInp);}
|
|
realnode->stringInp = newASCIIString((char *)argv[i]);
|
|
if (realnode->FIFOsize > 0) {
|
|
#if TRACK_OSC_MSG
|
|
printf("_stringInpFIFO = %p\n",realnode->_stringInpFIFO) ;
|
|
#endif
|
|
pushBuffError = RingBuffer_pushPointer(realnode->_stringInpFIFO, (newASCIIString((char *)argv[i]))->strptr);
|
|
}
|
|
break;
|
|
default:
|
|
printf(" %c:??", types[i]) ;
|
|
lo_arg_pp(types[i], argv[i]);
|
|
break;
|
|
}
|
|
#if TRACK_OSC_MSG
|
|
printf(" ");
|
|
#endif
|
|
}
|
|
#if TRACK_OSC_MSG
|
|
printf("\n\n") ;
|
|
#endif
|
|
fflush(stdout);
|
|
|
|
if (realnode->enabled) {
|
|
realnode->gotEvents += 1;
|
|
MARK_EVENT (X3D_NODE(realnode), offsetof(struct X3D_OSC_Sensor, gotEvents));
|
|
}
|
|
}
|
|
#if TRACK_OSC_MSG
|
|
printf("\n");
|
|
printf("defaultOSC_handler : description='%s'\n", realnode->description->strptr) ;
|
|
printf("defaultOSC_handler : int32Inp=%d\n", realnode->int32Inp);
|
|
printf("defaultOSC_handler : floatInp=%f\n", realnode->floatInp);
|
|
printf("defaultOSC_handler : stringInp=%s\n", realnode->stringInp->strptr);
|
|
printf("\n");
|
|
|
|
if (realnode->FIFOsize > 0) {
|
|
int qLen , iTemp ;
|
|
float fTemp ;
|
|
char * sTemp ;
|
|
|
|
qLen = RingBuffer_qLen(realnode->_floatInpFIFO) ;
|
|
if (qLen > 0) {
|
|
fTemp = RingBuffer_peekUnion(realnode->_floatInpFIFO)->f ;
|
|
printf("%d : float length=%d , head=%f\n",__LINE__,qLen,fTemp);
|
|
}
|
|
|
|
qLen = RingBuffer_qLen(realnode->_int32InpFIFO) ;
|
|
if (qLen > 0) {
|
|
iTemp = RingBuffer_peekUnion(realnode->_int32InpFIFO)->i ;
|
|
printf("%d : int length=%d , head=%d\n",__LINE__,qLen,iTemp);
|
|
}
|
|
|
|
qLen = RingBuffer_qLen(realnode->_stringInpFIFO) ;
|
|
if (qLen > 0) {
|
|
sTemp = (char *)RingBuffer_peekUnion(realnode->_stringInpFIFO)->p ;
|
|
printf("%d : string length=%d , head=%s\n",__LINE__,qLen,sTemp);
|
|
}
|
|
}
|
|
printf("\n");
|
|
#endif
|
|
|
|
return 0; /* Tell OSC we have swallowed the packet and that it should NOT try any other handlers */
|
|
}
|
|
|
|
#define OSCfuncCount 2
|
|
functions OSCcallbacks[OSCfuncCount] = {nullOSC_handler,defaultOSC_handler};
|
|
char *OSCfuncNames[OSCfuncCount] = { "", "default" };
|
|
|
|
#endif /* IPHONE */
|