@@ -96,17 +96,6 @@ namespace Jack | |||||
#endif | #endif | ||||
case 'l' : | case 'l' : | ||||
fParams.fNetworkLatency = param->value.i; | fParams.fNetworkLatency = param->value.i; | ||||
/* | |||||
if (strcmp(param->value.str, "normal") == 0) { | |||||
fParams.fNetworkMode = 'n'; | |||||
} else if (strcmp(param->value.str, "slow") == 0) { | |||||
fParams.fNetworkMode = 's'; | |||||
} else if (strcmp(param->value.str, "fast") == 0) { | |||||
fParams.fNetworkMode = 'f'; | |||||
} else { | |||||
jack_error("Unknown network mode, using 'normal' mode."); | |||||
} | |||||
*/ | |||||
break; | break; | ||||
case 'q': | case 'q': | ||||
fQuality = param->value.ui; | fQuality = param->value.ui; | ||||
@@ -185,20 +185,7 @@ namespace Jack | |||||
plot_name = string(fParams.fName); | plot_name = string(fParams.fName); | ||||
plot_name += string("_slave"); | plot_name += string("_slave"); | ||||
plot_name += (fEngineControl->fSyncMode) ? string("_sync") : string("_async"); | plot_name += (fEngineControl->fSyncMode) ? string("_sync") : string("_async"); | ||||
switch (fParams.fNetworkMode) | |||||
{ | |||||
case 's' : | |||||
plot_name += string("_slow"); | |||||
break; | |||||
case 'n' : | |||||
plot_name += string("_normal"); | |||||
break; | |||||
case 'f' : | |||||
plot_name += string("_fast"); | |||||
break; | |||||
} | |||||
plot_name += string("_latency"); | |||||
fNetTimeMon = new JackGnuPlotMonitor<float>(128, 5, plot_name); | fNetTimeMon = new JackGnuPlotMonitor<float>(128, 5, plot_name); | ||||
string net_time_mon_fields[] = | string net_time_mon_fields[] = | ||||
{ | { | ||||
@@ -304,23 +291,8 @@ namespace Jack | |||||
} | } | ||||
port = fGraphManager->GetPort(port_index); | port = fGraphManager->GetPort(port_index); | ||||
port->SetAlias(alias); | port->SetAlias(alias); | ||||
//port latency | //port latency | ||||
range.min = range.max = (fParams.fNetworkLatency * fEngineControl->fBufferSize + (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize); | range.min = range.max = (fParams.fNetworkLatency * fEngineControl->fBufferSize + (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize); | ||||
/* | |||||
switch (fParams.fNetworkMode) | |||||
{ | |||||
case 'f' : | |||||
range.min = range.max = (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize; | |||||
break; | |||||
case 'n' : | |||||
range.min = range.max = (fEngineControl->fBufferSize + (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize); | |||||
break; | |||||
case 's' : | |||||
range.min = range.max = (2 * fEngineControl->fBufferSize + (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize); | |||||
break; | |||||
} | |||||
*/ | |||||
port->SetLatencyRange(JackPlaybackLatency, &range); | port->SetLatencyRange(JackPlaybackLatency, &range); | ||||
fPlaybackPortList[audio_port_index] = port_index; | fPlaybackPortList[audio_port_index] = port_index; | ||||
jack_log("JackNetDriver::AllocPorts() fPlaybackPortList[%d] audio_port_index = %ld fPortLatency = %ld", audio_port_index, port_index, port->GetLatency()); | jack_log("JackNetDriver::AllocPorts() fPlaybackPortList[%d] audio_port_index = %ld fPortLatency = %ld", audio_port_index, port_index, port->GetLatency()); | ||||
@@ -359,20 +331,6 @@ namespace Jack | |||||
port = fGraphManager->GetPort(port_index); | port = fGraphManager->GetPort(port_index); | ||||
//port latency | //port latency | ||||
range.min = range.max = (fParams.fNetworkLatency * fEngineControl->fBufferSize + (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize); | range.min = range.max = (fParams.fNetworkLatency * fEngineControl->fBufferSize + (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize); | ||||
/* | |||||
switch (fParams.fNetworkMode) | |||||
{ | |||||
case 'f' : | |||||
range.min = range.max = (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize; | |||||
break; | |||||
case 'n' : | |||||
range.min = range.max = (fEngineControl->fBufferSize + (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize); | |||||
break; | |||||
case 's' : | |||||
range.min = range.max = (2 * fEngineControl->fBufferSize + (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize); | |||||
break; | |||||
} | |||||
*/ | |||||
port->SetLatencyRange(JackPlaybackLatency, &range); | port->SetLatencyRange(JackPlaybackLatency, &range); | ||||
fMidiPlaybackPortList[midi_port_index] = port_index; | fMidiPlaybackPortList[midi_port_index] = port_index; | ||||
jack_log("JackNetDriver::AllocPorts() fMidiPlaybackPortList[%d] midi_port_index = %ld fPortLatency = %ld", midi_port_index, port_index, port->GetLatency()); | jack_log("JackNetDriver::AllocPorts() fMidiPlaybackPortList[%d] midi_port_index = %ld fPortLatency = %ld", midi_port_index, port_index, port->GetLatency()); | ||||
@@ -206,28 +206,6 @@ namespace Jack | |||||
return true; | return true; | ||||
} | } | ||||
/* | |||||
int JackNetMasterInterface::SetRxTimeout() | |||||
{ | |||||
jack_log("JackNetMasterInterface::SetRxTimeout"); | |||||
float time = 0; | |||||
//slow or normal mode, short timeout on recv (2 audio subcycles) | |||||
if ((fParams.fNetworkMode == 's') || (fParams.fNetworkMode == 'n')) { | |||||
time = 2000000.f * ((fNetAudioCaptureBuffer) | |||||
? fNetAudioCaptureBuffer->GetCycleDuration() | |||||
: (fNetAudioPlaybackBuffer) ? fNetAudioPlaybackBuffer->GetCycleDuration() : 0); | |||||
} | |||||
//fast mode, wait for 75% of the entire cycle duration | |||||
else if (fParams.fNetworkMode == 'f') { | |||||
time = 750000.f * (static_cast<float>(fParams.fPeriodSize) / static_cast<float>(fParams.fSampleRate)); | |||||
} | |||||
return fSocket.SetTimeOut(static_cast<int>(time)); | |||||
} | |||||
*/ | |||||
int JackNetMasterInterface::SetRxTimeout() | int JackNetMasterInterface::SetRxTimeout() | ||||
{ | { | ||||
jack_log("JackNetMasterInterface::SetRxTimeout"); | jack_log("JackNetMasterInterface::SetRxTimeout"); | ||||
@@ -483,62 +461,6 @@ namespace Jack | |||||
if (fNetAudioCaptureBuffer) | if (fNetAudioCaptureBuffer) | ||||
fNetAudioCaptureBuffer->ActivePortsFromNetwork(fRxData, rx_head->fActivePorts); | fNetAudioCaptureBuffer->ActivePortsFromNetwork(fRxData, rx_head->fActivePorts); | ||||
/* | |||||
switch (fParams.fNetworkMode) | |||||
{ | |||||
case 's' : | |||||
//slow mode : allow to use full bandwidth and heavy process on the slave | |||||
// - extra latency is set to two cycles, one cycle for send/receive operations + one cycle for heavy process on the slave | |||||
// - if the network is two fast, just wait the next cycle, this mode allows a shorter cycle duration for the master | |||||
// - this mode will skip the two first cycles, thus it lets time for data to be processed and queued on the socket rx buffer | |||||
//the slow mode is the safest mode because it wait twice the bandwidth relative time (send/return + process) | |||||
if (fCycleOffset < CYCLE_OFFSET_SLOW) { | |||||
return 0; | |||||
} else { | |||||
rx_bytes = Recv(rx_head->fPacketSize, 0); | |||||
} | |||||
//rx_bytes = Recv(rx_head->fPacketSize, 0); | |||||
//if (fCycleOffset != fLastfCycleOffset) | |||||
// jack_info("Warning : '%s' runs in slow network mode, but data received too late (%d cycle(s) offset)", fParams.fName, fCycleOffset); | |||||
//fLastfCycleOffset = fCycleOffset; | |||||
break; | |||||
case 'n' : | |||||
//normal use of the network : | |||||
// - extra latency is set to one cycle, what is the time needed to receive streams using full network bandwidth | |||||
// - 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 < CYCLE_OFFSET_NORMAL) { | |||||
return 0; | |||||
} else { | |||||
rx_bytes = Recv(rx_head->fPacketSize, 0); | |||||
} | |||||
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); | |||||
} | |||||
break; | |||||
case 'f' : | |||||
//fast mode suppose the network bandwith is larger than required for the transmission (only a few channels for example) | |||||
// - packets can be quickly received, quickly is here relative to the cycle duration | |||||
// - here, receive data, we can't keep it queued on the rx buffer, | |||||
// - but if there is a cycle offset, tell the user, that means we're not in fast mode anymore, network is too slow | |||||
rx_bytes = Recv(rx_head->fPacketSize, 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); | |||||
} | |||||
break; | |||||
} | |||||
*/ | |||||
if (fCycleOffset < fMaxCycleOffset) { | if (fCycleOffset < fMaxCycleOffset) { | ||||
return 0; | return 0; | ||||
} else { | } else { | ||||
@@ -224,13 +224,6 @@ namespace Jack | |||||
#define MASTER_INIT_TIMEOUT 1000000 // in usec | #define MASTER_INIT_TIMEOUT 1000000 // in usec | ||||
#define SLAVE_INIT_TIMEOUT 1000000 // in usec | #define SLAVE_INIT_TIMEOUT 1000000 // in usec | ||||
/* | |||||
#define CYCLE_OFFSET_FAST 0 | |||||
#define CYCLE_OFFSET_NORMAL 1 | |||||
#define CYCLE_OFFSET_SLOW 2 | |||||
//#define CYCLE_OFFSET_SLOW 30 | |||||
*/ | |||||
#define CYCLE_OFFSET_SLOW 10 | #define CYCLE_OFFSET_SLOW 10 | ||||
#define NETWORK_MAX_LATENCY CYCLE_OFFSET_SLOW | #define NETWORK_MAX_LATENCY CYCLE_OFFSET_SLOW | ||||
@@ -64,18 +64,7 @@ namespace Jack | |||||
plot_name = string ( fParams.fName ); | plot_name = string ( fParams.fName ); | ||||
plot_name += string ( "_master" ); | plot_name += string ( "_master" ); | ||||
plot_name += string ( ( fParams.fSlaveSyncMode ) ? "_sync" : "_async" ); | plot_name += string ( ( fParams.fSlaveSyncMode ) ? "_sync" : "_async" ); | ||||
switch ( fParams.fNetworkMode ) | |||||
{ | |||||
case 's' : | |||||
plot_name += string ( "_slow" ); | |||||
break; | |||||
case 'n' : | |||||
plot_name += string ( "_normal" ); | |||||
break; | |||||
case 'f' : | |||||
plot_name += string ( "_fast" ); | |||||
break; | |||||
} | |||||
plot_name += string ( "_latency" ); | |||||
fNetTimeMon = new JackGnuPlotMonitor<float> ( 128, 4, plot_name ); | fNetTimeMon = new JackGnuPlotMonitor<float> ( 128, 4, plot_name ); | ||||
string net_time_mon_fields[] = | string net_time_mon_fields[] = | ||||
{ | { | ||||
@@ -198,23 +187,6 @@ namespace Jack | |||||
//port latency | //port latency | ||||
range.min = range.max = fParams.fNetworkLatency * port_latency + (fParams.fSlaveSyncMode) ? 0 : port_latency; | range.min = range.max = fParams.fNetworkLatency * port_latency + (fParams.fSlaveSyncMode) ? 0 : port_latency; | ||||
jack_port_set_latency_range(fAudioPlaybackPorts[i], JackPlaybackLatency, &range); | jack_port_set_latency_range(fAudioPlaybackPorts[i], JackPlaybackLatency, &range); | ||||
/* | |||||
switch ( fParams.fNetworkMode ) | |||||
{ | |||||
case 'f' : | |||||
range.min = range.max = (fParams.fSlaveSyncMode) ? 0 : port_latency; | |||||
jack_port_set_latency_range(fAudioPlaybackPorts[i], JackPlaybackLatency, &range); | |||||
break; | |||||
case 'n' : | |||||
range.min = range.max = port_latency + (fParams.fSlaveSyncMode) ? 0 : port_latency; | |||||
jack_port_set_latency_range(fAudioPlaybackPorts[i], JackPlaybackLatency, &range); | |||||
break; | |||||
case 's' : | |||||
range.min = range.max = 2 * port_latency + (fParams.fSlaveSyncMode) ? 0 : port_latency; | |||||
jack_port_set_latency_range(fAudioPlaybackPorts[i], JackPlaybackLatency, &range); | |||||
break; | |||||
} | |||||
*/ | |||||
} | } | ||||
//midi | //midi | ||||
@@ -235,23 +207,6 @@ namespace Jack | |||||
//port latency | //port latency | ||||
range.min = range.max = fParams.fNetworkLatency * port_latency + (fParams.fSlaveSyncMode) ? 0 : port_latency; | range.min = range.max = fParams.fNetworkLatency * port_latency + (fParams.fSlaveSyncMode) ? 0 : port_latency; | ||||
jack_port_set_latency_range(fMidiPlaybackPorts[i], JackPlaybackLatency, &range); | jack_port_set_latency_range(fMidiPlaybackPorts[i], JackPlaybackLatency, &range); | ||||
/* | |||||
switch ( fParams.fNetworkMode ) | |||||
{ | |||||
case 'f' : | |||||
range.min = range.max = (fParams.fSlaveSyncMode) ? 0 : port_latency; | |||||
jack_port_set_latency_range(fMidiPlaybackPorts[i], JackPlaybackLatency, &range); | |||||
break; | |||||
case 'n' : | |||||
range.min = range.max = port_latency + (fParams.fSlaveSyncMode) ? 0 : port_latency; | |||||
jack_port_set_latency_range(fMidiPlaybackPorts[i], JackPlaybackLatency, &range); | |||||
break; | |||||
case 's' : | |||||
range.min = range.max = 2 * port_latency + (fParams.fSlaveSyncMode) ? 0 : port_latency; | |||||
jack_port_set_latency_range(fMidiPlaybackPorts[i], JackPlaybackLatency, &range); | |||||
break; | |||||
} | |||||
*/ | |||||
} | } | ||||
return 0; | return 0; | ||||
} | } | ||||