git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2921 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.90
@@ -37,8 +37,8 @@ namespace Jack | |||||
jack_log ( "JackNetDriver::JackNetDriver ip %s, port %d", ip, port ); | jack_log ( "JackNetDriver::JackNetDriver ip %s, port %d", ip, port ); | ||||
// Use the hostname if no name parameter was given | // Use the hostname if no name parameter was given | ||||
if (strcmp(net_name, "") == 0) | |||||
GetHostName(net_name, JACK_CLIENT_NAME_SIZE); | |||||
if ( strcmp ( net_name, "" ) == 0 ) | |||||
GetHostName ( net_name, JACK_CLIENT_NAME_SIZE ); | |||||
fParams.fMtu = mtu; | fParams.fMtu = mtu; | ||||
fParams.fSendMidiChannels = midi_input_ports; | fParams.fSendMidiChannels = midi_input_ports; | ||||
@@ -70,23 +70,26 @@ namespace Jack | |||||
const char* capture_driver_name, const char* playback_driver_name, | const char* capture_driver_name, const char* playback_driver_name, | ||||
jack_nframes_t capture_latency, jack_nframes_t playback_latency ) | jack_nframes_t capture_latency, jack_nframes_t playback_latency ) | ||||
{ | { | ||||
if (JackAudioDriver::Open(buffer_size, | |||||
samplerate, | |||||
capturing, | |||||
playing, | |||||
inchannels, | |||||
outchannels, | |||||
monitor, | |||||
capture_driver_name, | |||||
playback_driver_name, | |||||
capture_latency, | |||||
playback_latency ) == 0) { | |||||
if ( JackAudioDriver::Open ( buffer_size, | |||||
samplerate, | |||||
capturing, | |||||
playing, | |||||
inchannels, | |||||
outchannels, | |||||
monitor, | |||||
capture_driver_name, | |||||
playback_driver_name, | |||||
capture_latency, | |||||
playback_latency ) == 0 ) | |||||
{ | |||||
fEngineControl->fPeriod = 0; | fEngineControl->fPeriod = 0; | ||||
fEngineControl->fComputation = 500 * 1000; | fEngineControl->fComputation = 500 * 1000; | ||||
fEngineControl->fConstraint = 500 * 1000; | |||||
return 0; | |||||
} else { | |||||
return -1; | |||||
fEngineControl->fConstraint = 500 * 1000; | |||||
return 0; | |||||
} | |||||
else | |||||
{ | |||||
return -1; | |||||
} | } | ||||
} | } | ||||
@@ -194,8 +197,8 @@ namespace Jack | |||||
//allocate midi ports lists | //allocate midi ports lists | ||||
fMidiCapturePortList = new jack_port_id_t [fParams.fSendMidiChannels]; | fMidiCapturePortList = new jack_port_id_t [fParams.fSendMidiChannels]; | ||||
fMidiPlaybackPortList = new jack_port_id_t [fParams.fReturnMidiChannels]; | fMidiPlaybackPortList = new jack_port_id_t [fParams.fReturnMidiChannels]; | ||||
assert(fMidiCapturePortList); | |||||
assert(fMidiPlaybackPortList); | |||||
assert ( fMidiCapturePortList ); | |||||
assert ( fMidiPlaybackPortList ); | |||||
return true; | return true; | ||||
} | } | ||||
@@ -573,8 +576,8 @@ namespace Jack | |||||
{ | { | ||||
jack_driver_desc_t* desc = ( jack_driver_desc_t* ) calloc ( 1, sizeof ( jack_driver_desc_t ) ); | jack_driver_desc_t* desc = ( jack_driver_desc_t* ) calloc ( 1, sizeof ( jack_driver_desc_t ) ); | ||||
strcpy(desc->name, "net"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | |||||
strcpy(desc->desc, "netjack slave backend component"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 | |||||
strcpy ( desc->name, "net" ); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | |||||
strcpy ( desc->desc, "netjack slave backend component" ); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 | |||||
desc->nparams = 10; | desc->nparams = 10; | ||||
desc->params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) ); | desc->params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) ); | ||||
@@ -728,21 +731,27 @@ namespace Jack | |||||
} | } | ||||
} | } | ||||
try { | |||||
try | |||||
{ | |||||
Jack::JackDriverClientInterface* driver = | Jack::JackDriverClientInterface* driver = | ||||
new Jack::JackWaitThreadedDriver( | |||||
new Jack::JackNetDriver("system", "net_pcm", engine, table, multicast_ip, udp_port, mtu, | |||||
midi_input_ports, midi_output_ports, net_name, transport_sync, network_mode)); | |||||
if (driver->Open (period_size, sample_rate, 1, 1, audio_capture_ports, audio_playback_ports, | |||||
monitor, "from_master_", "to_master_", 0, 0) == 0) { | |||||
new Jack::JackWaitThreadedDriver ( | |||||
new Jack::JackNetDriver ( "system", "net_pcm", engine, table, multicast_ip, udp_port, mtu, | |||||
midi_input_ports, midi_output_ports, net_name, transport_sync, network_mode ) ); | |||||
if ( driver->Open ( period_size, sample_rate, 1, 1, audio_capture_ports, audio_playback_ports, | |||||
monitor, "from_master_", "to_master_", 0, 0 ) == 0 ) | |||||
{ | |||||
return driver; | return driver; | ||||
} else { | |||||
} | |||||
else | |||||
{ | |||||
delete driver; | delete driver; | ||||
return NULL; | return NULL; | ||||
} | } | ||||
} catch (...) { | |||||
} | |||||
catch ( ... ) | |||||
{ | |||||
return NULL; | return NULL; | ||||
} | } | ||||
} | } | ||||
@@ -170,8 +170,8 @@ namespace Jack | |||||
//network buffers | //network buffers | ||||
fTxBuffer = new char[fParams.fMtu]; | fTxBuffer = new char[fParams.fMtu]; | ||||
fRxBuffer = new char[fParams.fMtu]; | fRxBuffer = new char[fParams.fMtu]; | ||||
assert(fTxBuffer); | |||||
assert(fRxBuffer); | |||||
assert ( fTxBuffer ); | |||||
assert ( fRxBuffer ); | |||||
//net audio/midi buffers'addresses | //net audio/midi buffers'addresses | ||||
fTxData = fTxBuffer + sizeof ( packet_header_t ); | fTxData = fTxBuffer + sizeof ( packet_header_t ); | ||||
@@ -272,14 +272,14 @@ namespace Jack | |||||
//midi net buffers | //midi net buffers | ||||
fNetMidiCaptureBuffer = new NetMidiBuffer ( &fParams, fParams.fSendMidiChannels, fTxData ); | fNetMidiCaptureBuffer = new NetMidiBuffer ( &fParams, fParams.fSendMidiChannels, fTxData ); | ||||
fNetMidiPlaybackBuffer = new NetMidiBuffer ( &fParams, fParams.fReturnMidiChannels, fRxData ); | fNetMidiPlaybackBuffer = new NetMidiBuffer ( &fParams, fParams.fReturnMidiChannels, fRxData ); | ||||
assert(fNetMidiCaptureBuffer); | |||||
assert(fNetMidiPlaybackBuffer); | |||||
assert ( fNetMidiCaptureBuffer ); | |||||
assert ( fNetMidiPlaybackBuffer ); | |||||
//audio net buffers | //audio net buffers | ||||
fNetAudioCaptureBuffer = new NetAudioBuffer ( &fParams, fParams.fSendAudioChannels, fTxData ); | fNetAudioCaptureBuffer = new NetAudioBuffer ( &fParams, fParams.fSendAudioChannels, fTxData ); | ||||
fNetAudioPlaybackBuffer = new NetAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fRxData ); | fNetAudioPlaybackBuffer = new NetAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fRxData ); | ||||
assert(fNetAudioCaptureBuffer); | |||||
assert(fNetAudioPlaybackBuffer); | |||||
assert ( fNetAudioCaptureBuffer ); | |||||
assert ( fNetAudioPlaybackBuffer ); | |||||
//audio netbuffer length | //audio netbuffer length | ||||
fAudioTxLen = sizeof ( packet_header_t ) + fNetAudioPlaybackBuffer->GetSize(); | fAudioTxLen = sizeof ( packet_header_t ) + fNetAudioPlaybackBuffer->GetSize(); | ||||
@@ -292,7 +292,7 @@ namespace Jack | |||||
//stop process | //stop process | ||||
fRunning = false; | fRunning = false; | ||||
//send a 'multicast euthanasia request' - new socket is required on macosx | //send a 'multicast euthanasia request' - new socket is required on macosx | ||||
jack_info ( "Exiting '%s'", fParams.fName ); | jack_info ( "Exiting '%s'", fParams.fName ); | ||||
SetPacketType ( &fParams, KILL_MASTER ); | SetPacketType ( &fParams, KILL_MASTER ); | ||||
@@ -302,7 +302,7 @@ namespace Jack | |||||
if ( mcast_socket.SendTo ( &fParams, sizeof ( session_params_t ), 0, fMulticastIP ) == SOCKET_ERROR ) | if ( mcast_socket.SendTo ( &fParams, sizeof ( session_params_t ), 0, fMulticastIP ) == SOCKET_ERROR ) | ||||
jack_error ( "Can't send suicide request : %s", StrError ( NET_ERROR_CODE ) ); | jack_error ( "Can't send suicide request : %s", StrError ( NET_ERROR_CODE ) ); | ||||
mcast_socket.Close(); | mcast_socket.Close(); | ||||
// UGLY temporary way to be sure the thread does not call code possibly causing a deadlock in JackEngine. | // UGLY temporary way to be sure the thread does not call code possibly causing a deadlock in JackEngine. | ||||
ThreadExit(); | ThreadExit(); | ||||
} | } | ||||
@@ -423,7 +423,7 @@ namespace Jack | |||||
else | else | ||||
rx_bytes = Recv ( rx_head->fPacketSize, 0 ); | rx_bytes = Recv ( rx_head->fPacketSize, 0 ); | ||||
break; | break; | ||||
case 'n' : | case 'n' : | ||||
//normal use of the network : | //normal use of the network : | ||||
// - extra latency is set to one cycle, what is the time needed to receive streams using full network bandwidth | // - extra latency is set to one cycle, what is the time needed to receive streams using full network bandwidth | ||||
@@ -434,7 +434,7 @@ namespace Jack | |||||
else | else | ||||
rx_bytes = Recv ( rx_head->fPacketSize, 0 ); | rx_bytes = Recv ( rx_head->fPacketSize, 0 ); | ||||
break; | break; | ||||
case 'f' : | case 'f' : | ||||
//fast mode suppose the network bandwith is larger than required for the transmission (only a few channels for example) | //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 | // - packets can be quickly received, quickly is here relative to the cycle duration | ||||
@@ -445,7 +445,7 @@ namespace Jack | |||||
jack_error ( "'%s' can't run in fast network mode, data received too late (%d cycle(s) offset)", fParams.fName, cycle_offset ); | jack_error ( "'%s' can't run in fast network mode, data received too late (%d cycle(s) offset)", fParams.fName, cycle_offset ); | ||||
break; | break; | ||||
} | } | ||||
fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; | fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; | ||||
return rx_bytes; | return rx_bytes; | ||||
} | } | ||||
@@ -484,7 +484,7 @@ namespace Jack | |||||
fNetMidiPlaybackBuffer->RenderToJackPorts(); | fNetMidiPlaybackBuffer->RenderToJackPorts(); | ||||
jumpcnt = 0; | jumpcnt = 0; | ||||
break; | break; | ||||
case 'a': //audio | case 'a': //audio | ||||
Recv ( rx_head->fPacketSize, 0 ); | Recv ( rx_head->fPacketSize, 0 ); | ||||
if ( !IsNextPacket() ) | if ( !IsNextPacket() ) | ||||
@@ -495,7 +495,7 @@ namespace Jack | |||||
fNetAudioPlaybackBuffer->RenderToJackPorts ( rx_head->fSubCycle ); | fNetAudioPlaybackBuffer->RenderToJackPorts ( rx_head->fSubCycle ); | ||||
jumpcnt = 0; | jumpcnt = 0; | ||||
break; | break; | ||||
case 's': //sync | case 's': //sync | ||||
if ( rx_head->fCycle == fTxHeader.fCycle ) | if ( rx_head->fCycle == fTxHeader.fCycle ) | ||||
return 0; | return 0; | ||||
@@ -722,7 +722,7 @@ namespace Jack | |||||
if ( ++recvd_midi_pckt == rx_head->fNMidiPckt ) | if ( ++recvd_midi_pckt == rx_head->fNMidiPckt ) | ||||
fNetMidiCaptureBuffer->RenderToJackPorts(); | fNetMidiCaptureBuffer->RenderToJackPorts(); | ||||
break; | break; | ||||
case 'a': //audio | case 'a': //audio | ||||
rx_bytes = Recv ( rx_head->fPacketSize, 0 ); | rx_bytes = Recv ( rx_head->fPacketSize, 0 ); | ||||
if ( !IsNextPacket() ) | if ( !IsNextPacket() ) | ||||
@@ -732,7 +732,7 @@ namespace Jack | |||||
fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; | fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; | ||||
fNetAudioCaptureBuffer->RenderToJackPorts ( rx_head->fSubCycle ); | fNetAudioCaptureBuffer->RenderToJackPorts ( rx_head->fSubCycle ); | ||||
break; | break; | ||||
case 's': //sync | case 's': //sync | ||||
jack_info ( "NetSlave : overloaded, skipping receive." ); | jack_info ( "NetSlave : overloaded, skipping receive." ); | ||||
return 0; | return 0; | ||||
@@ -21,6 +21,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
#ifndef __JackNetInterface__ | #ifndef __JackNetInterface__ | ||||
#define __JackNetInterface__ | #define __JackNetInterface__ | ||||
#ifdef HAVE_CONFIG_H | |||||
#include "config.h" | |||||
#endif | |||||
#include "JackNetTool.h" | #include "JackNetTool.h" | ||||
namespace Jack | namespace Jack | ||||
@@ -148,8 +152,10 @@ namespace Jack | |||||
JackNetSlaveInterface() : JackNetInterface() | JackNetSlaveInterface() : JackNetInterface() | ||||
{ | { | ||||
//open Socket API with the first slave | //open Socket API with the first slave | ||||
if (fSlaveCounter++ == 0) { | |||||
if (SocketAPIInit() < 0) { | |||||
if ( fSlaveCounter++ == 0 ) | |||||
{ | |||||
if ( SocketAPIInit() < 0 ) | |||||
{ | |||||
jack_error ( "Can't init Socket API, exiting..." ); | jack_error ( "Can't init Socket API, exiting..." ); | ||||
throw -1; | throw -1; | ||||
} | } | ||||
@@ -158,8 +164,10 @@ namespace Jack | |||||
JackNetSlaveInterface ( const char* ip, int port ) : JackNetInterface ( ip, port ) | JackNetSlaveInterface ( const char* ip, int port ) : JackNetInterface ( ip, port ) | ||||
{ | { | ||||
//open Socket API with the first slave | //open Socket API with the first slave | ||||
if (fSlaveCounter++ == 0) { | |||||
if (SocketAPIInit() < 0) { | |||||
if ( fSlaveCounter++ == 0 ) | |||||
{ | |||||
if ( SocketAPIInit() < 0 ) | |||||
{ | |||||
jack_error ( "Can't init Socket API, exiting..." ); | jack_error ( "Can't init Socket API, exiting..." ); | ||||
throw -1; | throw -1; | ||||
} | } | ||||
@@ -16,10 +16,6 @@ along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
*/ | */ | ||||
#if defined(HAVE_CONFIG_H) | |||||
#include "config.h" | |||||
#endif | |||||
#include "JackNetManager.h" | #include "JackNetManager.h" | ||||
using namespace std; | using namespace std; | ||||
@@ -696,9 +692,9 @@ extern "C" | |||||
jack_driver_desc_t *desc; | jack_driver_desc_t *desc; | ||||
desc = ( jack_driver_desc_t* ) calloc ( 1, sizeof ( jack_driver_desc_t ) ); | desc = ( jack_driver_desc_t* ) calloc ( 1, sizeof ( jack_driver_desc_t ) ); | ||||
strcpy(desc->name, "netmanager"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | |||||
strcpy(desc->desc, "netjack multi-cast master component"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 | |||||
strcpy ( desc->name, "netmanager" ); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | |||||
strcpy ( desc->desc, "netjack multi-cast master component" ); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 | |||||
desc->nparams = 2; | desc->nparams = 2; | ||||
desc->params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) ); | desc->params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) ); | ||||
@@ -740,19 +736,20 @@ extern "C" | |||||
{ | { | ||||
JSList* params = NULL; | JSList* params = NULL; | ||||
jack_driver_desc_t* desc = jack_get_descriptor(); | jack_driver_desc_t* desc = jack_get_descriptor(); | ||||
Jack::JackArgParser parser(load_init); | |||||
if (parser.GetArgc() > 0) | |||||
parser.ParseParams(desc, ¶ms); | |||||
int res = jack_internal_initialize(jack_client, params); | |||||
parser.FreeParams(params); | |||||
Jack::JackArgParser parser ( load_init ); | |||||
if ( parser.GetArgc() > 0 ) | |||||
parser.ParseParams ( desc, ¶ms ); | |||||
int res = jack_internal_initialize ( jack_client, params ); | |||||
parser.FreeParams ( params ); | |||||
return res; | return res; | ||||
} | } | ||||
SERVER_EXPORT void jack_finish ( void* arg ) | SERVER_EXPORT void jack_finish ( void* arg ) | ||||
{ | { | ||||
if (master_manager) { | |||||
if ( master_manager ) | |||||
{ | |||||
jack_log ( "Unloading Master Manager" ); | jack_log ( "Unloading Master Manager" ); | ||||
delete master_manager; | delete master_manager; | ||||
master_manager = NULL; | master_manager = NULL; | ||||