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; }
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); }
// 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); }