Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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;
	}
}
Ejemplo n.º 4
0
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);
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
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;
}