From f62319d2ee1c167a4c43dbe08c8a96a7bf795d7b Mon Sep 17 00:00:00 2001 From: sletz Date: Fri, 29 Jul 2011 07:53:42 +0000 Subject: [PATCH] NetJack2: default latency raised to 5 cycles, cleanup. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4520 0c269be4-1314-0410-8aa9-9f06e86f4224 --- common/JackEngine.cpp | 2 +- common/JackNetAPI.cpp | 3 +- common/JackNetDriver.cpp | 8 +++--- common/JackNetInterface.cpp | 17 +++++++---- common/JackNetManager.cpp | 3 +- common/JackNetTool.cpp | 57 +++++++++++++++++++++---------------- common/JackNetTool.h | 12 +++++--- 7 files changed, 59 insertions(+), 43 deletions(-) diff --git a/common/JackEngine.cpp b/common/JackEngine.cpp index 0acb2be9..ea527736 100644 --- a/common/JackEngine.cpp +++ b/common/JackEngine.cpp @@ -427,7 +427,7 @@ int JackEngine::ClientCheck(const char* name, int uuid, char* name_res, int prot *status = 0; strcpy(name_res, name); - jack_log("Check protocol client %ld server = %ld", protocol, JACK_PROTOCOL_VERSION); + jack_log("Check protocol client = %ld server = %ld", protocol, JACK_PROTOCOL_VERSION); if (protocol != JACK_PROTOCOL_VERSION) { *status |= (JackFailure | JackVersionError); diff --git a/common/JackNetAPI.cpp b/common/JackNetAPI.cpp index caef0114..4a7c40ee 100644 --- a/common/JackNetAPI.cpp +++ b/common/JackNetAPI.cpp @@ -198,8 +198,7 @@ struct JackNetExtMaster : public JackNetMasterInterface { fprintf(stderr, "Can't set timeout : %s\n", StrError(NET_ERROR_CODE)); } - //main loop, wait for data, deal with it and wait again - //utility variables + // Main loop, wait for data, deal with it and wait again int attempt = 0; int rx_bytes = 0; diff --git a/common/JackNetDriver.cpp b/common/JackNetDriver.cpp index 54b272af..ff16b85b 100644 --- a/common/JackNetDriver.cpp +++ b/common/JackNetDriver.cpp @@ -548,7 +548,7 @@ namespace Jack for (int audio_port_index = 0; audio_port_index < fPlaybackChannels; audio_port_index++) { #ifdef OPTIMIZED_PROTOCOL // Port is connected on other side... - if ((intptr_t)fNetAudioPlaybackBuffer->GetBuffer(audio_port_index) == -1) { + if (fNetAudioPlaybackBuffer->GetConnected(audio_port_index)) { fNetAudioPlaybackBuffer->SetBuffer(audio_port_index, GetOutputBuffer(audio_port_index, true)); } else { fNetAudioPlaybackBuffer->SetBuffer(audio_port_index, NULL); @@ -624,10 +624,10 @@ namespace Jack strcpy(value.str, "'hostname'"); jack_driver_descriptor_add_parameter(desc, &filler, "client_name", 'n', JackDriverParamString, &value, NULL, "Name of the jack client", NULL); - value.ui = 1U; + value.ui = 0U; jack_driver_descriptor_add_parameter(desc, &filler, "transport_sync", 't', JackDriverParamUInt, &value, NULL, "Sync transport with master's", NULL); - value.ui = 2U; + value.ui = 5U; jack_driver_descriptor_add_parameter(desc, &filler, "latency", 'l', JackDriverParamUInt, &value, NULL, "Network latency", NULL); return desc; @@ -649,7 +649,7 @@ namespace Jack int midi_output_ports = 0; int celt_encoding = -1; bool monitor = false; - int network_latency = 2; + int network_latency = 5; const JSList* node; const jack_driver_param_t* param; diff --git a/common/JackNetInterface.cpp b/common/JackNetInterface.cpp index 8cd9232d..32e2ed2f 100644 --- a/common/JackNetInterface.cpp +++ b/common/JackNetInterface.cpp @@ -293,7 +293,8 @@ namespace Jack bool JackNetMasterInterface::SetParams() { jack_log("JackNetMasterInterface::SetParams audio in = %d audio out = %d MIDI in = %d MIDI out = %d", - fParams.fSendAudioChannels, fParams.fReturnAudioChannels, fParams.fSendMidiChannels, fParams.fReturnMidiChannels); + fParams.fSendAudioChannels, fParams.fReturnAudioChannels, + fParams.fSendMidiChannels, fParams.fReturnMidiChannels); JackNetInterface::SetParams(); @@ -303,11 +304,13 @@ namespace Jack fMaxCycleOffset = fParams.fNetworkLatency; // midi net buffers - if (fParams.fSendMidiChannels > 0) + if (fParams.fSendMidiChannels > 0) { fNetMidiCaptureBuffer = new NetMidiBuffer(&fParams, fParams.fSendMidiChannels, fTxData); + } - if (fParams.fReturnMidiChannels > 0) + if (fParams.fReturnMidiChannels > 0) { fNetMidiPlaybackBuffer = new NetMidiBuffer(&fParams, fParams.fReturnMidiChannels, fRxData); + } try { @@ -790,11 +793,13 @@ namespace Jack fRxHeader.fDataStream = 's'; // midi net buffers - if (fParams.fSendMidiChannels > 0) + if (fParams.fSendMidiChannels > 0) { fNetMidiCaptureBuffer = new NetMidiBuffer(&fParams, fParams.fSendMidiChannels, fRxData); + } - if (fParams.fReturnMidiChannels > 0) + if (fParams.fReturnMidiChannels > 0) { fNetMidiPlaybackBuffer = new NetMidiBuffer(&fParams, fParams.fReturnMidiChannels, fTxData); + } try { @@ -1033,7 +1038,7 @@ namespace Jack if (fParams.fTransportSync) { // copy received transport data to transport data structure memcpy(&fSendTransportData, fRxData, sizeof(net_transport_data_t)); - TransportDataNToH(&fSendTransportData, &fSendTransportData); + TransportDataNToH(&fSendTransportData, &fSendTransportData); DecodeTransportData(); } // then others diff --git a/common/JackNetManager.cpp b/common/JackNetManager.cpp index abbfcab1..4a813b9b 100644 --- a/common/JackNetManager.cpp +++ b/common/JackNetManager.cpp @@ -412,8 +412,7 @@ namespace Jack for (int audio_port_index = 0; audio_port_index < fParams.fSendAudioChannels; audio_port_index++) { #ifdef OPTIMIZED_PROTOCOL - if ((intptr_t)fNetAudioCaptureBuffer->GetBuffer(audio_port_index) == -1) { - //jack_info("Process fNetAudioCaptureBuffer %d", jack_port_connected(fAudioCapturePorts[audio_port_index])); + if (fNetAudioCaptureBuffer->GetConnected(audio_port_index)) { // Port is connected on other side... fNetAudioCaptureBuffer->SetBuffer(audio_port_index, ((jack_port_connected(fAudioCapturePorts[audio_port_index]) > 0) diff --git a/common/JackNetTool.cpp b/common/JackNetTool.cpp index d8caa86b..f5997e3b 100644 --- a/common/JackNetTool.cpp +++ b/common/JackNetTool.cpp @@ -208,13 +208,16 @@ namespace Jack fNetBuffer = net_buffer; fPortBuffer = new sample_t* [fNPorts]; + fConnectedPorts = new bool[fNPorts]; for (int port_index = 0; port_index < fNPorts; port_index++) { - fPortBuffer[port_index] = (sample_t*)-1; + fPortBuffer[port_index] = NULL; + fConnectedPorts[port_index] = true; } } NetAudioBuffer::~NetAudioBuffer() { + delete [] fConnectedPorts; delete [] fPortBuffer; } @@ -262,36 +265,37 @@ namespace Jack int NetAudioBuffer::ActivePortsToNetwork(char* net_buffer) { - int active_port = 0; - short* active_port_address = (short*)net_buffer; + int active_ports = 0; + int* active_port_address = (int*)net_buffer; for (int port_index = 0; port_index < fNPorts; port_index++) { // Write the active port number if (fPortBuffer[port_index]) { *active_port_address = port_index; active_port_address++; - active_port++; + active_ports++; + assert(active_ports < 256); } } - assert(active_port < 512); - return active_port; + return active_ports; } void NetAudioBuffer::ActivePortsFromNetwork(char* net_buffer, uint32_t port_num) { - short* active_port_address = (short*)net_buffer; + int* active_port_address = (int*)net_buffer; for (int port_index = 0; port_index < fNPorts; port_index++) { - fPortBuffer[port_index] = NULL; + fConnectedPorts[port_index] = false; } for (uint port_index = 0; port_index < port_num; port_index++) { // Use -1 when port is actually connected on other side - if (*active_port_address >= 0 && *active_port_address < fNPorts) { - fPortBuffer[*active_port_address] = (sample_t*)-1; + int active_port = *active_port_address; + if (active_port >= 0 && active_port < fNPorts) { + fConnectedPorts[active_port] = true; } else { - jack_error("ActivePortsFromNetwork: incorrect port = %d", *active_port_address); + jack_error("ActivePortsFromNetwork: incorrect port = %d", active_port); } active_port_address++; } @@ -302,6 +306,7 @@ namespace Jack // Count active ports int active_ports = 0; for (int port_index = 0; port_index < fNPorts; port_index++) { + if (fPortBuffer[port_index]) { active_ports++; } @@ -358,7 +363,7 @@ namespace Jack fSubPeriodSize = (period > fPeriodSize) ? fPeriodSize : period; } - fSubPeriodBytesSize = fSubPeriodSize * sizeof(sample_t) + sizeof(uint32_t); // The port number in coded on 4 bytes + fSubPeriodBytesSize = fSubPeriodSize * sizeof(sample_t) + sizeof(int); // The port number in coded on 4 bytes } int NetFloatAudioBuffer::GetNumPackets(int active_ports) @@ -423,12 +428,14 @@ namespace Jack for (uint32_t port_index = 0; port_index < port_num; port_index++) { // Only copy to active ports : read the active port number then audio data - uint32_t* active_port_address = (uint32_t*)(fNetBuffer + port_index * fSubPeriodBytesSize); - uint32_t active_port = (uint32_t)(*active_port_address); + int* active_port_address = (int*)(fNetBuffer + port_index * fSubPeriodBytesSize); + int active_port = *active_port_address; + /* if (fPortBuffer[active_port]) { memcpy(fPortBuffer[active_port] + sub_cycle * fSubPeriodSize, (char*)(active_port_address + 1), fSubPeriodBytesSize - sizeof(uint32_t)); - //RenderFromNetwork((char*)(active_port_address + 1), active_port, sub_cycle, sub_period_bytes_size - sizeof(uint32_t)); } + */ + RenderFromNetwork((char*)(active_port_address + 1), active_port, sub_cycle); } } @@ -438,30 +445,32 @@ namespace Jack int NetFloatAudioBuffer::RenderToNetwork(int sub_cycle, uint32_t port_num) { - int active_port = 0; + int active_ports = 0; for (int port_index = 0; port_index < fNPorts; port_index++) { // Only copy from active ports : write the active port number then audio data if (fPortBuffer[port_index]) { - uint32_t* active_port_address = (uint32_t*)(fNetBuffer + active_port * fSubPeriodBytesSize); + int* active_port_address = (int*)(fNetBuffer + active_ports * fSubPeriodBytesSize); *active_port_address = port_index; - memcpy((char*)(active_port_address + 1), fPortBuffer[port_index] + sub_cycle * fSubPeriodSize, fSubPeriodBytesSize - sizeof(uint32_t)); - //RenderToNetwork((char*)(active_port_address + 1), port_index, sub_cycle, fSubPeriodBytesSize - sizeof(uint32_t)); - active_port++; + //memcpy((char*)(active_port_address + 1), fPortBuffer[port_index] + sub_cycle * fSubPeriodSize, fSubPeriodBytesSize - sizeof(uint32_t)); + RenderToNetwork((char*)(active_port_address + 1), port_index, sub_cycle); + active_ports++; } } return port_num * fSubPeriodBytesSize; } - void NetFloatAudioBuffer::RenderFromNetwork(char* net_buffer, int active_port, int sub_cycle, size_t copy_size) + void NetFloatAudioBuffer::RenderFromNetwork(char* net_buffer, int active_port, int sub_cycle) { - memcpy(fPortBuffer[active_port] + sub_cycle * fSubPeriodSize, net_buffer, copy_size); + if (fPortBuffer[active_port]) { + memcpy(fPortBuffer[active_port] + sub_cycle * fSubPeriodSize, net_buffer, fSubPeriodBytesSize - sizeof(int)); + } } - void NetFloatAudioBuffer::RenderToNetwork(char* net_buffer, int active_port, int sub_cycle, size_t copy_size) + void NetFloatAudioBuffer::RenderToNetwork(char* net_buffer, int active_port, int sub_cycle) { - memcpy(net_buffer, fPortBuffer[active_port] + sub_cycle * fSubPeriodSize, copy_size); + memcpy(net_buffer, fPortBuffer[active_port] + sub_cycle * fSubPeriodSize, fSubPeriodBytesSize - sizeof(int)); } // Celt audio buffer ********************************************************************************* diff --git a/common/JackNetTool.h b/common/JackNetTool.h index 6de23f23..315ab66b 100644 --- a/common/JackNetTool.h +++ b/common/JackNetTool.h @@ -39,8 +39,8 @@ using namespace std; #endif #endif -#define MASTER_PROTOCOL 4 -#define SLAVE_PROTOCOL 4 +#define MASTER_PROTOCOL 5 +#define SLAVE_PROTOCOL 5 #define NET_PACKET_ERROR -2 @@ -281,6 +281,7 @@ namespace Jack char* fNetBuffer; sample_t** fPortBuffer; + bool* fConnectedPorts; jack_nframes_t fPeriodSize; jack_nframes_t fSubPeriodSize; @@ -298,6 +299,9 @@ namespace Jack NetAudioBuffer(session_params_t* params, uint32_t nports, char* net_buffer); virtual ~NetAudioBuffer(); + bool GetConnected(int port_index) { return fConnectedPorts[port_index]; } + void SetConnected(int port_index, bool state) { fConnectedPorts[port_index] = state; } + // needed syze in bytes ofr an entire cycle virtual size_t GetCycleSize() = 0; @@ -350,8 +354,8 @@ namespace Jack int RenderFromNetwork(int cycle, int sub_cycle, uint32_t port_num); int RenderToNetwork(int sub_cycle, uint32_t port_num); - void RenderFromNetwork(char* net_buffer, int active_port, int sub_cycle, size_t copy_size); - void RenderToNetwork(char* net_buffer, int active_port, int sub_cycle, size_t copy_size); + void RenderFromNetwork(char* net_buffer, int active_port, int sub_cycle); + void RenderToNetwork(char* net_buffer, int active_port, int sub_cycle); };