Index: /jack2/branches/libjacknet/common/JackNetInterface.cpp =================================================================== --- /jack2/branches/libjacknet/common/JackNetInterface.cpp (revision 3932) +++ /jack2/branches/libjacknet/common/JackNetInterface.cpp (revision 3934) @@ -26,4 +26,5 @@ #define PACKET_AVAILABLE_SIZE (fParams.fMtu - sizeof(packet_header_t)) +#define HEADER_SIZE (sizeof(packet_header_t)) /* @@ -310,6 +311,6 @@ //audio netbuffer length - fAudioTxLen = sizeof ( packet_header_t ) + fNetAudioCaptureBuffer->GetSize(); - fAudioRxLen = sizeof ( packet_header_t ) + fNetAudioPlaybackBuffer->GetSize(); + fAudioTxLen = HEADER_SIZE + fNetAudioCaptureBuffer->GetSize(); + fAudioRxLen = HEADER_SIZE + fNetAudioPlaybackBuffer->GetSize(); } @@ -341,14 +342,13 @@ { int rx_bytes; - if ( ( ( rx_bytes = fSocket.Recv ( fRxBuffer, size, flags ) ) == SOCKET_ERROR ) && fRunning ) - { + + if ((( rx_bytes = fSocket.Recv(fRxBuffer, size, flags)) == SOCKET_ERROR) && fRunning) { net_error_t error = fSocket.GetError(); //no data isn't really a network error, so just return 0 avalaible read bytes - if ( error == NET_NO_DATA ) + if (error == NET_NO_DATA) { return 0; - else if ( error == NET_CONN_ERROR ) - { + } else if (error == NET_CONN_ERROR) { //fatal connection issue, exit - jack_error ( "'%s' : %s, exiting.", fParams.fName, StrError ( NET_ERROR_CODE ) ); + jack_error ( "'%s' : %s, exiting.", fParams.fName, StrError(NET_ERROR_CODE)); //ask to the manager to properly remove the master Exit(); @@ -356,7 +356,7 @@ // UGLY temporary way to be sure the thread does not call code possibly causing a deadlock in JackEngine. ThreadExit(); - } - else - jack_error ( "Error in master receive : %s", StrError ( NET_ERROR_CODE ) ); + } else { + jack_error ( "Error in master receive : %s", StrError(NET_ERROR_CODE)); + } } @@ -372,18 +372,16 @@ PacketHeaderHToN(header, header); - if ( ( ( tx_bytes = fSocket.Send ( fTxBuffer, size, flags ) ) == SOCKET_ERROR ) && fRunning ) - { + if (((tx_bytes = fSocket.Send(fTxBuffer, size, flags)) == SOCKET_ERROR) && fRunning) { net_error_t error = fSocket.GetError(); - if ( error == NET_CONN_ERROR ) - { + if (error == NET_CONN_ERROR) { //fatal connection issue, exit - jack_error ( "'%s' : %s, exiting.", fParams.fName, StrError ( NET_ERROR_CODE ) ); + jack_error ("'%s' : %s, exiting.", fParams.fName, StrError (NET_ERROR_CODE)); Exit(); // UGLY temporary way to be sure the thread does not call code possibly causing a deadlock in JackEngine. ThreadExit(); - } - else - jack_error ( "Error in master send : %s", StrError ( NET_ERROR_CODE ) ); + } else { + jack_error("Error in master send : %s", StrError(NET_ERROR_CODE)); + } } return tx_bytes; @@ -405,7 +403,7 @@ fTxHeader.fDataType = 's'; fTxHeader.fIsLastPckt = ( fParams.fSendMidiChannels == 0 && fParams.fSendAudioChannels == 0) ? 1 : 0; - fTxHeader.fPacketSize = fParams.fMtu; - memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) ); - return Send ( fTxHeader.fPacketSize, 0 ); + fTxHeader.fPacketSize = HEADER_SIZE; + memcpy(fTxBuffer, &fTxHeader, HEADER_SIZE); + return Send(fTxHeader.fPacketSize, 0); } @@ -423,8 +421,8 @@ { fTxHeader.fSubCycle = subproc; - fTxHeader.fIsLastPckt = ( ( subproc == ( fTxHeader.fNMidiPckt - 1 ) ) && (fParams.fSendAudioChannels == 0)) ? 1 : 0; - fTxHeader.fPacketSize = sizeof ( packet_header_t ) + fNetMidiCaptureBuffer->RenderToNetwork ( subproc, fTxHeader.fMidiDataSize ); - memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) ); - if ( Send ( fTxHeader.fPacketSize, 0 ) == SOCKET_ERROR ) + fTxHeader.fIsLastPckt = (( subproc == (fTxHeader.fNMidiPckt - 1)) && (fParams.fSendAudioChannels == 0)) ? 1 : 0; + fTxHeader.fPacketSize = HEADER_SIZE + fNetMidiCaptureBuffer->RenderToNetwork(subproc, fTxHeader.fMidiDataSize); + memcpy ( fTxBuffer, &fTxHeader, HEADER_SIZE); + if (Send (fTxHeader.fPacketSize, 0) == SOCKET_ERROR) return SOCKET_ERROR; } @@ -437,12 +435,12 @@ fTxHeader.fMidiDataSize = 0; fTxHeader.fNMidiPckt = 0; - for ( subproc = 0; subproc < fNSubProcess; subproc++ ) + for (subproc = 0; subproc < fNSubProcess; subproc++) { fTxHeader.fSubCycle = subproc; - fTxHeader.fIsLastPckt = ( subproc == ( fNSubProcess - 1 ) ) ? 1 : 0; + fTxHeader.fIsLastPckt = (subproc == (fNSubProcess - 1)) ? 1 : 0; fTxHeader.fPacketSize = fAudioTxLen; - memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) ); - fNetAudioCaptureBuffer->RenderFromJackPorts ( subproc ); - if ( Send ( fTxHeader.fPacketSize, 0 ) == SOCKET_ERROR ) + memcpy(fTxBuffer, &fTxHeader, HEADER_SIZE); + fNetAudioCaptureBuffer->RenderFromJackPorts(subproc); + if (Send(fTxHeader.fPacketSize, 0) == SOCKET_ERROR) return SOCKET_ERROR; } @@ -455,5 +453,5 @@ { packet_header_t* rx_head = reinterpret_cast ( fRxBuffer ); - int rx_bytes = Recv ( fParams.fMtu, MSG_PEEK ); + int rx_bytes = Recv(HEADER_SIZE, MSG_PEEK); if ( ( rx_bytes == 0 ) || ( rx_bytes == SOCKET_ERROR ) ) @@ -486,5 +484,5 @@ // - if the network is too fast, just wait the next cycle, the benefit here is the master's cycle is shorter // - indeed, data is supposed to be on the network rx buffer, so we don't have to wait for it - if (fCycleOffset < 1) { + if (fCycleOffset < CYCLE_OFFSET_NORMAL) { return 0; } else { @@ -492,5 +490,5 @@ } - if (fCycleOffset != 1) { + if (fCycleOffset > CYCLE_OFFSET_NORMAL) { jack_info("'%s' can't run in normal network mode, data received too late (%d cycle(s) offset)", fParams.fName, fCycleOffset); } @@ -504,5 +502,5 @@ rx_bytes = Recv ( rx_head->fPacketSize, 0 ); - if (fCycleOffset != 0) { + if (fCycleOffset > CYCLE_OFFSET_FAST) { jack_info("'%s' can't run in fast network mode, data received too late (%d cycle(s) offset)", fParams.fName, fCycleOffset); } @@ -527,5 +525,5 @@ { //how much data is queued on the rx buffer ? - rx_bytes = Recv ( fParams.fMtu, MSG_PEEK ); + rx_bytes = Recv(HEADER_SIZE, MSG_PEEK); if ( rx_bytes == SOCKET_ERROR ) @@ -547,5 +545,5 @@ fRxHeader.fCycle = rx_head->fCycle; fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; - fNetMidiPlaybackBuffer->RenderFromNetwork ( rx_head->fSubCycle, rx_bytes - sizeof ( packet_header_t ) ); + fNetMidiPlaybackBuffer->RenderFromNetwork(rx_head->fSubCycle, rx_bytes - HEADER_SIZE); if ( ++recvd_midi_pckt == rx_head->fNMidiPckt ) fNetMidiPlaybackBuffer->RenderToJackPorts(); @@ -733,9 +731,4 @@ memset(&net_params, 0, sizeof ( session_params_t )); rx_bytes = fSocket.CatchHost ( &net_params, sizeof ( session_params_t ), 0 ); - - SessionParamsDisplay(&net_params); - jack_error ( "rx_bytes %d %d", rx_bytes, errno ); - - SessionParamsNToH(&net_params, &host_params); if ( ( rx_bytes == SOCKET_ERROR ) && ( fSocket.GetError() != NET_NO_DATA ) ) @@ -744,16 +737,9 @@ return NET_RECV_ERROR; } - for (int i = 0; i < 7; i++) { - jack_info ( " fPacketType %d", host_params.fPacketType[i]); - } - jack_info ( " received... host_params param %s %s %d %d", net_params.fPacketType, fParams.fPacketType, net_params.fPacketID, GetPacketType ( &host_params )); - - SessionParamsDisplay(&host_params); } while ( strcmp ( host_params.fPacketType, fParams.fPacketType ) && ( GetPacketType ( &host_params ) != SLAVE_SETUP ) ); - - jack_info ( "SLAVE_SETUP received..." ); - + //everything is OK, copy parameters + SessionParamsDisplay(&host_params); fParams = host_params; @@ -811,6 +797,6 @@ //audio netbuffer length - fAudioTxLen = sizeof ( packet_header_t ) + fNetAudioPlaybackBuffer->GetSize(); - fAudioRxLen = sizeof ( packet_header_t ) + fNetAudioCaptureBuffer->GetSize(); + fAudioTxLen = HEADER_SIZE + fNetAudioPlaybackBuffer->GetSize(); + fAudioRxLen = HEADER_SIZE + fNetAudioCaptureBuffer->GetSize(); } @@ -868,5 +854,5 @@ do { - rx_bytes = Recv ( fParams.fMtu, 0 ); + rx_bytes = Recv(HEADER_SIZE, 0); //connection issue, send will detect it, so don't skip the cycle (return 0) if ( rx_bytes == SOCKET_ERROR ) @@ -890,5 +876,5 @@ while ( !fRxHeader.fIsLastPckt ) { - rx_bytes = Recv ( fParams.fMtu, MSG_PEEK ); + rx_bytes = Recv(HEADER_SIZE, MSG_PEEK); //error here, problem with recv, just skip the cycle (return -1) @@ -903,5 +889,5 @@ fRxHeader.fCycle = rx_head->fCycle; fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; - fNetMidiCaptureBuffer->RenderFromNetwork ( rx_head->fSubCycle, rx_bytes - sizeof ( packet_header_t ) ); + fNetMidiCaptureBuffer->RenderFromNetwork(rx_head->fSubCycle, rx_bytes - HEADER_SIZE); // Last midi packet is received, so finish rendering... if ( ++recvd_midi_pckt == rx_head->fNMidiPckt ) @@ -939,14 +925,16 @@ { //tx header - if ( fParams.fSlaveSyncMode ) + if ( fParams.fSlaveSyncMode ) { fTxHeader.fCycle = fRxHeader.fCycle; - else + } else { fTxHeader.fCycle++; + } fTxHeader.fSubCycle = 0; fTxHeader.fDataType = 's'; fTxHeader.fIsLastPckt = ( fParams.fReturnMidiChannels == 0 && fParams.fReturnAudioChannels == 0) ? 1 : 0; - fTxHeader.fPacketSize = fParams.fMtu; - memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) ); - return Send ( fTxHeader.fPacketSize, 0 ); + fTxHeader.fPacketSize = HEADER_SIZE; + + memcpy(fTxBuffer, &fTxHeader, HEADER_SIZE); + return Send (fTxHeader.fPacketSize, 0); } @@ -964,8 +952,8 @@ { fTxHeader.fSubCycle = subproc; - fTxHeader.fIsLastPckt = ( ( subproc == ( fTxHeader.fNMidiPckt - 1 ) ) && !fParams.fReturnAudioChannels ) ? 1 : 0; - fTxHeader.fPacketSize = sizeof ( packet_header_t ) + fNetMidiPlaybackBuffer->RenderToNetwork ( subproc, fTxHeader.fMidiDataSize ); - memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) ); - if ( Send ( fTxHeader.fPacketSize, 0 ) == SOCKET_ERROR ) + fTxHeader.fIsLastPckt = ((subproc == (fTxHeader.fNMidiPckt - 1)) && !fParams.fReturnAudioChannels) ? 1 : 0; + fTxHeader.fPacketSize = HEADER_SIZE+ fNetMidiPlaybackBuffer->RenderToNetwork(subproc, fTxHeader.fMidiDataSize); + memcpy(fTxBuffer, &fTxHeader, HEADER_SIZE); + if (Send(fTxHeader.fPacketSize, 0) == SOCKET_ERROR) return SOCKET_ERROR; } @@ -981,9 +969,9 @@ { fTxHeader.fSubCycle = subproc; - fTxHeader.fIsLastPckt = ( subproc == ( fNSubProcess - 1 ) ) ? 1 : 0; + fTxHeader.fIsLastPckt = (subproc == (fNSubProcess - 1)) ? 1 : 0; fTxHeader.fPacketSize = fAudioTxLen; - memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) ); - fNetAudioPlaybackBuffer->RenderFromJackPorts ( subproc ); - if ( Send ( fTxHeader.fPacketSize, 0 ) == SOCKET_ERROR ) + memcpy(fTxBuffer, &fTxHeader, HEADER_SIZE); + fNetAudioPlaybackBuffer->RenderFromJackPorts (subproc); + if (Send(fTxHeader.fPacketSize, 0) == SOCKET_ERROR) return SOCKET_ERROR; } Index: /jack2/branches/libjacknet/common/JackNetInterface.h =================================================================== --- /jack2/branches/libjacknet/common/JackNetInterface.h (revision 3932) +++ /jack2/branches/libjacknet/common/JackNetInterface.h (revision 3934) @@ -213,5 +213,7 @@ #define SLAVE_INIT_TIMEOUT 2000000 // in usec -#define CYCLE_OFFSET_SLOW 2 +#define CYCLE_OFFSET_FAST 0 +#define CYCLE_OFFSET_NORMAL 1 +#define CYCLE_OFFSET_SLOW 3 #define MAX_LATENCY CYCLE_OFFSET_SLOW * 4 Index: /jack2/branches/libjacknet/macosx/iphone/main_slave.mm =================================================================== --- /jack2/branches/libjacknet/macosx/iphone/main_slave.mm (revision 3932) +++ /jack2/branches/libjacknet/macosx/iphone/main_slave.mm (revision 3934) @@ -63,7 +63,9 @@ jack_master_t result; - if ((net = jack_net_slave_open("169.254.136.64", DEFAULT_PORT, "iPhone", &request, &result)) == 0) { + //if ((net = jack_net_slave_open("169.254.121.189", DEFAULT_PORT, "iPhone", &request, &result)) == 0) { + if ((net = jack_net_slave_open(DEFAULT_MULTICAST_IP, DEFAULT_PORT, "iPhone", &request, &result)) == 0) { return -1; } + if ((adapter = jack_create_adapter(NUM_INPUT,