bool nextOSCPacket(FILE *file, OSC_Packet *packet, int64& outTime) { int32 msglen; if (fread(&msglen, 1, sizeof(int32), file) != sizeof(int32)) return true; // msglen is in network byte order msglen = OSCint((char*)&msglen); if (msglen > 1073741824){ throw std::runtime_error("OSC packet too long. > 2^30 bytes\n"); } packet->mData = (char *)realloc((void *)packet->mData, (size_t)msglen); if(!packet->mData) throw std::runtime_error("nextOSCPacket: realloc failed...\n"); size_t read = fread(packet->mData, 1, msglen, file); if (read != msglen) throw std::runtime_error("nextOSCPacket: invalid read of OSC packet\n"); if (strcmp(packet->mData, "#bundle")!=0) throw std::runtime_error("OSC packet not a bundle\n"); packet->mSize = msglen; outTime = OSCtime(packet->mData+8); return false; }
void PerformOSCBundle(int inSize, char* inData, PyrObject *replyObj) { // convert all data to arrays int64 oscTime = OSCtime(inData + 8); double seconds = OSCToElapsedTime(oscTime); VMGlobals *g = gMainVMGlobals; ++g->sp; SetObject(g->sp, g->process); ++g->sp; SetFloat(g->sp, seconds); ++g->sp; SetObject(g->sp, replyObj); PyrSlot *stackBase = g->sp; char *data = inData + 16; char* dataEnd = inData + inSize; while (data < dataEnd) { int32 msgSize = OSCint(data); data += sizeof(int32); PyrObject *arrayObj = ConvertOSCMessage(msgSize, data); ++g->sp; SetObject(g->sp, arrayObj); data += msgSize; } int numMsgs = g->sp - stackBase; runInterpreter(g, s_recvoscbndl, 3+numMsgs); }
void PerformOSCBundle(int inSize, char* inData, PyrObject *replyObj, int inPortNum) { // convert all data to arrays int64 oscTime = OSCtime(inData + 8); double seconds = OSCToElapsedTime(oscTime); VMGlobals *g = gMainVMGlobals; char *data = inData + 16; char* dataEnd = inData + inSize; while (data < dataEnd) { int32 msgSize = OSCint(data); data += sizeof(int32); if (IsBundle(data)) { PerformOSCBundle(msgSize, data, replyObj, inPortNum); } else // is a message { ++g->sp; SetObject(g->sp, g->process); ++g->sp; SetFloat(g->sp, seconds); ++g->sp; SetObject(g->sp, replyObj); ++g->sp; SetInt(g->sp, inPortNum); PyrObject *arrayObj = ConvertOSCMessage(msgSize, data); ++g->sp; SetObject(g->sp, arrayObj); runInterpreter(g, s_recvoscmsg, 5); } data += msgSize; } }
void dumpOSC(int mode, int size, char* inData) { if (mode & 1) { if (strcmp(inData, "#bundle") == 0) { char* data = inData + 8; printf("[ \"#bundle\", %lld, ", OSCtime(data)); data += 8; char* dataEnd = inData + size; while (data < dataEnd) { int32 msgSize = OSCint(data); data += sizeof(int32); printf("\n "); dumpOSCmsg(msgSize, data); data += msgSize; if (data < dataEnd) printf(","); } printf("\n]\n"); } else { dumpOSCmsg(size, inData); printf("\n"); } } if (mode & 2) hexdump(size, inData); }
static bool dumpOSCbndl(int indent, int size, char *inData) { char* data = inData + 8; char* dataEnd = inData + size; scprintf("[ \"#bundle\", %" PRIu64 ", ", OSCtime(data)); data += 8; while (data < dataEnd) { int contentPrinted; int32 msgSize = OSCint(data); data += sizeof(int32); scprintf("\n"); for (int i=0; i<indent+1; i++) scprintf(" "); if (!strcmp(data, "#bundle")) contentPrinted = dumpOSCbndl(indent+1, msgSize, data); else contentPrinted = dumpOSCmsg(msgSize, data, true); data += msgSize; if ( (data < dataEnd) && contentPrinted) scprintf(","); } scprintf("\n"); for (int i=0; i<indent; i++) scprintf(" "); scprintf("]"); return true; }
bool nextOSCPacket(FILE *file, OSC_Packet *packet, int64& outTime) { int32 msglen; if (!fread(&msglen, 1, sizeof(int32), file)) return true; // msglen is in network byte order msglen = OSCint((char*)&msglen); if (msglen > 8192) throw std::runtime_error("OSC packet too long. > 8192 bytes\n"); fread(packet->mData, 1, msglen, file); if (strcmp(packet->mData, "#bundle")!=0) throw std::runtime_error("OSC packet not a bundle\n"); packet->mSize = msglen; outTime = OSCtime(packet->mData+8); return false; }