diff --git a/ChangeLog b/ChangeLog index 14bc8f3f..987302e9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -26,6 +26,8 @@ Michael Voigt 2009-01-26 Stephane Letz * Fix JackNetInterface::SetNetBufferSize for socket buffer size computation and JackNetMasterInterface::DataRecv if synch packet is received, various cleanup. + * Fix in JackAlsaAdapter::Open. + * Simplify audio packet order verification. 2009-01-19 Stephane Letz diff --git a/common/JackMidiPort.h b/common/JackMidiPort.h index 9a332de7..0b22944c 100644 --- a/common/JackMidiPort.h +++ b/common/JackMidiPort.h @@ -82,7 +82,7 @@ struct JackMidiBuffer uint32_t lost_events; uint32_t mix_index; - JackMidiEvent events[0]; + JackMidiEvent events[1]; // Using 0 size does not compile with older GCC versions, so use 1 here. int IsValid() const { diff --git a/common/JackNetInterface.cpp b/common/JackNetInterface.cpp index 016fcb1f..32618cd4 100644 --- a/common/JackNetInterface.cpp +++ b/common/JackNetInterface.cpp @@ -383,8 +383,7 @@ namespace Jack { fTxHeader.fSubCycle = subproc; fTxHeader.fIsLastPckt = ( ( subproc == ( fTxHeader.fNMidiPckt - 1 ) ) && !fParams.fSendAudioChannels ) ? 1 : 0; - fTxHeader.fPacketSize = sizeof ( packet_header_t ); - fTxHeader.fPacketSize += fNetMidiCaptureBuffer->RenderToNetwork ( subproc, fTxHeader.fMidiDataSize ); + 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 ) return SOCKET_ERROR; @@ -469,6 +468,7 @@ namespace Jack int rx_bytes = 0; uint jumpcnt = 0; uint recvd_midi_pckt = 0; + uint recvd_audio_pckt = 0; packet_header_t* rx_head = reinterpret_cast ( fRxBuffer ); while ( !fRxHeader.fIsLastPckt ) @@ -491,7 +491,7 @@ namespace Jack switch ( rx_head->fDataType ) { case 'm': //midi - rx_bytes = Recv ( rx_head->fPacketSize, 0 ); + rx_bytes = Recv ( rx_head->fPacketSize, 0 ); fRxHeader.fCycle = rx_head->fCycle; fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; fNetMidiPlaybackBuffer->RenderFromNetwork ( rx_head->fSubCycle, rx_bytes - sizeof ( packet_header_t ) ); @@ -502,7 +502,10 @@ namespace Jack case 'a': //audio rx_bytes = Recv ( rx_head->fPacketSize, 0 ); - if ( !IsNextPacket() ) + // SL: 25/01/09 + // if ( !IsNextPacket() ) + // jack_error ( "Packet(s) missing from '%s'...", fParams.fName ); + if (recvd_audio_pckt++ != rx_head->fSubCycle) jack_error ( "Packet(s) missing from '%s'...", fParams.fName ); fRxHeader.fCycle = rx_head->fCycle; fRxHeader.fSubCycle = rx_head->fSubCycle; @@ -512,7 +515,7 @@ namespace Jack break; case 's': //sync - /* SL: 25/01.09 + /* SL: 25/01/09 if ( rx_head->fCycle == fTxHeader.fCycle ) return 0; */ @@ -718,6 +721,7 @@ namespace Jack int JackNetSlaveInterface::DataRecv() { uint recvd_midi_pckt = 0; + uint recvd_audio_pckt = 0; int rx_bytes = 0; packet_header_t* rx_head = reinterpret_cast ( fRxBuffer ); @@ -743,8 +747,11 @@ namespace Jack case 'a': //audio rx_bytes = Recv ( rx_head->fPacketSize, 0 ); - if ( !IsNextPacket() ) - jack_error ( "Packet(s) missing..." ); + //SL: 25/01/09 + // if ( !IsNextPacket() ) + // jack_error ( "Packet(s) missing..." ); + if (recvd_audio_pckt++ != rx_head->fSubCycle) + jack_error ( "Packet(s) missing from '%s'...", fParams.fName ); fRxHeader.fCycle = rx_head->fCycle; fRxHeader.fSubCycle = rx_head->fSubCycle; fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; @@ -790,8 +797,7 @@ namespace Jack { fTxHeader.fSubCycle = subproc; fTxHeader.fIsLastPckt = ( ( subproc == ( fTxHeader.fNMidiPckt - 1 ) ) && !fParams.fReturnAudioChannels ) ? 1 : 0; - fTxHeader.fPacketSize = sizeof ( packet_header_t ); - fTxHeader.fPacketSize += fNetMidiPlaybackBuffer->RenderToNetwork ( subproc, fTxHeader.fMidiDataSize ); + 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 ) return SOCKET_ERROR;