示例#1
0
void* SC_UdpCustomInPort::Run()
{
	OSC_Packet *packet = 0;

	const int fd = mSocket;
	const int max_fd = fd+1;

	mRunning.store(true);
	while (mRunning.load(boost::memory_order_consume)) {
		fd_set rfds;

		FD_ZERO(   &rfds);
		FD_SET(fd, &rfds);

		struct timeval timeout;
		timeout.tv_sec = 0;
		timeout.tv_usec = 500000;

		int n = select(max_fd, &rfds, 0, 0, &timeout);
		if ((n > 0) && FD_ISSET(fd, &rfds)) {
			if (!packet) {
				packet = (OSC_Packet*)malloc(sizeof(OSC_Packet));
			}
			packet->mReplyAddr.mSockAddrLen = sizeof(sockaddr_in);
			int size = recvfrom(mSocket, buf, kTextBufSize , 0,
								(struct sockaddr *) &packet->mReplyAddr.mSockAddr, (socklen_t*)&packet->mReplyAddr.mSockAddrLen);

			if (size > 0 && mRunning.load(boost::memory_order_consume)) {
				//dumpOSC(3, size, buf);
				//fflush(stdout);

				char *data = (char*)malloc(size);
				packet->mReplyAddr.mReplyFunc = udp_reply_func;
				packet->mSize = size;
				packet->mData = data;
				packet->mReplyAddr.mSocket = mSocket;
				memcpy(data, buf, size);
				ProcessOSCPacket(packet, mPortNum);
				packet = 0;
			}
		}
	}
	FreeOSCPacket(packet); // just in case
	return 0;
}
示例#2
0
void ProcessOSCPacket(OSC_Packet* inPacket)
{
    //post("recv '%s' %d\n", inPacket->mData, inPacket->mSize);
	inPacket->mIsBundle = IsBundle(inPacket->mData);

    pthread_mutex_lock (&gLangMutex);
	if (compiledOK) {
		PyrObject *replyObj = ConvertReplyAddress(&inPacket->mReplyAddr);
		if (compiledOK) {
			if (inPacket->mIsBundle) {
				PerformOSCBundle(inPacket->mSize, inPacket->mData, replyObj);
			} else {
				PerformOSCMessage(inPacket->mSize, inPacket->mData, replyObj);
			}
		}
	}
    pthread_mutex_unlock (&gLangMutex);

    FreeOSCPacket(inPacket);
}
示例#3
0
// takes ownership of inPacket
void ProcessOSCPacket(OSC_Packet* inPacket, int inPortNum)
{
	//post("recv '%s' %d\n", inPacket->mData, inPacket->mSize);
	inPacket->mIsBundle = IsBundle(inPacket->mData);

	gLangMutex.lock();
	if (compiledOK) {
		PyrObject *replyObj = ConvertReplyAddress(&inPacket->mReplyAddr);
		if (compiledOK) {
			if (inPacket->mIsBundle) {
				PerformOSCBundle(inPacket->mSize, inPacket->mData, replyObj, inPortNum);
			} else {
				PerformOSCMessage(inPacket->mSize, inPacket->mData, replyObj, inPortNum);
			}
		}
	}
	gLangMutex.unlock();

	FreeOSCPacket(inPacket);
}