Changeset 3934
- Timestamp:
- 03/02/10 12:27:58 (5 months ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
jack2/branches/libjacknet/common/JackNetInterface.cpp
r3932 r3934 26 26 27 27 #define PACKET_AVAILABLE_SIZE (fParams.fMtu - sizeof(packet_header_t)) 28 #define HEADER_SIZE (sizeof(packet_header_t)) 28 29 29 30 /* … … 310 311 311 312 //audio netbuffer length 312 fAudioTxLen = sizeof ( packet_header_t )+ fNetAudioCaptureBuffer->GetSize();313 fAudioRxLen = sizeof ( packet_header_t )+ fNetAudioPlaybackBuffer->GetSize();313 fAudioTxLen = HEADER_SIZE + fNetAudioCaptureBuffer->GetSize(); 314 fAudioRxLen = HEADER_SIZE + fNetAudioPlaybackBuffer->GetSize(); 314 315 } 315 316 … … 341 342 { 342 343 int rx_bytes; 343 if ( ( ( rx_bytes = fSocket.Recv ( fRxBuffer, size, flags ) ) == SOCKET_ERROR ) && fRunning )344 {344 345 if ((( rx_bytes = fSocket.Recv(fRxBuffer, size, flags)) == SOCKET_ERROR) && fRunning) { 345 346 net_error_t error = fSocket.GetError(); 346 347 //no data isn't really a network error, so just return 0 avalaible read bytes 347 if ( error == NET_NO_DATA )348 if (error == NET_NO_DATA) { 348 349 return 0; 349 else if ( error == NET_CONN_ERROR ) 350 { 350 } else if (error == NET_CONN_ERROR) { 351 351 //fatal connection issue, exit 352 jack_error ( "'%s' : %s, exiting.", fParams.fName, StrError ( NET_ERROR_CODE ));352 jack_error ( "'%s' : %s, exiting.", fParams.fName, StrError(NET_ERROR_CODE)); 353 353 //ask to the manager to properly remove the master 354 354 Exit(); … … 356 356 // UGLY temporary way to be sure the thread does not call code possibly causing a deadlock in JackEngine. 357 357 ThreadExit(); 358 } 359 else360 jack_error ( "Error in master receive : %s", StrError ( NET_ERROR_CODE ) );358 } else { 359 jack_error ( "Error in master receive : %s", StrError(NET_ERROR_CODE)); 360 } 361 361 } 362 362 … … 372 372 PacketHeaderHToN(header, header); 373 373 374 if ( ( ( tx_bytes = fSocket.Send ( fTxBuffer, size, flags ) ) == SOCKET_ERROR ) && fRunning ) 375 { 374 if (((tx_bytes = fSocket.Send(fTxBuffer, size, flags)) == SOCKET_ERROR) && fRunning) { 376 375 net_error_t error = fSocket.GetError(); 377 if ( error == NET_CONN_ERROR ) 378 { 376 if (error == NET_CONN_ERROR) { 379 377 //fatal connection issue, exit 380 jack_error ( "'%s' : %s, exiting.", fParams.fName, StrError ( NET_ERROR_CODE ));378 jack_error ("'%s' : %s, exiting.", fParams.fName, StrError (NET_ERROR_CODE)); 381 379 Exit(); 382 380 383 381 // UGLY temporary way to be sure the thread does not call code possibly causing a deadlock in JackEngine. 384 382 ThreadExit(); 385 } 386 else387 jack_error ( "Error in master send : %s", StrError ( NET_ERROR_CODE ) );383 } else { 384 jack_error("Error in master send : %s", StrError(NET_ERROR_CODE)); 385 } 388 386 } 389 387 return tx_bytes; … … 405 403 fTxHeader.fDataType = 's'; 406 404 fTxHeader.fIsLastPckt = ( fParams.fSendMidiChannels == 0 && fParams.fSendAudioChannels == 0) ? 1 : 0; 407 fTxHeader.fPacketSize = fParams.fMtu;408 memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ));409 return Send ( fTxHeader.fPacketSize, 0);405 fTxHeader.fPacketSize = HEADER_SIZE; 406 memcpy(fTxBuffer, &fTxHeader, HEADER_SIZE); 407 return Send(fTxHeader.fPacketSize, 0); 410 408 } 411 409 … … 423 421 { 424 422 fTxHeader.fSubCycle = subproc; 425 fTxHeader.fIsLastPckt = ( ( subproc == ( fTxHeader.fNMidiPckt - 1 )) && (fParams.fSendAudioChannels == 0)) ? 1 : 0;426 fTxHeader.fPacketSize = sizeof ( packet_header_t ) + fNetMidiCaptureBuffer->RenderToNetwork ( subproc, fTxHeader.fMidiDataSize);427 memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ));428 if ( Send ( fTxHeader.fPacketSize, 0 ) == SOCKET_ERROR)423 fTxHeader.fIsLastPckt = (( subproc == (fTxHeader.fNMidiPckt - 1)) && (fParams.fSendAudioChannels == 0)) ? 1 : 0; 424 fTxHeader.fPacketSize = HEADER_SIZE + fNetMidiCaptureBuffer->RenderToNetwork(subproc, fTxHeader.fMidiDataSize); 425 memcpy ( fTxBuffer, &fTxHeader, HEADER_SIZE); 426 if (Send (fTxHeader.fPacketSize, 0) == SOCKET_ERROR) 429 427 return SOCKET_ERROR; 430 428 } … … 437 435 fTxHeader.fMidiDataSize = 0; 438 436 fTxHeader.fNMidiPckt = 0; 439 for ( subproc = 0; subproc < fNSubProcess; subproc++)437 for (subproc = 0; subproc < fNSubProcess; subproc++) 440 438 { 441 439 fTxHeader.fSubCycle = subproc; 442 fTxHeader.fIsLastPckt = ( subproc == ( fNSubProcess - 1 )) ? 1 : 0;440 fTxHeader.fIsLastPckt = (subproc == (fNSubProcess - 1)) ? 1 : 0; 443 441 fTxHeader.fPacketSize = fAudioTxLen; 444 memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ));445 fNetAudioCaptureBuffer->RenderFromJackPorts ( subproc);446 if ( Send ( fTxHeader.fPacketSize, 0 ) == SOCKET_ERROR)442 memcpy(fTxBuffer, &fTxHeader, HEADER_SIZE); 443 fNetAudioCaptureBuffer->RenderFromJackPorts(subproc); 444 if (Send(fTxHeader.fPacketSize, 0) == SOCKET_ERROR) 447 445 return SOCKET_ERROR; 448 446 } … … 455 453 { 456 454 packet_header_t* rx_head = reinterpret_cast<packet_header_t*> ( fRxBuffer ); 457 int rx_bytes = Recv ( fParams.fMtu, MSG_PEEK);455 int rx_bytes = Recv(HEADER_SIZE, MSG_PEEK); 458 456 459 457 if ( ( rx_bytes == 0 ) || ( rx_bytes == SOCKET_ERROR ) ) … … 486 484 // - if the network is too fast, just wait the next cycle, the benefit here is the master's cycle is shorter 487 485 // - indeed, data is supposed to be on the network rx buffer, so we don't have to wait for it 488 if (fCycleOffset < 1) {486 if (fCycleOffset < CYCLE_OFFSET_NORMAL) { 489 487 return 0; 490 488 } else { … … 492 490 } 493 491 494 if (fCycleOffset != 1) {492 if (fCycleOffset > CYCLE_OFFSET_NORMAL) { 495 493 jack_info("'%s' can't run in normal network mode, data received too late (%d cycle(s) offset)", fParams.fName, fCycleOffset); 496 494 } … … 504 502 rx_bytes = Recv ( rx_head->fPacketSize, 0 ); 505 503 506 if (fCycleOffset != 0) {504 if (fCycleOffset > CYCLE_OFFSET_FAST) { 507 505 jack_info("'%s' can't run in fast network mode, data received too late (%d cycle(s) offset)", fParams.fName, fCycleOffset); 508 506 } … … 527 525 { 528 526 //how much data is queued on the rx buffer ? 529 rx_bytes = Recv ( fParams.fMtu, MSG_PEEK);527 rx_bytes = Recv(HEADER_SIZE, MSG_PEEK); 530 528 531 529 if ( rx_bytes == SOCKET_ERROR ) … … 547 545 fRxHeader.fCycle = rx_head->fCycle; 548 546 fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; 549 fNetMidiPlaybackBuffer->RenderFromNetwork ( rx_head->fSubCycle, rx_bytes - sizeof ( packet_header_t ));547 fNetMidiPlaybackBuffer->RenderFromNetwork(rx_head->fSubCycle, rx_bytes - HEADER_SIZE); 550 548 if ( ++recvd_midi_pckt == rx_head->fNMidiPckt ) 551 549 fNetMidiPlaybackBuffer->RenderToJackPorts(); … … 733 731 memset(&net_params, 0, sizeof ( session_params_t )); 734 732 rx_bytes = fSocket.CatchHost ( &net_params, sizeof ( session_params_t ), 0 ); 735 736 SessionParamsDisplay(&net_params);737 jack_error ( "rx_bytes %d %d", rx_bytes, errno );738 739 740 733 SessionParamsNToH(&net_params, &host_params); 741 734 if ( ( rx_bytes == SOCKET_ERROR ) && ( fSocket.GetError() != NET_NO_DATA ) ) … … 744 737 return NET_RECV_ERROR; 745 738 } 746 for (int i = 0; i < 7; i++) {747 jack_info ( " fPacketType %d", host_params.fPacketType[i]);748 }749 jack_info ( " received... host_params param %s %s %d %d", net_params.fPacketType, fParams.fPacketType, net_params.fPacketID, GetPacketType ( &host_params ));750 751 SessionParamsDisplay(&host_params);752 739 } 753 740 while ( strcmp ( host_params.fPacketType, fParams.fPacketType ) && ( GetPacketType ( &host_params ) != SLAVE_SETUP ) ); 754 755 jack_info ( "SLAVE_SETUP received..." ); 756 741 757 742 //everything is OK, copy parameters 743 SessionParamsDisplay(&host_params); 758 744 fParams = host_params; 759 745 … … 811 797 812 798 //audio netbuffer length 813 fAudioTxLen = sizeof ( packet_header_t )+ fNetAudioPlaybackBuffer->GetSize();814 fAudioRxLen = sizeof ( packet_header_t )+ fNetAudioCaptureBuffer->GetSize();799 fAudioTxLen = HEADER_SIZE + fNetAudioPlaybackBuffer->GetSize(); 800 fAudioRxLen = HEADER_SIZE + fNetAudioCaptureBuffer->GetSize(); 815 801 } 816 802 … … 868 854 do 869 855 { 870 rx_bytes = Recv ( fParams.fMtu, 0);856 rx_bytes = Recv(HEADER_SIZE, 0); 871 857 //connection issue, send will detect it, so don't skip the cycle (return 0) 872 858 if ( rx_bytes == SOCKET_ERROR ) … … 890 876 while ( !fRxHeader.fIsLastPckt ) 891 877 { 892 rx_bytes = Recv ( fParams.fMtu, MSG_PEEK);878 rx_bytes = Recv(HEADER_SIZE, MSG_PEEK); 893 879 //error here, problem with recv, just skip the cycle (return -1) 894 880 … … 903 889 fRxHeader.fCycle = rx_head->fCycle; 904 890 fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; 905 fNetMidiCaptureBuffer->RenderFromNetwork ( rx_head->fSubCycle, rx_bytes - sizeof ( packet_header_t ));891 fNetMidiCaptureBuffer->RenderFromNetwork(rx_head->fSubCycle, rx_bytes - HEADER_SIZE); 906 892 // Last midi packet is received, so finish rendering... 907 893 if ( ++recvd_midi_pckt == rx_head->fNMidiPckt ) … … 939 925 { 940 926 //tx header 941 if ( fParams.fSlaveSyncMode ) 927 if ( fParams.fSlaveSyncMode ) { 942 928 fTxHeader.fCycle = fRxHeader.fCycle; 943 else929 } else { 944 930 fTxHeader.fCycle++; 931 } 945 932 fTxHeader.fSubCycle = 0; 946 933 fTxHeader.fDataType = 's'; 947 934 fTxHeader.fIsLastPckt = ( fParams.fReturnMidiChannels == 0 && fParams.fReturnAudioChannels == 0) ? 1 : 0; 948 fTxHeader.fPacketSize = fParams.fMtu; 949 memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) ); 950 return Send ( fTxHeader.fPacketSize, 0 ); 935 fTxHeader.fPacketSize = HEADER_SIZE; 936 937 memcpy(fTxBuffer, &fTxHeader, HEADER_SIZE); 938 return Send (fTxHeader.fPacketSize, 0); 951 939 } 952 940 … … 964 952 { 965 953 fTxHeader.fSubCycle = subproc; 966 fTxHeader.fIsLastPckt = ( ( subproc == ( fTxHeader.fNMidiPckt - 1 ) ) && !fParams.fReturnAudioChannels) ? 1 : 0;967 fTxHeader.fPacketSize = sizeof ( packet_header_t ) + fNetMidiPlaybackBuffer->RenderToNetwork ( subproc, fTxHeader.fMidiDataSize);968 memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ));969 if ( Send ( fTxHeader.fPacketSize, 0 ) == SOCKET_ERROR)954 fTxHeader.fIsLastPckt = ((subproc == (fTxHeader.fNMidiPckt - 1)) && !fParams.fReturnAudioChannels) ? 1 : 0; 955 fTxHeader.fPacketSize = HEADER_SIZE+ fNetMidiPlaybackBuffer->RenderToNetwork(subproc, fTxHeader.fMidiDataSize); 956 memcpy(fTxBuffer, &fTxHeader, HEADER_SIZE); 957 if (Send(fTxHeader.fPacketSize, 0) == SOCKET_ERROR) 970 958 return SOCKET_ERROR; 971 959 } … … 981 969 { 982 970 fTxHeader.fSubCycle = subproc; 983 fTxHeader.fIsLastPckt = ( subproc == ( fNSubProcess - 1 )) ? 1 : 0;971 fTxHeader.fIsLastPckt = (subproc == (fNSubProcess - 1)) ? 1 : 0; 984 972 fTxHeader.fPacketSize = fAudioTxLen; 985 memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ));986 fNetAudioPlaybackBuffer->RenderFromJackPorts ( subproc);987 if ( Send ( fTxHeader.fPacketSize, 0 ) == SOCKET_ERROR)973 memcpy(fTxBuffer, &fTxHeader, HEADER_SIZE); 974 fNetAudioPlaybackBuffer->RenderFromJackPorts (subproc); 975 if (Send(fTxHeader.fPacketSize, 0) == SOCKET_ERROR) 988 976 return SOCKET_ERROR; 989 977 } jack2/branches/libjacknet/common/JackNetInterface.h
r3932 r3934 213 213 #define SLAVE_INIT_TIMEOUT 2000000 // in usec 214 214 215 #define CYCLE_OFFSET_SLOW 2 215 #define CYCLE_OFFSET_FAST 0 216 #define CYCLE_OFFSET_NORMAL 1 217 #define CYCLE_OFFSET_SLOW 3 216 218 #define MAX_LATENCY CYCLE_OFFSET_SLOW * 4 217 219 jack2/branches/libjacknet/macosx/iphone/main_slave.mm
r3932 r3934 63 63 jack_master_t result; 64 64 65 if ((net = jack_net_slave_open("169.254.136.64", DEFAULT_PORT, "iPhone", &request, &result)) == 0) { 65 //if ((net = jack_net_slave_open("169.254.121.189", DEFAULT_PORT, "iPhone", &request, &result)) == 0) { 66 if ((net = jack_net_slave_open(DEFAULT_MULTICAST_IP, DEFAULT_PORT, "iPhone", &request, &result)) == 0) { 66 67 return -1; 67 68 } 69 68 70 69 71 if ((adapter = jack_create_adapter(NUM_INPUT,
