@@ -25,19 +25,19 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
namespace Jack | namespace Jack | ||||
{ | { | ||||
JackNetAdapter::JackNetAdapter ( jack_client_t* jack_client, jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params ) | |||||
: JackAudioAdapterInterface ( buffer_size, sample_rate), JackNetSlaveInterface(), fThread ( this ) | |||||
JackNetAdapter::JackNetAdapter(jack_client_t* jack_client, jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params) | |||||
: JackAudioAdapterInterface(buffer_size, sample_rate), JackNetSlaveInterface(), fThread(this) | |||||
{ | { | ||||
jack_log ( "JackNetAdapter::JackNetAdapter" ); | |||||
jack_log("JackNetAdapter::JackNetAdapter"); | |||||
//global parametering | //global parametering | ||||
//we can't call JackNetSlaveInterface constructor with some parameters before | //we can't call JackNetSlaveInterface constructor with some parameters before | ||||
//because we don't have full parametering right now | //because we don't have full parametering right now | ||||
//parameters will be parsed from the param list, and then JackNetSlaveInterface will be filled with proper values | //parameters will be parsed from the param list, and then JackNetSlaveInterface will be filled with proper values | ||||
strcpy ( fMulticastIP, DEFAULT_MULTICAST_IP ); | |||||
strcpy(fMulticastIP, DEFAULT_MULTICAST_IP); | |||||
uint port = DEFAULT_PORT; | uint port = DEFAULT_PORT; | ||||
GetHostName ( fParams.fName, JACK_CLIENT_NAME_SIZE ); | |||||
fSocket.GetName ( fParams.fSlaveNetName ); | |||||
GetHostName(fParams.fName, JACK_CLIENT_NAME_SIZE); | |||||
fSocket.GetName(fParams.fSlaveNetName); | |||||
fParams.fMtu = DEFAULT_MTU; | fParams.fMtu = DEFAULT_MTU; | ||||
fParams.fTransportSync = 0; | fParams.fTransportSync = 0; | ||||
int send_audio = -1; | int send_audio = -1; | ||||
@@ -53,19 +53,19 @@ namespace Jack | |||||
//options parsing | //options parsing | ||||
const JSList* node; | const JSList* node; | ||||
const jack_driver_param_t* param; | const jack_driver_param_t* param; | ||||
for ( node = params; node; node = jack_slist_next ( node ) ) | |||||
for (node = params; node; node = jack_slist_next(node)) | |||||
{ | { | ||||
param = ( const jack_driver_param_t* ) node->data; | |||||
switch ( param->character ) | |||||
param = (const jack_driver_param_t*) node->data; | |||||
switch (param->character) | |||||
{ | { | ||||
case 'a' : | case 'a' : | ||||
if (strlen (param->value.str) < 32) | |||||
if (strlen(param->value.str) < 32) | |||||
strcpy(fMulticastIP, param->value.str); | strcpy(fMulticastIP, param->value.str); | ||||
else | else | ||||
jack_error("Can't use multicast address %s, using default %s", param->value.ui, DEFAULT_MULTICAST_IP); | jack_error("Can't use multicast address %s, using default %s", param->value.ui, DEFAULT_MULTICAST_IP); | ||||
break; | break; | ||||
case 'p' : | case 'p' : | ||||
fSocket.SetPort ( param->value.ui ); | |||||
fSocket.SetPort(param->value.ui); | |||||
break; | break; | ||||
case 'M' : | case 'M' : | ||||
fParams.fMtu = param->value.i; | fParams.fMtu = param->value.i; | ||||
@@ -77,20 +77,30 @@ namespace Jack | |||||
return_audio = param->value.i; | return_audio = param->value.i; | ||||
break; | break; | ||||
case 'n' : | case 'n' : | ||||
strncpy ( fParams.fName, param->value.str, JACK_CLIENT_NAME_SIZE ); | |||||
strncpy(fParams.fName, param->value.str, JACK_CLIENT_NAME_SIZE); | |||||
break; | break; | ||||
case 't' : | case 't' : | ||||
//fParams.fTransportSync = param->value.ui; | //fParams.fTransportSync = param->value.ui; | ||||
break; | break; | ||||
#if HAVE_CELT | |||||
case 'c': | |||||
if (param->value.i > 0) { | |||||
fParams.fSampleEncoder = JackCeltEncoder; | |||||
fParams.fKBps = param->value.i; | |||||
} else { | |||||
fParams.fSampleEncoder = JackFloatEncoder; | |||||
} | |||||
break; | |||||
#endif | |||||
case 'm' : | case 'm' : | ||||
if ( strcmp ( param->value.str, "normal" ) == 0 ) | |||||
if (strcmp(param->value.str, "normal") == 0) | |||||
fParams.fNetworkMode = 'n'; | fParams.fNetworkMode = 'n'; | ||||
else if ( strcmp ( param->value.str, "slow" ) == 0 ) | |||||
else if (strcmp(param->value.str, "slow") == 0) | |||||
fParams.fNetworkMode = 's'; | fParams.fNetworkMode = 's'; | ||||
else if ( strcmp ( param->value.str, "fast" ) == 0 ) | |||||
else if (strcmp(param->value.str, "fast") == 0) | |||||
fParams.fNetworkMode = 'f'; | fParams.fNetworkMode = 'f'; | ||||
else | else | ||||
jack_error ( "Unknown network mode, using 'normal' mode." ); | |||||
jack_error("Unknown network mode, using 'normal' mode."); | |||||
break; | break; | ||||
case 'q': | case 'q': | ||||
fQuality = param->value.ui; | fQuality = param->value.ui; | ||||
@@ -103,18 +113,18 @@ namespace Jack | |||||
} | } | ||||
//set the socket parameters | //set the socket parameters | ||||
fSocket.SetPort ( port ); | |||||
fSocket.SetAddress ( fMulticastIP, port ); | |||||
fSocket.SetPort(port); | |||||
fSocket.SetAddress(fMulticastIP, port); | |||||
// If not set, takes deafault | // If not set, takes deafault | ||||
fParams.fSendAudioChannels = (send_audio == -1) ? 2 : send_audio; | fParams.fSendAudioChannels = (send_audio == -1) ? 2 : send_audio; | ||||
// If not set, takes deafault | // If not set, takes deafault | ||||
fParams.fReturnAudioChannels = (return_audio == -1) ? 2 : return_audio; | fParams.fReturnAudioChannels = (return_audio == -1) ? 2 : return_audio; | ||||
//set the audio adapter interface channel values | //set the audio adapter interface channel values | ||||
SetInputs ( fParams.fSendAudioChannels ); | |||||
SetOutputs ( fParams.fReturnAudioChannels ); | |||||
SetInputs(fParams.fSendAudioChannels); | |||||
SetOutputs(fParams.fReturnAudioChannels); | |||||
//soft buffers will be allocated later (once network initialization done) | //soft buffers will be allocated later (once network initialization done) | ||||
fSoftCaptureBuffer = NULL; | fSoftCaptureBuffer = NULL; | ||||
@@ -123,18 +133,16 @@ namespace Jack | |||||
JackNetAdapter::~JackNetAdapter() | JackNetAdapter::~JackNetAdapter() | ||||
{ | { | ||||
jack_log ("JackNetAdapter::~JackNetAdapter"); | |||||
jack_log("JackNetAdapter::~JackNetAdapter"); | |||||
int port_index; | int port_index; | ||||
if (fSoftCaptureBuffer) | |||||
{ | |||||
if (fSoftCaptureBuffer) { | |||||
for (port_index = 0; port_index < fCaptureChannels; port_index++) | for (port_index = 0; port_index < fCaptureChannels; port_index++) | ||||
delete[] fSoftCaptureBuffer[port_index]; | delete[] fSoftCaptureBuffer[port_index]; | ||||
delete[] fSoftCaptureBuffer; | delete[] fSoftCaptureBuffer; | ||||
} | } | ||||
if (fSoftPlaybackBuffer) | |||||
{ | |||||
for ( port_index = 0; port_index < fPlaybackChannels; port_index++) | |||||
if (fSoftPlaybackBuffer) { | |||||
for (port_index = 0; port_index < fPlaybackChannels; port_index++) | |||||
delete[] fSoftPlaybackBuffer[port_index]; | delete[] fSoftPlaybackBuffer[port_index]; | ||||
delete[] fSoftPlaybackBuffer; | delete[] fSoftPlaybackBuffer; | ||||
} | } | ||||
@@ -143,14 +151,13 @@ namespace Jack | |||||
//open/close-------------------------------------------------------------------------- | //open/close-------------------------------------------------------------------------- | ||||
int JackNetAdapter::Open() | int JackNetAdapter::Open() | ||||
{ | { | ||||
jack_log ( "JackNetAdapter::Open" ); | |||||
jack_log("JackNetAdapter::Open"); | |||||
jack_info ( "NetAdapter started in %s mode %s Master's transport sync.", | |||||
( fParams.fSlaveSyncMode ) ? "sync" : "async", ( fParams.fTransportSync ) ? "with" : "without" ); | |||||
jack_info("NetAdapter started in %s mode %s Master's transport sync.", | |||||
(fParams.fSlaveSyncMode) ? "sync" : "async", (fParams.fTransportSync) ? "with" : "without"); | |||||
if ( fThread.StartSync() < 0 ) | |||||
{ | |||||
jack_error ( "Cannot start netadapter thread" ); | |||||
if (fThread.StartSync() < 0) { | |||||
jack_error("Cannot start netadapter thread"); | |||||
return -1; | return -1; | ||||
} | } | ||||
@@ -159,30 +166,28 @@ namespace Jack | |||||
int JackNetAdapter::Close() | int JackNetAdapter::Close() | ||||
{ | { | ||||
jack_log ( "JackNetAdapter::Close" ); | |||||
jack_log("JackNetAdapter::Close"); | |||||
#ifdef JACK_MONITOR | #ifdef JACK_MONITOR | ||||
fTable.Save(fHostBufferSize, fHostSampleRate, fAdaptedSampleRate, fAdaptedBufferSize); | fTable.Save(fHostBufferSize, fHostSampleRate, fAdaptedSampleRate, fAdaptedBufferSize); | ||||
#endif | #endif | ||||
fSocket.Close(); | fSocket.Close(); | ||||
switch ( fThread.GetStatus() ) | |||||
switch (fThread.GetStatus()) | |||||
{ | { | ||||
// Kill the thread in Init phase | // Kill the thread in Init phase | ||||
case JackThread::kStarting: | case JackThread::kStarting: | ||||
case JackThread::kIniting: | case JackThread::kIniting: | ||||
if ( fThread.Kill() < 0 ) | |||||
{ | |||||
jack_error ( "Cannot kill thread" ); | |||||
if (fThread.Kill() < 0) { | |||||
jack_error("Cannot kill thread"); | |||||
return -1; | return -1; | ||||
} | } | ||||
break; | break; | ||||
// Stop when the thread cycle is finished | // Stop when the thread cycle is finished | ||||
case JackThread::kRunning: | case JackThread::kRunning: | ||||
if ( fThread.Stop() < 0 ) | |||||
{ | |||||
jack_error ( "Cannot stop thread" ); | |||||
if (fThread.Stop() < 0) { | |||||
jack_error ("Cannot stop thread"); | |||||
return -1; | return -1; | ||||
} | } | ||||
break; | break; | ||||
@@ -194,55 +199,55 @@ namespace Jack | |||||
return 0; | return 0; | ||||
} | } | ||||
int JackNetAdapter::SetBufferSize ( jack_nframes_t buffer_size ) | |||||
int JackNetAdapter::SetBufferSize(jack_nframes_t buffer_size) | |||||
{ | { | ||||
JackAudioAdapterInterface::SetHostBufferSize ( buffer_size ); | |||||
JackAudioAdapterInterface::SetHostBufferSize(buffer_size); | |||||
return 0; | return 0; | ||||
} | } | ||||
//thread------------------------------------------------------------------------------ | //thread------------------------------------------------------------------------------ | ||||
// TODO : if failure, thread exist... need to restart ? | // TODO : if failure, thread exist... need to restart ? | ||||
bool JackNetAdapter::Init() | bool JackNetAdapter::Init() | ||||
{ | { | ||||
jack_log ( "JackNetAdapter::Init" ); | |||||
jack_log("JackNetAdapter::Init"); | |||||
int port_index; | int port_index; | ||||
//init network connection | //init network connection | ||||
if (!JackNetSlaveInterface::Init()) { | if (!JackNetSlaveInterface::Init()) { | ||||
jack_error("JackNetSlaveInterface::Init() error..." ); | |||||
jack_error("JackNetSlaveInterface::Init() error..."); | |||||
return false; | return false; | ||||
} | } | ||||
//then set global parameters | //then set global parameters | ||||
if (!SetParams()) { | if (!SetParams()) { | ||||
jack_error("SetParams error..." ); | |||||
jack_error("SetParams error..."); | |||||
return false; | return false; | ||||
} | } | ||||
//set buffers | //set buffers | ||||
if (fCaptureChannels > 0) { | if (fCaptureChannels > 0) { | ||||
fSoftCaptureBuffer = new sample_t*[fCaptureChannels]; | fSoftCaptureBuffer = new sample_t*[fCaptureChannels]; | ||||
for ( port_index = 0; port_index < fCaptureChannels; port_index++ ) | |||||
for (port_index = 0; port_index < fCaptureChannels; port_index++) | |||||
{ | { | ||||
fSoftCaptureBuffer[port_index] = new sample_t[fParams.fPeriodSize]; | fSoftCaptureBuffer[port_index] = new sample_t[fParams.fPeriodSize]; | ||||
fNetAudioCaptureBuffer->SetBuffer ( port_index, fSoftCaptureBuffer[port_index] ); | |||||
fNetAudioCaptureBuffer->SetBuffer(port_index, fSoftCaptureBuffer[port_index]); | |||||
} | } | ||||
} | } | ||||
if (fPlaybackChannels > 0) { | if (fPlaybackChannels > 0) { | ||||
fSoftPlaybackBuffer = new sample_t*[fPlaybackChannels]; | fSoftPlaybackBuffer = new sample_t*[fPlaybackChannels]; | ||||
for ( port_index = 0; port_index < fPlaybackChannels; port_index++ ) | |||||
for (port_index = 0; port_index < fPlaybackChannels; port_index++) | |||||
{ | { | ||||
fSoftPlaybackBuffer[port_index] = new sample_t[fParams.fPeriodSize]; | fSoftPlaybackBuffer[port_index] = new sample_t[fParams.fPeriodSize]; | ||||
fNetAudioPlaybackBuffer->SetBuffer ( port_index, fSoftPlaybackBuffer[port_index] ); | |||||
fNetAudioPlaybackBuffer->SetBuffer(port_index, fSoftPlaybackBuffer[port_index]); | |||||
} | } | ||||
} | } | ||||
//set audio adapter parameters | //set audio adapter parameters | ||||
SetAdaptedBufferSize ( fParams.fPeriodSize ); | |||||
SetAdaptedSampleRate ( fParams.fSampleRate ); | |||||
SetAdaptedBufferSize(fParams.fPeriodSize); | |||||
SetAdaptedSampleRate(fParams.fSampleRate); | |||||
// Will do "something" on OSX only... | // Will do "something" on OSX only... | ||||
fThread.SetParams(GetEngineControl()->fPeriod, GetEngineControl()->fComputation, GetEngineControl()->fConstraint); | fThread.SetParams(GetEngineControl()->fPeriod, GetEngineControl()->fComputation, GetEngineControl()->fConstraint); | ||||
@@ -254,7 +259,7 @@ namespace Jack | |||||
} | } | ||||
//init done, display parameters | //init done, display parameters | ||||
SessionParamsDisplay ( &fParams ); | |||||
SessionParamsDisplay(&fParams); | |||||
return true; | return true; | ||||
} | } | ||||
@@ -287,26 +292,25 @@ namespace Jack | |||||
//TODO : we need here to get the actual timebase master to eventually release it from its duty (see JackNetDriver) | //TODO : we need here to get the actual timebase master to eventually release it from its duty (see JackNetDriver) | ||||
//is there a new transport state ? | //is there a new transport state ? | ||||
if ( fSendTransportData.fNewState && ( fSendTransportData.fState != jack_transport_query ( fJackClient, NULL ) ) ) | |||||
{ | |||||
switch ( fSendTransportData.fState ) | |||||
if (fSendTransportData.fNewState &&(fSendTransportData.fState != jack_transport_query(fJackClient, NULL))) { | |||||
switch (fSendTransportData.fState) | |||||
{ | { | ||||
case JackTransportStopped : | case JackTransportStopped : | ||||
jack_transport_stop ( fJackClient ); | |||||
jack_info ( "NetMaster : transport stops." ); | |||||
jack_transport_stop(fJackClient); | |||||
jack_info("NetMaster : transport stops."); | |||||
break; | break; | ||||
case JackTransportStarting : | case JackTransportStarting : | ||||
jack_transport_reposition ( fJackClient, &fSendTransportData.fPosition ); | |||||
jack_transport_start ( fJackClient ); | |||||
jack_info ( "NetMaster : transport starts." ); | |||||
jack_transport_reposition(fJackClient, &fSendTransportData.fPosition); | |||||
jack_transport_start(fJackClient); | |||||
jack_info("NetMaster : transport starts."); | |||||
break; | break; | ||||
case JackTransportRolling : | case JackTransportRolling : | ||||
//TODO , we need to : | //TODO , we need to : | ||||
// - find a way to call TransportEngine->SetNetworkSync() | // - find a way to call TransportEngine->SetNetworkSync() | ||||
// - turn the transport state to JackTransportRolling | // - turn the transport state to JackTransportRolling | ||||
jack_info ( "NetMaster : transport rolls." ); | |||||
jack_info("NetMaster : transport rolls."); | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
@@ -318,33 +322,29 @@ namespace Jack | |||||
int refnum = -1; | int refnum = -1; | ||||
bool conditional = 0; | bool conditional = 0; | ||||
//TODO : get the actual timebase master | //TODO : get the actual timebase master | ||||
if ( refnum != fLastTimebaseMaster ) | |||||
{ | |||||
if (refnum != fLastTimebaseMaster) { | |||||
//timebase master has released its function | //timebase master has released its function | ||||
if ( refnum == -1 ) | |||||
{ | |||||
if (refnum == -1) { | |||||
fReturnTransportData.fTimebaseMaster = RELEASE_TIMEBASEMASTER; | fReturnTransportData.fTimebaseMaster = RELEASE_TIMEBASEMASTER; | ||||
jack_info ( "Sending a timebase master release request." ); | |||||
} | |||||
//there is a new timebase master | |||||
else | |||||
{ | |||||
fReturnTransportData.fTimebaseMaster = ( conditional ) ? CONDITIONAL_TIMEBASEMASTER : TIMEBASEMASTER; | |||||
jack_info ( "Sending a %s timebase master request.", ( conditional ) ? "conditional" : "non-conditional" ); | |||||
jack_info("Sending a timebase master release request."); | |||||
} else { | |||||
//there is a new timebase master | |||||
fReturnTransportData.fTimebaseMaster = (conditional) ? CONDITIONAL_TIMEBASEMASTER : TIMEBASEMASTER; | |||||
jack_info("Sending a %s timebase master request.", (conditional) ? "conditional" : "non-conditional"); | |||||
} | } | ||||
fLastTimebaseMaster = refnum; | fLastTimebaseMaster = refnum; | ||||
} | |||||
else | |||||
} else { | |||||
fReturnTransportData.fTimebaseMaster = NO_CHANGE; | fReturnTransportData.fTimebaseMaster = NO_CHANGE; | ||||
} | |||||
//update transport state and position | //update transport state and position | ||||
fReturnTransportData.fState = jack_transport_query ( fJackClient, &fReturnTransportData.fPosition ); | |||||
fReturnTransportData.fState = jack_transport_query(fJackClient, &fReturnTransportData.fPosition); | |||||
//is it a new state (that the master need to know...) ? | //is it a new state (that the master need to know...) ? | ||||
fReturnTransportData.fNewState = ( ( fReturnTransportData.fState != fLastTransportState ) && | |||||
( fReturnTransportData.fState != fSendTransportData.fState ) ); | |||||
if ( fReturnTransportData.fNewState ) | |||||
jack_info ( "Sending transport state '%s'.", GetTransportState ( fReturnTransportData.fState ) ); | |||||
fReturnTransportData.fNewState = ((fReturnTransportData.fState != fLastTransportState) && | |||||
(fReturnTransportData.fState != fSendTransportData.fState)); | |||||
if (fReturnTransportData.fNewState) | |||||
jack_info("Sending transport state '%s'.", GetTransportState(fReturnTransportData.fState)); | |||||
fLastTransportState = fReturnTransportData.fState; | fLastTransportState = fReturnTransportData.fState; | ||||
} | } | ||||
@@ -353,7 +353,7 @@ namespace Jack | |||||
{ | { | ||||
//don't return -1 in case of sync recv failure | //don't return -1 in case of sync recv failure | ||||
//we need the process to continue for network error detection | //we need the process to continue for network error detection | ||||
if ( SyncRecv() == SOCKET_ERROR ) | |||||
if (SyncRecv() == SOCKET_ERROR) | |||||
return 0; | return 0; | ||||
DecodeSyncPacket(); | DecodeSyncPacket(); | ||||
@@ -364,7 +364,7 @@ namespace Jack | |||||
{ | { | ||||
EncodeSyncPacket(); | EncodeSyncPacket(); | ||||
if ( SyncSend() == SOCKET_ERROR ) | |||||
if (SyncSend() == SOCKET_ERROR) | |||||
return SOCKET_ERROR; | return SOCKET_ERROR; | ||||
return DataSend(); | return DataSend(); | ||||
@@ -403,77 +403,87 @@ extern "C" | |||||
SERVER_EXPORT jack_driver_desc_t* jack_get_descriptor() | SERVER_EXPORT jack_driver_desc_t* jack_get_descriptor() | ||||
{ | { | ||||
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, "netadapter"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | strcpy(desc->name, "netadapter"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | ||||
strcpy(desc->desc, "netjack net <==> audio backend adapter"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 | strcpy(desc->desc, "netjack net <==> audio backend adapter"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 | ||||
desc->nparams = 11; | |||||
desc->params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) ); | |||||
desc->nparams = 12; | |||||
desc->params = (jack_driver_param_desc_t*) calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); | |||||
int i = 0; | int i = 0; | ||||
strcpy ( desc->params[i].name, "multicast_ip" ); | |||||
strcpy(desc->params[i].name, "multicast_ip"); | |||||
desc->params[i].character = 'a'; | desc->params[i].character = 'a'; | ||||
desc->params[i].type = JackDriverParamString; | desc->params[i].type = JackDriverParamString; | ||||
strcpy ( desc->params[i].value.str, DEFAULT_MULTICAST_IP ); | |||||
strcpy ( desc->params[i].short_desc, "Multicast Address" ); | |||||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||||
strcpy(desc->params[i].value.str, DEFAULT_MULTICAST_IP); | |||||
strcpy(desc->params[i].short_desc, "Multicast Address"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | i++; | ||||
strcpy ( desc->params[i].name, "udp_net_port" ); | |||||
strcpy(desc->params[i].name, "udp_net_port"); | |||||
desc->params[i].character = 'p'; | desc->params[i].character = 'p'; | ||||
desc->params[i].type = JackDriverParamInt; | desc->params[i].type = JackDriverParamInt; | ||||
desc->params[i].value.i = DEFAULT_PORT; | desc->params[i].value.i = DEFAULT_PORT; | ||||
strcpy ( desc->params[i].short_desc, "UDP port" ); | |||||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||||
strcpy(desc->params[i].short_desc, "UDP port"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | i++; | ||||
strcpy ( desc->params[i].name, "mtu" ); | |||||
strcpy(desc->params[i].name, "mtu"); | |||||
desc->params[i].character = 'M'; | desc->params[i].character = 'M'; | ||||
desc->params[i].type = JackDriverParamInt; | desc->params[i].type = JackDriverParamInt; | ||||
desc->params[i].value.i = DEFAULT_MTU; | desc->params[i].value.i = DEFAULT_MTU; | ||||
strcpy ( desc->params[i].short_desc, "MTU to the master" ); | |||||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||||
strcpy(desc->params[i].short_desc, "MTU to the master"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | i++; | ||||
strcpy ( desc->params[i].name, "input-ports" ); | |||||
strcpy(desc->params[i].name, "input-ports"); | |||||
desc->params[i].character = 'C'; | desc->params[i].character = 'C'; | ||||
desc->params[i].type = JackDriverParamInt; | desc->params[i].type = JackDriverParamInt; | ||||
desc->params[i].value.i = 2; | desc->params[i].value.i = 2; | ||||
strcpy ( desc->params[i].short_desc, "Number of audio input ports" ); | |||||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||||
strcpy(desc->params[i].short_desc, "Number of audio input ports"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | i++; | ||||
strcpy ( desc->params[i].name, "output-ports" ); | |||||
strcpy(desc->params[i].name, "output-ports"); | |||||
desc->params[i].character = 'P'; | desc->params[i].character = 'P'; | ||||
desc->params[i].type = JackDriverParamInt; | desc->params[i].type = JackDriverParamInt; | ||||
desc->params[i].value.i = 2; | desc->params[i].value.i = 2; | ||||
strcpy ( desc->params[i].short_desc, "Number of audio output ports" ); | |||||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||||
strcpy(desc->params[i].short_desc, "Number of audio output ports"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
#if HAVE_CELT | |||||
i++; | i++; | ||||
strcpy ( desc->params[i].name, "client-name" ); | |||||
strcpy(desc->params[i].name, "celt"); | |||||
desc->params[i].character = 'c'; | |||||
desc->params[i].type = JackDriverParamInt; | |||||
desc->params[i].value.i = -1; | |||||
strcpy(desc->params[i].short_desc, "Set CELT encoding and number of kBits per channel"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
#endif | |||||
i++; | |||||
strcpy(desc->params[i].name, "client-name"); | |||||
desc->params[i].character = 'n'; | desc->params[i].character = 'n'; | ||||
desc->params[i].type = JackDriverParamString; | desc->params[i].type = JackDriverParamString; | ||||
strcpy ( desc->params[i].value.str, "'hostname'" ); | |||||
strcpy ( desc->params[i].short_desc, "Name of the jack client" ); | |||||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||||
strcpy(desc->params[i].value.str, "'hostname'"); | |||||
strcpy(desc->params[i].short_desc, "Name of the jack client"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | i++; | ||||
strcpy ( desc->params[i].name, "transport-sync" ); | |||||
strcpy(desc->params[i].name, "transport-sync"); | |||||
desc->params[i].character = 't'; | desc->params[i].character = 't'; | ||||
desc->params[i].type = JackDriverParamUInt; | desc->params[i].type = JackDriverParamUInt; | ||||
desc->params[i].value.ui = 1U; | desc->params[i].value.ui = 1U; | ||||
strcpy ( desc->params[i].short_desc, "Sync transport with master's" ); | |||||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||||
strcpy(desc->params[i].short_desc, "Sync transport with master's"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | i++; | ||||
strcpy ( desc->params[i].name, "mode" ); | |||||
strcpy(desc->params[i].name, "mode"); | |||||
desc->params[i].character = 'm'; | desc->params[i].character = 'm'; | ||||
desc->params[i].type = JackDriverParamString; | desc->params[i].type = JackDriverParamString; | ||||
strcpy ( desc->params[i].value.str, "slow" ); | |||||
strcpy ( desc->params[i].short_desc, "Slow, Normal or Fast mode." ); | |||||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||||
strcpy(desc->params[i].value.str, "slow"); | |||||
strcpy(desc->params[i].short_desc, "Slow, Normal or Fast mode."); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | i++; | ||||
strcpy(desc->params[i].name, "quality"); | strcpy(desc->params[i].name, "quality"); | ||||
@@ -492,28 +502,28 @@ extern "C" | |||||
strcpy(desc->params[i].long_desc, "Fixed ringbuffer size (if not set => automatic adaptative)"); | strcpy(desc->params[i].long_desc, "Fixed ringbuffer size (if not set => automatic adaptative)"); | ||||
i++; | i++; | ||||
strcpy ( desc->params[i].name, "auto-connect" ); | |||||
strcpy (desc->params[i].name, "auto-connect"); | |||||
desc->params[i].character = 'c'; | desc->params[i].character = 'c'; | ||||
desc->params[i].type = JackDriverParamBool; | desc->params[i].type = JackDriverParamBool; | ||||
desc->params[i].value.i = false; | desc->params[i].value.i = false; | ||||
strcpy ( desc->params[i].short_desc, "Auto connect netmaster to system ports" ); | |||||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||||
strcpy (desc->params[i].short_desc, "Auto connect netmaster to system ports"); | |||||
strcpy (desc->params[i].long_desc, desc->params[i].short_desc); | |||||
return desc; | return desc; | ||||
} | } | ||||
SERVER_EXPORT int jack_internal_initialize ( jack_client_t* jack_client, const JSList* params ) | |||||
SERVER_EXPORT int jack_internal_initialize(jack_client_t* jack_client, const JSList* params) | |||||
{ | { | ||||
jack_log ( "Loading netadapter" ); | |||||
jack_log("Loading netadapter"); | |||||
Jack::JackAudioAdapter* adapter; | Jack::JackAudioAdapter* adapter; | ||||
jack_nframes_t buffer_size = jack_get_buffer_size ( jack_client ); | |||||
jack_nframes_t sample_rate = jack_get_sample_rate ( jack_client ); | |||||
jack_nframes_t buffer_size = jack_get_buffer_size(jack_client); | |||||
jack_nframes_t sample_rate = jack_get_sample_rate(jack_client); | |||||
try { | try { | ||||
adapter = new Jack::JackAudioAdapter(jack_client, new Jack::JackNetAdapter(jack_client, buffer_size, sample_rate, params), params, false); | adapter = new Jack::JackAudioAdapter(jack_client, new Jack::JackNetAdapter(jack_client, buffer_size, sample_rate, params), params, false); | ||||
assert ( adapter ); | |||||
assert(adapter); | |||||
if (adapter->Open() == 0) { | if (adapter->Open() == 0) { | ||||
return 0; | return 0; | ||||
@@ -527,30 +537,30 @@ extern "C" | |||||
} | } | ||||
} | } | ||||
SERVER_EXPORT int jack_initialize ( jack_client_t* jack_client, const char* load_init ) | |||||
SERVER_EXPORT int jack_initialize(jack_client_t* jack_client, const char* load_init) | |||||
{ | { | ||||
JSList* params = NULL; | JSList* params = NULL; | ||||
bool parse_params = true; | bool parse_params = true; | ||||
int res = 1; | int res = 1; | ||||
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 ) | |||||
parse_params = parser.ParseParams ( desc, ¶ms ); | |||||
Jack::JackArgParser parser(load_init); | |||||
if (parser.GetArgc() > 0) | |||||
parse_params = parser.ParseParams(desc, ¶ms); | |||||
if (parse_params) { | if (parse_params) { | ||||
res = jack_internal_initialize ( jack_client, params ); | |||||
parser.FreeParams ( params ); | |||||
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) | |||||
{ | { | ||||
Jack::JackAudioAdapter* adapter = static_cast<Jack::JackAudioAdapter*> ( arg ); | |||||
Jack::JackAudioAdapter* adapter = static_cast<Jack::JackAudioAdapter*>(arg); | |||||
if (adapter) { | if (adapter) { | ||||
jack_log ( "Unloading netadapter" ); | |||||
jack_log("Unloading netadapter"); | |||||
adapter->Close(); | adapter->Close(); | ||||
delete adapter; | delete adapter; | ||||
} | } | ||||
@@ -27,22 +27,28 @@ using namespace std; | |||||
namespace Jack | namespace Jack | ||||
{ | { | ||||
JackNetDriver::JackNetDriver ( const char* name, const char* alias, JackLockedEngine* engine, JackSynchro* table, | |||||
const char* ip, int port, int mtu, int midi_input_ports, int midi_output_ports, | |||||
char* net_name, uint transport_sync, char network_mode ) | |||||
: JackAudioDriver ( name, alias, engine, table ), JackNetSlaveInterface ( ip, port ) | |||||
JackNetDriver::JackNetDriver(const char* name, const char* alias, JackLockedEngine* engine, JackSynchro* table, | |||||
const char* ip, int port, int mtu, int midi_input_ports, int midi_output_ports, | |||||
char* net_name, uint transport_sync, char network_mode, int celt_encoding) | |||||
: JackAudioDriver(name, alias, engine, table), JackNetSlaveInterface(ip, port) | |||||
{ | { | ||||
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; | ||||
fParams.fReturnMidiChannels = midi_output_ports; | fParams.fReturnMidiChannels = midi_output_ports; | ||||
strcpy ( fParams.fName, net_name ); | |||||
fSocket.GetName ( fParams.fSlaveNetName ); | |||||
if (celt_encoding > 0) { | |||||
fParams.fSampleEncoder = JackCeltEncoder; | |||||
fParams.fKBps = celt_encoding; | |||||
} else { | |||||
fParams.fSampleEncoder = JackFloatEncoder; | |||||
} | |||||
strcpy(fParams.fName, net_name); | |||||
fSocket.GetName(fParams.fSlaveNetName); | |||||
fParams.fTransportSync = transport_sync; | fParams.fTransportSync = transport_sync; | ||||
fParams.fNetworkMode = network_mode; | fParams.fNetworkMode = network_mode; | ||||
fSendTransportData.fState = -1; | fSendTransportData.fState = -1; | ||||
@@ -67,30 +73,28 @@ namespace Jack | |||||
} | } | ||||
//open, close, attach and detach------------------------------------------------------ | //open, close, attach and detach------------------------------------------------------ | ||||
int JackNetDriver::Open ( jack_nframes_t buffer_size, jack_nframes_t samplerate, bool capturing, bool playing, | |||||
int inchannels, int outchannels, bool monitor, | |||||
const char* capture_driver_name, const char* playback_driver_name, | |||||
jack_nframes_t capture_latency, jack_nframes_t playback_latency ) | |||||
int JackNetDriver::Open(jack_nframes_t buffer_size, jack_nframes_t samplerate, bool capturing, bool playing, | |||||
int inchannels, int outchannels, bool monitor, | |||||
const char* capture_driver_name, const char* playback_driver_name, | |||||
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; | fEngineControl->fConstraint = 500 * 1000; | ||||
return 0; | return 0; | ||||
} | |||||
else | |||||
{ | |||||
} else { | |||||
return -1; | return -1; | ||||
} | } | ||||
} | } | ||||
@@ -98,7 +102,7 @@ namespace Jack | |||||
int JackNetDriver::Close() | int JackNetDriver::Close() | ||||
{ | { | ||||
#ifdef JACK_MONITOR | #ifdef JACK_MONITOR | ||||
if ( fNetTimeMon ) | |||||
if (fNetTimeMon) | |||||
fNetTimeMon->Save(); | fNetTimeMon->Save(); | ||||
#endif | #endif | ||||
FreeAll(); | FreeAll(); | ||||
@@ -139,8 +143,8 @@ namespace Jack | |||||
fParams.fSlaveSyncMode = fEngineControl->fSyncMode; | fParams.fSlaveSyncMode = fEngineControl->fSyncMode; | ||||
//display some additional infos | //display some additional infos | ||||
jack_info ( "NetDriver started in %s mode %s Master's transport sync.", | |||||
( fParams.fSlaveSyncMode ) ? "sync" : "async", ( fParams.fTransportSync ) ? "with" : "without" ); | |||||
jack_info("NetDriver started in %s mode %s Master's transport sync.", | |||||
(fParams.fSlaveSyncMode) ? "sync" : "async", (fParams.fTransportSync) ? "with" : "without"); | |||||
//init network | //init network | ||||
if (!JackNetSlaveInterface::Init()) { | if (!JackNetSlaveInterface::Init()) { | ||||
@@ -150,7 +154,7 @@ namespace Jack | |||||
//set global parameters | //set global parameters | ||||
if (!SetParams()) { | if (!SetParams()) { | ||||
jack_error("SetParams error..." ); | |||||
jack_error("SetParams error..."); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -185,48 +189,48 @@ namespace Jack | |||||
#ifdef JACK_MONITOR | #ifdef JACK_MONITOR | ||||
string plot_name; | string plot_name; | ||||
//NetTimeMon | //NetTimeMon | ||||
plot_name = string ( fParams.fName ); | |||||
plot_name += string ( "_slave" ); | |||||
plot_name += ( fEngineControl->fSyncMode ) ? string ( "_sync" ) : string ( "_async" ); | |||||
switch ( fParams.fNetworkMode ) | |||||
plot_name = string(fParams.fName); | |||||
plot_name += string("_slave"); | |||||
plot_name += (fEngineControl->fSyncMode) ? string("_sync") : string("_async"); | |||||
switch (fParams.fNetworkMode) | |||||
{ | { | ||||
case 's' : | case 's' : | ||||
plot_name += string ( "_slow" ); | |||||
plot_name += string("_slow"); | |||||
break; | break; | ||||
case 'n' : | case 'n' : | ||||
plot_name += string ( "_normal" ); | |||||
plot_name += string("_normal"); | |||||
break; | break; | ||||
case 'f' : | case 'f' : | ||||
plot_name += string ( "_fast" ); | |||||
plot_name += string("_fast"); | |||||
break; | break; | ||||
} | } | ||||
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[] = | ||||
{ | { | ||||
string ( "sync decoded" ), | |||||
string ( "end of read" ), | |||||
string ( "start of write" ), | |||||
string ( "sync send" ), | |||||
string ( "end of write" ) | |||||
string("sync decoded"), | |||||
string("end of read"), | |||||
string("start of write"), | |||||
string("sync send"), | |||||
string("end of write") | |||||
}; | }; | ||||
string net_time_mon_options[] = | string net_time_mon_options[] = | ||||
{ | { | ||||
string ( "set xlabel \"audio cycles\"" ), | |||||
string ( "set ylabel \"% of audio cycle\"" ) | |||||
string("set xlabel \"audio cycles\""), | |||||
string("set ylabel \"% of audio cycle\"") | |||||
}; | }; | ||||
fNetTimeMon->SetPlotFile ( net_time_mon_options, 2, net_time_mon_fields, 5 ); | |||||
fNetTimeMon->SetPlotFile(net_time_mon_options, 2, net_time_mon_fields, 5); | |||||
#endif | #endif | ||||
//driver parametering | //driver parametering | ||||
JackAudioDriver::SetBufferSize ( fParams.fPeriodSize ); | |||||
JackAudioDriver::SetSampleRate ( fParams.fSampleRate ); | |||||
JackAudioDriver::SetBufferSize(fParams.fPeriodSize); | |||||
JackAudioDriver::SetSampleRate(fParams.fSampleRate); | |||||
JackDriver::NotifyBufferSize ( fParams.fPeriodSize ); | |||||
JackDriver::NotifySampleRate ( fParams.fSampleRate ); | |||||
JackDriver::NotifyBufferSize(fParams.fPeriodSize); | |||||
JackDriver::NotifySampleRate(fParams.fSampleRate); | |||||
//transport engine parametering | //transport engine parametering | ||||
fEngineControl->fTransport.SetNetworkSync ( fParams.fTransportSync ); | |||||
fEngineControl->fTransport.SetNetworkSync(fParams.fTransportSync); | |||||
return true; | return true; | ||||
} | } | ||||
@@ -261,7 +265,7 @@ namespace Jack | |||||
//jack ports and buffers-------------------------------------------------------------- | //jack ports and buffers-------------------------------------------------------------- | ||||
int JackNetDriver::AllocPorts() | int JackNetDriver::AllocPorts() | ||||
{ | { | ||||
jack_log ( "JackNetDriver::AllocPorts fBufferSize = %ld fSampleRate = %ld", fEngineControl->fBufferSize, fEngineControl->fSampleRate ); | |||||
jack_log("JackNetDriver::AllocPorts fBufferSize = %ld fSampleRate = %ld", fEngineControl->fBufferSize, fEngineControl->fSampleRate); | |||||
JackPort* port; | JackPort* port; | ||||
jack_port_id_t port_id; | jack_port_id_t port_id; | ||||
@@ -274,39 +278,39 @@ namespace Jack | |||||
//audio | //audio | ||||
port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal; | port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal; | ||||
for ( audio_port_index = 0; audio_port_index < fCaptureChannels; audio_port_index++ ) | |||||
for (audio_port_index = 0; audio_port_index < fCaptureChannels; audio_port_index++) | |||||
{ | { | ||||
snprintf ( alias, sizeof ( alias ) - 1, "%s:%s:out%d", fAliasName, fCaptureDriverName, audio_port_index + 1 ); | |||||
snprintf ( name, sizeof ( name ) - 1, "%s:capture_%d", fClientControl.fName, audio_port_index + 1 ); | |||||
if ( ( port_id = fGraphManager->AllocatePort ( fClientControl.fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, | |||||
static_cast<JackPortFlags> ( port_flags ), fEngineControl->fBufferSize ) ) == NO_PORT ) | |||||
snprintf(alias, sizeof(alias) - 1, "%s:%s:out%d", fAliasName, fCaptureDriverName, audio_port_index + 1); | |||||
snprintf(name, sizeof(name) - 1, "%s:capture_%d", fClientControl.fName, audio_port_index + 1); | |||||
if ((port_id = fGraphManager->AllocatePort(fClientControl.fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, | |||||
static_cast<JackPortFlags>(port_flags), fEngineControl->fBufferSize)) == NO_PORT) | |||||
{ | { | ||||
jack_error ( "driver: cannot register port for %s", name ); | |||||
jack_error("driver: cannot register port for %s", name); | |||||
return -1; | return -1; | ||||
} | } | ||||
port = fGraphManager->GetPort ( port_id ); | |||||
port->SetAlias ( alias ); | |||||
port = fGraphManager->GetPort(port_id); | |||||
port->SetAlias(alias); | |||||
//port latency | //port latency | ||||
range.min = range.max = fEngineControl->fBufferSize; | range.min = range.max = fEngineControl->fBufferSize; | ||||
port->SetLatencyRange(JackCaptureLatency, &range); | port->SetLatencyRange(JackCaptureLatency, &range); | ||||
fCapturePortList[audio_port_index] = port_id; | fCapturePortList[audio_port_index] = port_id; | ||||
jack_log ( "JackNetDriver::AllocPorts() fCapturePortList[%d] audio_port_index = %ld fPortLatency = %ld", audio_port_index, port_id, port->GetLatency() ); | |||||
jack_log("JackNetDriver::AllocPorts() fCapturePortList[%d] audio_port_index = %ld fPortLatency = %ld", audio_port_index, port_id, port->GetLatency()); | |||||
} | } | ||||
port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal; | port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal; | ||||
for ( audio_port_index = 0; audio_port_index < fPlaybackChannels; audio_port_index++ ) | |||||
for (audio_port_index = 0; audio_port_index < fPlaybackChannels; audio_port_index++) | |||||
{ | { | ||||
snprintf ( alias, sizeof ( alias ) - 1, "%s:%s:in%d", fAliasName, fPlaybackDriverName, audio_port_index + 1 ); | |||||
snprintf ( name, sizeof ( name ) - 1, "%s:playback_%d",fClientControl.fName, audio_port_index + 1 ); | |||||
if ( ( port_id = fGraphManager->AllocatePort ( fClientControl.fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, | |||||
static_cast<JackPortFlags> ( port_flags ), fEngineControl->fBufferSize ) ) == NO_PORT ) | |||||
snprintf(alias, sizeof(alias) - 1, "%s:%s:in%d", fAliasName, fPlaybackDriverName, audio_port_index + 1); | |||||
snprintf(name, sizeof(name) - 1, "%s:playback_%d",fClientControl.fName, audio_port_index + 1); | |||||
if ((port_id = fGraphManager->AllocatePort(fClientControl.fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, | |||||
static_cast<JackPortFlags>(port_flags), fEngineControl->fBufferSize)) == NO_PORT) | |||||
{ | { | ||||
jack_error ( "driver: cannot register port for %s", name ); | |||||
jack_error("driver: cannot register port for %s", name); | |||||
return -1; | return -1; | ||||
} | } | ||||
port = fGraphManager->GetPort ( port_id ); | |||||
port->SetAlias ( alias ); | |||||
port = fGraphManager->GetPort(port_id); | |||||
port->SetAlias(alias); | |||||
//port latency | //port latency | ||||
switch ( fParams.fNetworkMode ) | |||||
switch (fParams.fNetworkMode) | |||||
{ | { | ||||
case 'f' : | case 'f' : | ||||
range.min = range.max = (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize; | range.min = range.max = (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize; | ||||
@@ -320,42 +324,42 @@ namespace Jack | |||||
} | } | ||||
port->SetLatencyRange(JackPlaybackLatency, &range); | port->SetLatencyRange(JackPlaybackLatency, &range); | ||||
fPlaybackPortList[audio_port_index] = port_id; | fPlaybackPortList[audio_port_index] = port_id; | ||||
jack_log ( "JackNetDriver::AllocPorts() fPlaybackPortList[%d] audio_port_index = %ld fPortLatency = %ld", audio_port_index, port_id, port->GetLatency() ); | |||||
jack_log("JackNetDriver::AllocPorts() fPlaybackPortList[%d] audio_port_index = %ld fPortLatency = %ld", audio_port_index, port_id, port->GetLatency()); | |||||
} | } | ||||
//midi | //midi | ||||
port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal; | port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal; | ||||
for ( midi_port_index = 0; midi_port_index < fParams.fSendMidiChannels; midi_port_index++ ) | |||||
for (midi_port_index = 0; midi_port_index < fParams.fSendMidiChannels; midi_port_index++) | |||||
{ | { | ||||
snprintf ( alias, sizeof ( alias ) - 1, "%s:%s:out%d", fAliasName, fCaptureDriverName, midi_port_index + 1 ); | |||||
snprintf ( name, sizeof ( name ) - 1, "%s:midi_capture_%d", fClientControl.fName, midi_port_index + 1 ); | |||||
if ( ( port_id = fGraphManager->AllocatePort ( fClientControl.fRefNum, name, JACK_DEFAULT_MIDI_TYPE, | |||||
static_cast<JackPortFlags> ( port_flags ), fEngineControl->fBufferSize ) ) == NO_PORT ) | |||||
snprintf(alias, sizeof(alias) - 1, "%s:%s:out%d", fAliasName, fCaptureDriverName, midi_port_index + 1); | |||||
snprintf(name, sizeof (name) - 1, "%s:midi_capture_%d", fClientControl.fName, midi_port_index + 1); | |||||
if ((port_id = fGraphManager->AllocatePort(fClientControl.fRefNum, name, JACK_DEFAULT_MIDI_TYPE, | |||||
static_cast<JackPortFlags>(port_flags), fEngineControl->fBufferSize)) == NO_PORT) | |||||
{ | { | ||||
jack_error ( "driver: cannot register port for %s", name ); | |||||
jack_error("driver: cannot register port for %s", name); | |||||
return -1; | return -1; | ||||
} | } | ||||
port = fGraphManager->GetPort ( port_id ); | |||||
port = fGraphManager->GetPort(port_id); | |||||
//port latency | //port latency | ||||
range.min = range.max = fEngineControl->fBufferSize; | range.min = range.max = fEngineControl->fBufferSize; | ||||
port->SetLatencyRange(JackCaptureLatency, &range); | port->SetLatencyRange(JackCaptureLatency, &range); | ||||
fMidiCapturePortList[midi_port_index] = port_id; | fMidiCapturePortList[midi_port_index] = port_id; | ||||
jack_log ( "JackNetDriver::AllocPorts() fMidiCapturePortList[%d] midi_port_index = %ld fPortLatency = %ld", midi_port_index, port_id, port->GetLatency() ); | |||||
jack_log("JackNetDriver::AllocPorts() fMidiCapturePortList[%d] midi_port_index = %ld fPortLatency = %ld", midi_port_index, port_id, port->GetLatency()); | |||||
} | } | ||||
port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal; | port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal; | ||||
for ( midi_port_index = 0; midi_port_index < fParams.fReturnMidiChannels; midi_port_index++ ) | |||||
for (midi_port_index = 0; midi_port_index < fParams.fReturnMidiChannels; midi_port_index++) | |||||
{ | { | ||||
snprintf ( alias, sizeof ( alias ) - 1, "%s:%s:in%d", fAliasName, fPlaybackDriverName, midi_port_index + 1 ); | |||||
snprintf ( name, sizeof ( name ) - 1, "%s:midi_playback_%d", fClientControl.fName, midi_port_index + 1 ); | |||||
if ( ( port_id = fGraphManager->AllocatePort ( fClientControl.fRefNum, name, JACK_DEFAULT_MIDI_TYPE, | |||||
static_cast<JackPortFlags> ( port_flags ), fEngineControl->fBufferSize ) ) == NO_PORT ) | |||||
snprintf(alias, sizeof(alias) - 1, "%s:%s:in%d", fAliasName, fPlaybackDriverName, midi_port_index + 1); | |||||
snprintf(name, sizeof(name) - 1, "%s:midi_playback_%d", fClientControl.fName, midi_port_index + 1); | |||||
if ((port_id = fGraphManager->AllocatePort(fClientControl.fRefNum, name, JACK_DEFAULT_MIDI_TYPE, | |||||
static_cast<JackPortFlags>(port_flags), fEngineControl->fBufferSize)) == NO_PORT) | |||||
{ | { | ||||
jack_error ( "driver: cannot register port for %s", name ); | |||||
jack_error("driver: cannot register port for %s", name); | |||||
return -1; | return -1; | ||||
} | } | ||||
port = fGraphManager->GetPort ( port_id ); | |||||
port = fGraphManager->GetPort(port_id); | |||||
//port latency | //port latency | ||||
switch ( fParams.fNetworkMode ) | |||||
switch (fParams.fNetworkMode) | |||||
{ | { | ||||
case 'f' : | case 'f' : | ||||
range.min = range.max = (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize; | range.min = range.max = (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize; | ||||
@@ -369,7 +373,7 @@ namespace Jack | |||||
} | } | ||||
port->SetLatencyRange(JackPlaybackLatency, &range); | port->SetLatencyRange(JackPlaybackLatency, &range); | ||||
fMidiPlaybackPortList[midi_port_index] = port_id; | fMidiPlaybackPortList[midi_port_index] = port_id; | ||||
jack_log ( "JackNetDriver::AllocPorts() fMidiPlaybackPortList[%d] midi_port_index = %ld fPortLatency = %ld", midi_port_index, port_id, port->GetLatency() ); | |||||
jack_log("JackNetDriver::AllocPorts() fMidiPlaybackPortList[%d] midi_port_index = %ld fPortLatency = %ld", midi_port_index, port_id, port->GetLatency()); | |||||
} | } | ||||
return 0; | return 0; | ||||
@@ -412,14 +416,14 @@ namespace Jack | |||||
return 0; | return 0; | ||||
} | } | ||||
JackMidiBuffer* JackNetDriver::GetMidiInputBuffer ( int port_index ) | |||||
JackMidiBuffer* JackNetDriver::GetMidiInputBuffer(int port_index) | |||||
{ | { | ||||
return static_cast<JackMidiBuffer*> ( fGraphManager->GetBuffer ( fMidiCapturePortList[port_index], fEngineControl->fBufferSize ) ); | |||||
return static_cast<JackMidiBuffer*>(fGraphManager->GetBuffer(fMidiCapturePortList[port_index], fEngineControl->fBufferSize)); | |||||
} | } | ||||
JackMidiBuffer* JackNetDriver::GetMidiOutputBuffer ( int port_index ) | |||||
JackMidiBuffer* JackNetDriver::GetMidiOutputBuffer(int port_index) | |||||
{ | { | ||||
return static_cast<JackMidiBuffer*> ( fGraphManager->GetBuffer ( fMidiPlaybackPortList[port_index], fEngineControl->fBufferSize ) ); | |||||
return static_cast<JackMidiBuffer*>(fGraphManager->GetBuffer(fMidiPlaybackPortList[port_index], fEngineControl->fBufferSize)); | |||||
} | } | ||||
//transport--------------------------------------------------------------------------- | //transport--------------------------------------------------------------------------- | ||||
@@ -431,35 +435,35 @@ namespace Jack | |||||
// - conditional request : don't change anything too, the master will know if this slave is actually the timebase master | // - conditional request : don't change anything too, the master will know if this slave is actually the timebase master | ||||
int refnum; | int refnum; | ||||
bool conditional; | bool conditional; | ||||
if ( fSendTransportData.fTimebaseMaster == TIMEBASEMASTER ) | |||||
if (fSendTransportData.fTimebaseMaster == TIMEBASEMASTER) | |||||
{ | { | ||||
fEngineControl->fTransport.GetTimebaseMaster ( refnum, conditional ); | |||||
if ( refnum != -1 ) | |||||
fEngineControl->fTransport.ResetTimebase ( refnum ); | |||||
jack_info ( "The NetMaster is now the new timebase master." ); | |||||
fEngineControl->fTransport.GetTimebaseMaster(refnum, conditional); | |||||
if (refnum != -1) | |||||
fEngineControl->fTransport.ResetTimebase(refnum); | |||||
jack_info("The NetMaster is now the new timebase master."); | |||||
} | } | ||||
//is there a transport state change to handle ? | //is there a transport state change to handle ? | ||||
if ( fSendTransportData.fNewState && ( fSendTransportData.fState != fEngineControl->fTransport.GetState() ) ) | |||||
if (fSendTransportData.fNewState &&(fSendTransportData.fState != fEngineControl->fTransport.GetState())) | |||||
{ | { | ||||
switch ( fSendTransportData.fState ) | |||||
switch (fSendTransportData.fState) | |||||
{ | { | ||||
case JackTransportStopped : | case JackTransportStopped : | ||||
fEngineControl->fTransport.SetCommand ( TransportCommandStop ); | |||||
jack_info ( "Master stops transport." ); | |||||
fEngineControl->fTransport.SetCommand(TransportCommandStop); | |||||
jack_info("Master stops transport."); | |||||
break; | break; | ||||
case JackTransportStarting : | case JackTransportStarting : | ||||
fEngineControl->fTransport.RequestNewPos ( &fSendTransportData.fPosition ); | |||||
fEngineControl->fTransport.SetCommand ( TransportCommandStart ); | |||||
jack_info ( "Master starts transport frame = %d", fSendTransportData.fPosition.frame); | |||||
fEngineControl->fTransport.RequestNewPos(&fSendTransportData.fPosition); | |||||
fEngineControl->fTransport.SetCommand(TransportCommandStart); | |||||
jack_info("Master starts transport frame = %d", fSendTransportData.fPosition.frame); | |||||
break; | break; | ||||
case JackTransportRolling : | case JackTransportRolling : | ||||
//fEngineControl->fTransport.SetCommand ( TransportCommandStart ); | |||||
fEngineControl->fTransport.SetState ( JackTransportRolling ); | |||||
jack_info ( "Master is rolling." ); | |||||
//fEngineControl->fTransport.SetCommand(TransportCommandStart); | |||||
fEngineControl->fTransport.SetState(JackTransportRolling); | |||||
jack_info("Master is rolling."); | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
@@ -471,20 +475,20 @@ namespace Jack | |||||
//is there a timebase master change ? | //is there a timebase master change ? | ||||
int refnum; | int refnum; | ||||
bool conditional; | bool conditional; | ||||
fEngineControl->fTransport.GetTimebaseMaster ( refnum, conditional ); | |||||
if ( refnum != fLastTimebaseMaster ) | |||||
fEngineControl->fTransport.GetTimebaseMaster(refnum, conditional); | |||||
if (refnum != fLastTimebaseMaster) | |||||
{ | { | ||||
//timebase master has released its function | //timebase master has released its function | ||||
if ( refnum == -1 ) | |||||
if (refnum == -1) | |||||
{ | { | ||||
fReturnTransportData.fTimebaseMaster = RELEASE_TIMEBASEMASTER; | fReturnTransportData.fTimebaseMaster = RELEASE_TIMEBASEMASTER; | ||||
jack_info ( "Sending a timebase master release request." ); | |||||
jack_info("Sending a timebase master release request."); | |||||
} | } | ||||
//there is a new timebase master | //there is a new timebase master | ||||
else | else | ||||
{ | { | ||||
fReturnTransportData.fTimebaseMaster = ( conditional ) ? CONDITIONAL_TIMEBASEMASTER : TIMEBASEMASTER; | |||||
jack_info ( "Sending a %s timebase master request.", ( conditional ) ? "conditional" : "non-conditional" ); | |||||
fReturnTransportData.fTimebaseMaster = (conditional) ? CONDITIONAL_TIMEBASEMASTER : TIMEBASEMASTER; | |||||
jack_info("Sending a %s timebase master request.", (conditional) ? "conditional" : "non-conditional"); | |||||
} | } | ||||
fLastTimebaseMaster = refnum; | fLastTimebaseMaster = refnum; | ||||
} | } | ||||
@@ -493,14 +497,14 @@ namespace Jack | |||||
*/ | */ | ||||
//update transport state and position | //update transport state and position | ||||
fReturnTransportData.fState = fEngineControl->fTransport.Query ( &fReturnTransportData.fPosition ); | |||||
fReturnTransportData.fState = fEngineControl->fTransport.Query(&fReturnTransportData.fPosition); | |||||
//is it a new state (that the master need to know...) ? | //is it a new state (that the master need to know...) ? | ||||
fReturnTransportData.fNewState = (( fReturnTransportData.fState == JackTransportNetStarting) && | |||||
( fReturnTransportData.fState != fLastTransportState ) && | |||||
( fReturnTransportData.fState != fSendTransportData.fState ) ); | |||||
if ( fReturnTransportData.fNewState ) | |||||
jack_info ( "Sending '%s'.", GetTransportState ( fReturnTransportData.fState ) ); | |||||
fReturnTransportData.fNewState = ((fReturnTransportData.fState == JackTransportNetStarting) && | |||||
(fReturnTransportData.fState != fLastTransportState) && | |||||
(fReturnTransportData.fState != fSendTransportData.fState)); | |||||
if (fReturnTransportData.fNewState) | |||||
jack_info("Sending '%s'.", GetTransportState(fReturnTransportData.fState)); | |||||
fLastTransportState = fReturnTransportData.fState; | fLastTransportState = fReturnTransportData.fState; | ||||
} | } | ||||
@@ -511,17 +515,17 @@ namespace Jack | |||||
int audio_port_index; | int audio_port_index; | ||||
//buffers | //buffers | ||||
for ( midi_port_index = 0; midi_port_index < fParams.fSendMidiChannels; midi_port_index++ ) | |||||
fNetMidiCaptureBuffer->SetBuffer ( midi_port_index, GetMidiInputBuffer ( midi_port_index ) ); | |||||
for ( audio_port_index = 0; audio_port_index < fParams.fSendAudioChannels; audio_port_index++ ) | |||||
fNetAudioCaptureBuffer->SetBuffer ( audio_port_index, GetInputBuffer ( audio_port_index ) ); | |||||
for (midi_port_index = 0; midi_port_index < fParams.fSendMidiChannels; midi_port_index++) | |||||
fNetMidiCaptureBuffer->SetBuffer(midi_port_index, GetMidiInputBuffer(midi_port_index)); | |||||
for (audio_port_index = 0; audio_port_index < fParams.fSendAudioChannels; audio_port_index++) | |||||
fNetAudioCaptureBuffer->SetBuffer(audio_port_index, GetInputBuffer(audio_port_index)); | |||||
#ifdef JACK_MONITOR | #ifdef JACK_MONITOR | ||||
fNetTimeMon->New(); | fNetTimeMon->New(); | ||||
#endif | #endif | ||||
//receive sync (launch the cycle) | //receive sync (launch the cycle) | ||||
if ( SyncRecv() == SOCKET_ERROR ) | |||||
if (SyncRecv() == SOCKET_ERROR) | |||||
return 0; | return 0; | ||||
#ifdef JACK_MONITOR | #ifdef JACK_MONITOR | ||||
@@ -534,17 +538,17 @@ namespace Jack | |||||
DecodeSyncPacket(); | DecodeSyncPacket(); | ||||
#ifdef JACK_MONITOR | #ifdef JACK_MONITOR | ||||
fNetTimeMon->Add ( ( ( float ) ( GetMicroSeconds() - fRcvSyncUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f ); | |||||
fNetTimeMon->Add(((float)(GetMicroSeconds() - fRcvSyncUst) / (float)fEngineControl->fPeriodUsecs) * 100.f); | |||||
#endif | #endif | ||||
//audio, midi or sync if driver is late | //audio, midi or sync if driver is late | ||||
if ( DataRecv() == SOCKET_ERROR ) | |||||
if (DataRecv() == SOCKET_ERROR) | |||||
return SOCKET_ERROR; | return SOCKET_ERROR; | ||||
//take the time at the beginning of the cycle | //take the time at the beginning of the cycle | ||||
JackDriver::CycleTakeBeginTime(); | JackDriver::CycleTakeBeginTime(); | ||||
#ifdef JACK_MONITOR | #ifdef JACK_MONITOR | ||||
fNetTimeMon->Add ( ( ( float ) ( GetMicroSeconds() - fRcvSyncUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f ); | |||||
fNetTimeMon->Add(((float)(GetMicroSeconds() - fRcvSyncUst) / (float)fEngineControl->fPeriodUsecs) * 100.f); | |||||
#endif | #endif | ||||
return 0; | return 0; | ||||
@@ -556,32 +560,32 @@ namespace Jack | |||||
int audio_port_index; | int audio_port_index; | ||||
//buffers | //buffers | ||||
for ( midi_port_index = 0; midi_port_index < fParams.fReturnMidiChannels; midi_port_index++ ) | |||||
fNetMidiPlaybackBuffer->SetBuffer ( midi_port_index, GetMidiOutputBuffer ( midi_port_index ) ); | |||||
for ( audio_port_index = 0; audio_port_index < fPlaybackChannels; audio_port_index++ ) | |||||
fNetAudioPlaybackBuffer->SetBuffer ( audio_port_index, GetOutputBuffer ( audio_port_index ) ); | |||||
for (midi_port_index = 0; midi_port_index < fParams.fReturnMidiChannels; midi_port_index++) | |||||
fNetMidiPlaybackBuffer->SetBuffer (midi_port_index, GetMidiOutputBuffer (midi_port_index)); | |||||
for (audio_port_index = 0; audio_port_index < fPlaybackChannels; audio_port_index++) | |||||
fNetAudioPlaybackBuffer->SetBuffer (audio_port_index, GetOutputBuffer (audio_port_index)); | |||||
#ifdef JACK_MONITOR | #ifdef JACK_MONITOR | ||||
fNetTimeMon->Add ( ( ( float ) ( GetMicroSeconds() - fRcvSyncUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f ); | |||||
fNetTimeMon->Add(((float) (GetMicroSeconds() - fRcvSyncUst) / (float)fEngineControl->fPeriodUsecs) * 100.f); | |||||
#endif | #endif | ||||
//sync | //sync | ||||
EncodeSyncPacket(); | EncodeSyncPacket(); | ||||
//send sync | //send sync | ||||
if ( SyncSend() == SOCKET_ERROR ) | |||||
if (SyncSend() == SOCKET_ERROR) | |||||
return SOCKET_ERROR; | return SOCKET_ERROR; | ||||
#ifdef JACK_MONITOR | #ifdef JACK_MONITOR | ||||
fNetTimeMon->Add ( ( ( float ) ( GetMicroSeconds() - fRcvSyncUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f ); | |||||
fNetTimeMon->Add(((float)(GetMicroSeconds() - fRcvSyncUst) / (float) fEngineControl->fPeriodUsecs) * 100.f); | |||||
#endif | #endif | ||||
//send data | //send data | ||||
if ( DataSend() == SOCKET_ERROR ) | |||||
if (DataSend() == SOCKET_ERROR) | |||||
return SOCKET_ERROR; | return SOCKET_ERROR; | ||||
#ifdef JACK_MONITOR | #ifdef JACK_MONITOR | ||||
fNetTimeMon->AddLast ( ( ( float ) ( GetMicroSeconds() - fRcvSyncUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f ); | |||||
fNetTimeMon->AddLast(((float)(GetMicroSeconds() - fRcvSyncUst) / (float) fEngineControl->fPeriodUsecs) * 100.f); | |||||
#endif | #endif | ||||
return 0; | return 0; | ||||
@@ -593,103 +597,112 @@ namespace Jack | |||||
extern "C" | extern "C" | ||||
{ | { | ||||
#endif | #endif | ||||
SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor () | |||||
SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor() | |||||
{ | { | ||||
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->params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) ); | |||||
desc->nparams = 11; | |||||
desc->params = (jack_driver_param_desc_t*) calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); | |||||
int i = 0; | int i = 0; | ||||
strcpy ( desc->params[i].name, "multicast_ip" ); | |||||
strcpy(desc->params[i].name, "multicast_ip"); | |||||
desc->params[i].character = 'a'; | desc->params[i].character = 'a'; | ||||
desc->params[i].type = JackDriverParamString; | desc->params[i].type = JackDriverParamString; | ||||
strcpy ( desc->params[i].value.str, DEFAULT_MULTICAST_IP ); | |||||
strcpy ( desc->params[i].short_desc, "Multicast Address" ); | |||||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||||
strcpy(desc->params[i].value.str, DEFAULT_MULTICAST_IP); | |||||
strcpy(desc->params[i].short_desc, "Multicast Address"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | i++; | ||||
strcpy ( desc->params[i].name, "udp_net_port" ); | |||||
strcpy(desc->params[i].name, "udp_net_port"); | |||||
desc->params[i].character = 'p'; | desc->params[i].character = 'p'; | ||||
desc->params[i].type = JackDriverParamInt; | desc->params[i].type = JackDriverParamInt; | ||||
desc->params[i].value.i = DEFAULT_PORT; | desc->params[i].value.i = DEFAULT_PORT; | ||||
strcpy ( desc->params[i].short_desc, "UDP port" ); | |||||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||||
strcpy(desc->params[i].short_desc, "UDP port"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | i++; | ||||
strcpy ( desc->params[i].name, "mtu" ); | |||||
strcpy(desc->params[i].name, "mtu"); | |||||
desc->params[i].character = 'M'; | desc->params[i].character = 'M'; | ||||
desc->params[i].type = JackDriverParamInt; | desc->params[i].type = JackDriverParamInt; | ||||
desc->params[i].value.i = DEFAULT_MTU; | desc->params[i].value.i = DEFAULT_MTU; | ||||
strcpy ( desc->params[i].short_desc, "MTU to the master" ); | |||||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||||
strcpy(desc->params[i].short_desc, "MTU to the master"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | i++; | ||||
strcpy ( desc->params[i].name, "input_ports" ); | |||||
strcpy(desc->params[i].name, "input_ports"); | |||||
desc->params[i].character = 'C'; | desc->params[i].character = 'C'; | ||||
desc->params[i].type = JackDriverParamInt; | desc->params[i].type = JackDriverParamInt; | ||||
desc->params[i].value.i = -1; | desc->params[i].value.i = -1; | ||||
strcpy ( desc->params[i].short_desc, "Number of audio input ports" ); | |||||
strcpy ( desc->params[i].long_desc, "Number of audio input ports. If -1, audio physical input from the master"); | |||||
strcpy(desc->params[i].short_desc, "Number of audio input ports"); | |||||
strcpy(desc->params[i].long_desc, "Number of audio input ports. If -1, audio physical input from the master"); | |||||
i++; | i++; | ||||
strcpy ( desc->params[i].name, "output_ports" ); | |||||
strcpy(desc->params[i].name, "output_ports"); | |||||
desc->params[i].character = 'P'; | desc->params[i].character = 'P'; | ||||
desc->params[i].type = JackDriverParamInt; | desc->params[i].type = JackDriverParamInt; | ||||
desc->params[i].value.i = -1; | desc->params[i].value.i = -1; | ||||
strcpy ( desc->params[i].short_desc, "Number of audio output ports" ); | |||||
strcpy ( desc->params[i].long_desc, "Number of audio output ports. If -1, audio physical output from the master"); | |||||
strcpy(desc->params[i].short_desc, "Number of audio output ports"); | |||||
strcpy(desc->params[i].long_desc, "Number of audio output ports. If -1, audio physical output from the master"); | |||||
i++; | i++; | ||||
strcpy ( desc->params[i].name, "midi_in_ports" ); | |||||
strcpy(desc->params[i].name, "midi_in_ports"); | |||||
desc->params[i].character = 'i'; | desc->params[i].character = 'i'; | ||||
desc->params[i].type = JackDriverParamInt; | desc->params[i].type = JackDriverParamInt; | ||||
desc->params[i].value.i = 0; | desc->params[i].value.i = 0; | ||||
strcpy ( desc->params[i].short_desc, "Number of midi input ports" ); | |||||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||||
strcpy(desc->params[i].short_desc, "Number of midi input ports"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | i++; | ||||
strcpy ( desc->params[i].name, "midi_out_ports" ); | |||||
strcpy(desc->params[i].name, "midi_out_ports"); | |||||
desc->params[i].character = 'o'; | desc->params[i].character = 'o'; | ||||
desc->params[i].type = JackDriverParamInt; | desc->params[i].type = JackDriverParamInt; | ||||
desc->params[i].value.i = 0; | desc->params[i].value.i = 0; | ||||
strcpy ( desc->params[i].short_desc, "Number of midi output ports" ); | |||||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||||
strcpy(desc->params[i].short_desc, "Number of midi output ports"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
#if HAVE_CELT | |||||
i++; | |||||
strcpy(desc->params[i].name, "celt"); | |||||
desc->params[i].character = 'c'; | |||||
desc->params[i].type = JackDriverParamInt; | |||||
desc->params[i].value.i = -1; | |||||
strcpy(desc->params[i].short_desc, "Set CELT encoding and number of kBits per channel"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
#endif | |||||
i++; | i++; | ||||
strcpy ( desc->params[i].name, "client_name" ); | |||||
strcpy(desc->params[i].name, "client_name"); | |||||
desc->params[i].character = 'n'; | desc->params[i].character = 'n'; | ||||
desc->params[i].type = JackDriverParamString; | desc->params[i].type = JackDriverParamString; | ||||
strcpy ( desc->params[i].value.str, "'hostname'" ); | |||||
strcpy ( desc->params[i].short_desc, "Name of the jack client" ); | |||||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||||
strcpy(desc->params[i].value.str, "'hostname'"); | |||||
strcpy(desc->params[i].short_desc, "Name of the jack client"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | i++; | ||||
strcpy ( desc->params[i].name, "transport_sync" ); | |||||
strcpy(desc->params[i].name, "transport_sync"); | |||||
desc->params[i].character = 't'; | desc->params[i].character = 't'; | ||||
desc->params[i].type = JackDriverParamUInt; | desc->params[i].type = JackDriverParamUInt; | ||||
desc->params[i].value.ui = 1U; | desc->params[i].value.ui = 1U; | ||||
strcpy ( desc->params[i].short_desc, "Sync transport with master's" ); | |||||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||||
strcpy(desc->params[i].short_desc, "Sync transport with master's"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | i++; | ||||
strcpy ( desc->params[i].name, "mode" ); | |||||
strcpy(desc->params[i].name, "mode"); | |||||
desc->params[i].character = 'm'; | desc->params[i].character = 'm'; | ||||
desc->params[i].type = JackDriverParamString; | desc->params[i].type = JackDriverParamString; | ||||
strcpy ( desc->params[i].value.str, "slow" ); | |||||
strcpy ( desc->params[i].short_desc, "Slow, Normal or Fast mode." ); | |||||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||||
strcpy(desc->params[i].value.str, "slow"); | |||||
strcpy(desc->params[i].short_desc, "Slow, Normal or Fast mode."); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
return desc; | return desc; | ||||
} | } | ||||
SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize ( Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params ) | |||||
SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params) | |||||
{ | { | ||||
char multicast_ip[16]; | char multicast_ip[16]; | ||||
strcpy ( multicast_ip, DEFAULT_MULTICAST_IP ); | |||||
strcpy(multicast_ip, DEFAULT_MULTICAST_IP); | |||||
char net_name[JACK_CLIENT_NAME_SIZE + 1]; | char net_name[JACK_CLIENT_NAME_SIZE + 1]; | ||||
int udp_port = DEFAULT_PORT; | int udp_port = DEFAULT_PORT; | ||||
int mtu = DEFAULT_MTU; | int mtu = DEFAULT_MTU; | ||||
@@ -700,6 +713,7 @@ namespace Jack | |||||
int audio_playback_ports = -1; | int audio_playback_ports = -1; | ||||
int midi_input_ports = 0; | int midi_input_ports = 0; | ||||
int midi_output_ports = 0; | int midi_output_ports = 0; | ||||
int celt_encoding = -1; | |||||
bool monitor = false; | bool monitor = false; | ||||
char network_mode = 's'; | char network_mode = 's'; | ||||
const JSList* node; | const JSList* node; | ||||
@@ -707,13 +721,12 @@ namespace Jack | |||||
net_name[0] = 0; | net_name[0] = 0; | ||||
for ( node = params; node; node = jack_slist_next ( node ) ) | |||||
{ | |||||
param = ( const jack_driver_param_t* ) node->data; | |||||
switch ( param->character ) | |||||
for (node = params; node; node = jack_slist_next(node)) { | |||||
param = (const jack_driver_param_t*) node->data; | |||||
switch (param->character) | |||||
{ | { | ||||
case 'a' : | case 'a' : | ||||
strncpy ( multicast_ip, param->value.str, 15 ); | |||||
strncpy(multicast_ip, param->value.str, 15); | |||||
break; | break; | ||||
case 'p': | case 'p': | ||||
udp_port = param->value.ui; | udp_port = param->value.ui; | ||||
@@ -733,46 +746,45 @@ namespace Jack | |||||
case 'o': | case 'o': | ||||
midi_output_ports = param->value.i; | midi_output_ports = param->value.i; | ||||
break; | break; | ||||
#if HAVE_CELT | |||||
case 'c': | |||||
celt_encoding = param->value.i; | |||||
break; | |||||
#endif | |||||
case 'n' : | case 'n' : | ||||
strncpy ( net_name, param->value.str, JACK_CLIENT_NAME_SIZE ); | |||||
strncpy(net_name, param->value.str, JACK_CLIENT_NAME_SIZE); | |||||
break; | break; | ||||
case 't' : | case 't' : | ||||
transport_sync = param->value.ui; | transport_sync = param->value.ui; | ||||
break; | break; | ||||
case 'm' : | case 'm' : | ||||
if ( strcmp ( param->value.str, "normal" ) == 0 ) | |||||
if (strcmp(param->value.str, "normal") == 0) | |||||
network_mode = 'n'; | network_mode = 'n'; | ||||
else if ( strcmp ( param->value.str, "slow" ) == 0 ) | |||||
else if (strcmp(param->value.str, "slow") == 0) | |||||
network_mode = 's'; | network_mode = 's'; | ||||
else if ( strcmp ( param->value.str, "fast" ) == 0 ) | |||||
else if (strcmp(param->value.str, "fast") == 0) | |||||
network_mode = 'f'; | network_mode = 'f'; | ||||
else | else | ||||
jack_error ( "Unknown network mode, using 'normal' mode." ); | |||||
jack_error("Unknown network mode, using 'normal' mode."); | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
try | |||||
{ | |||||
try { | |||||
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 ) | |||||
{ | |||||
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, celt_encoding)); | |||||
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; | ||||
} | } | ||||
} | } | ||||
@@ -68,14 +68,14 @@ namespace Jack | |||||
public: | public: | ||||
JackNetDriver ( const char* name, const char* alias, JackLockedEngine* engine, JackSynchro* table, | |||||
const char* ip, int port, int mtu, int midi_input_ports, int midi_output_ports, | |||||
char* net_name, uint transport_sync, char network_master_mode ); | |||||
JackNetDriver(const char* name, const char* alias, JackLockedEngine* engine, JackSynchro* table, | |||||
const char* ip, int port, int mtu, int midi_input_ports, int midi_output_ports, | |||||
char* net_name, uint transport_sync, char network_master_mode, int celt_encoding); | |||||
~JackNetDriver(); | ~JackNetDriver(); | ||||
int Open ( jack_nframes_t frames_per_cycle, jack_nframes_t rate, bool capturing, bool playing, | |||||
int inchannels, int outchannels, bool monitor, const char* capture_driver_name, | |||||
const char* playback_driver_name, jack_nframes_t capture_latency, jack_nframes_t playback_latency ); | |||||
int Open(jack_nframes_t frames_per_cycle, jack_nframes_t rate, bool capturing, bool playing, | |||||
int inchannels, int outchannels, bool monitor, const char* capture_driver_name, | |||||
const char* playback_driver_name, jack_nframes_t capture_latency, jack_nframes_t playback_latency); | |||||
int Close(); | int Close(); | ||||
int Attach(); | int Attach(); | ||||
@@ -258,11 +258,13 @@ namespace Jack | |||||
break; | break; | ||||
case JackCeltEncoder: | case JackCeltEncoder: | ||||
#ifdef CELT | |||||
#ifdef HAVE_CELT | |||||
fNetAudioCaptureBuffer = new NetCeltAudioBuffer(&fParams, fParams.fSendAudioChannels, fTxData, fParams.fKBps); | fNetAudioCaptureBuffer = new NetCeltAudioBuffer(&fParams, fParams.fSendAudioChannels, fTxData, fParams.fKBps); | ||||
#endif | #endif | ||||
break; | break; | ||||
} | } | ||||
assert(fNetAudioCaptureBuffer); | |||||
} | } | ||||
if (fParams.fReturnAudioChannels) { | if (fParams.fReturnAudioChannels) { | ||||
@@ -278,11 +280,13 @@ namespace Jack | |||||
break; | break; | ||||
case JackCeltEncoder: | case JackCeltEncoder: | ||||
#ifdef CELT | |||||
#ifdef HAVE_CELT | |||||
fNetAudioPlaybackBuffer = new NetCeltAudioBuffer(&fParams, fParams.fReturnAudioChannels, fRxData, fParams.fKBps); | fNetAudioPlaybackBuffer = new NetCeltAudioBuffer(&fParams, fParams.fReturnAudioChannels, fRxData, fParams.fKBps); | ||||
#endif | #endif | ||||
break; | break; | ||||
} | } | ||||
assert(fNetAudioPlaybackBuffer); | |||||
} | } | ||||
} catch (exception&) { | } catch (exception&) { | ||||
@@ -788,19 +792,21 @@ namespace Jack | |||||
switch (fParams.fSampleEncoder) { | switch (fParams.fSampleEncoder) { | ||||
case JackFloatEncoder: | case JackFloatEncoder: | ||||
fNetAudioCaptureBuffer = new NetFloatAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | |||||
fNetAudioCaptureBuffer = new NetFloatAudioBuffer(&fParams, fParams.fSendAudioChannels, fRxData); | |||||
break; | break; | ||||
case JackIntEncoder: | case JackIntEncoder: | ||||
fNetAudioCaptureBuffer = new NetIntAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | |||||
fNetAudioCaptureBuffer = new NetIntAudioBuffer(&fParams, fParams.fSendAudioChannels, fRxData); | |||||
break; | break; | ||||
case JackCeltEncoder: | case JackCeltEncoder: | ||||
#ifdef CELT | |||||
fNetAudioCaptureBuffer = new NetCeltAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData, fParams.fKBps ); | |||||
#ifdef HAVE_CELT | |||||
fNetAudioCaptureBuffer = new NetCeltAudioBuffer(&fParams, fParams.fSendAudioChannels, fRxData, fParams.fKBps); | |||||
#endif | #endif | ||||
break; | break; | ||||
} | } | ||||
assert(fNetAudioCaptureBuffer); | |||||
} | } | ||||
if (fParams.fReturnAudioChannels) { | if (fParams.fReturnAudioChannels) { | ||||
@@ -808,19 +814,21 @@ namespace Jack | |||||
switch (fParams.fSampleEncoder) { | switch (fParams.fSampleEncoder) { | ||||
case JackFloatEncoder: | case JackFloatEncoder: | ||||
fNetAudioPlaybackBuffer = new NetFloatAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | |||||
fNetAudioPlaybackBuffer = new NetFloatAudioBuffer(&fParams, fParams.fReturnAudioChannels, fTxData); | |||||
break; | break; | ||||
case JackIntEncoder: | case JackIntEncoder: | ||||
fNetAudioPlaybackBuffer = new NetIntAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData); | |||||
fNetAudioPlaybackBuffer = new NetIntAudioBuffer(&fParams, fParams.fReturnAudioChannels, fTxData); | |||||
break; | break; | ||||
case JackCeltEncoder: | case JackCeltEncoder: | ||||
#ifdef CELT | |||||
fNetAudioPlaybackBuffer = new NetCeltAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData, fParams.fKBps ); | |||||
#ifdef HAVE_CELT | |||||
fNetAudioPlaybackBuffer = new NetCeltAudioBuffer(&fParams, fParams.fReturnAudioChannels, fTxData, fParams.fKBps); | |||||
#endif | #endif | ||||
break; | break; | ||||
} | } | ||||
assert(fNetAudioPlaybackBuffer); | |||||
} | } | ||||
} catch (exception&) { | } catch (exception&) { | ||||
@@ -871,6 +871,7 @@ extern "C" | |||||
"Factor for sample rate reduction on the upstream"); | "Factor for sample rate reduction on the upstream"); | ||||
strcpy (params[i].long_desc, params[i].short_desc); | strcpy (params[i].long_desc, params[i].short_desc); | ||||
#if HAVE_CELT | |||||
i++; | i++; | ||||
strcpy (params[i].name, "celt"); | strcpy (params[i].name, "celt"); | ||||
params[i].character = 'c'; | params[i].character = 'c'; | ||||
@@ -879,7 +880,7 @@ extern "C" | |||||
strcpy (params[i].short_desc, | strcpy (params[i].short_desc, | ||||
"sets celt encoding and number of kbits per channel"); | "sets celt encoding and number of kbits per channel"); | ||||
strcpy (params[i].long_desc, params[i].short_desc); | strcpy (params[i].long_desc, params[i].short_desc); | ||||
#endif | |||||
i++; | i++; | ||||
strcpy (params[i].name, "bit-depth"); | strcpy (params[i].name, "bit-depth"); | ||||
params[i].character = 'b'; | params[i].character = 'b'; | ||||
@@ -249,7 +249,7 @@ namespace Jack | |||||
// Celt audio buffer ********************************************************************************* | // Celt audio buffer ********************************************************************************* | ||||
#ifdef CELT | |||||
#ifdef HAVE_CELT | |||||
#define KPS 32 | #define KPS 32 | ||||
#define KPS_DIV 8 | #define KPS_DIV 8 | ||||
@@ -729,6 +729,7 @@ namespace Jack | |||||
break; | break; | ||||
case (JackCeltEncoder): | case (JackCeltEncoder): | ||||
jack_info ( "SampleEncoder : %s", "CELT"); | jack_info ( "SampleEncoder : %s", "CELT"); | ||||
jack_info ( "kBits : %d", params->fKBps); | |||||
break; | break; | ||||
}; | }; | ||||
jack_info ( "Slave mode : %s", ( params->fSlaveSyncMode ) ? "sync" : "async" ); | jack_info ( "Slave mode : %s", ( params->fSlaveSyncMode ) ? "sync" : "async" ); | ||||
@@ -558,7 +558,7 @@ namespace Jack | |||||
int RenderToNetwork (int subcycle, size_t total_size ); | int RenderToNetwork (int subcycle, size_t total_size ); | ||||
}; | }; | ||||
#ifdef CELT | |||||
#ifdef HAVE_CELT | |||||
#include <celt/celt.h> | #include <celt/celt.h> | ||||
@@ -44,6 +44,7 @@ bool JackPort::Allocate(int refnum, const char* port_name, const char* port_type | |||||
fInUse = true; | fInUse = true; | ||||
fLatency = 0; | fLatency = 0; | ||||
fTotalLatency = 0; | fTotalLatency = 0; | ||||
fMonitorRequests = 0; | |||||
fPlaybackLatency.min = fPlaybackLatency.max = 0; | fPlaybackLatency.min = fPlaybackLatency.max = 0; | ||||
fCaptureLatency.min = fCaptureLatency.max = 0; | fCaptureLatency.min = fCaptureLatency.max = 0; | ||||
fTied = NO_PORT; | fTied = NO_PORT; | ||||
@@ -65,6 +66,8 @@ void JackPort::Release() | |||||
fLatency = 0; | fLatency = 0; | ||||
fTotalLatency = 0; | fTotalLatency = 0; | ||||
fMonitorRequests = 0; | fMonitorRequests = 0; | ||||
fPlaybackLatency.min = fPlaybackLatency.max = 0; | |||||
fCaptureLatency.min = fCaptureLatency.max = 0; | |||||
fTied = NO_PORT; | fTied = NO_PORT; | ||||
fAlias1[0] = '\0'; | fAlias1[0] = '\0'; | ||||
fAlias2[0] = '\0'; | fAlias2[0] = '\0'; | ||||
@@ -107,7 +110,7 @@ void JackPort::SetLatencyRange(jack_latency_callback_mode_t mode, jack_latency_r | |||||
if (mode == JackCaptureLatency) { | if (mode == JackCaptureLatency) { | ||||
fCaptureLatency = *range; | fCaptureLatency = *range; | ||||
/* hack to set port->shared->latency up for | |||||
/* hack to set latency up for | |||||
* backend ports | * backend ports | ||||
*/ | */ | ||||
if ((fFlags & JackPortIsOutput) && (fFlags & JackPortIsPhysical)) | if ((fFlags & JackPortIsOutput) && (fFlags & JackPortIsPhysical)) | ||||
@@ -115,7 +118,7 @@ void JackPort::SetLatencyRange(jack_latency_callback_mode_t mode, jack_latency_r | |||||
} else { | } else { | ||||
fPlaybackLatency = *range; | fPlaybackLatency = *range; | ||||
/* hack to set port->shared->latency up for | |||||
/* hack to set latency up for | |||||
* backend ports | * backend ports | ||||
*/ | */ | ||||
if ((fFlags & JackPortIsInput) && (fFlags & JackPortIsPhysical)) | if ((fFlags & JackPortIsInput) && (fFlags & JackPortIsPhysical)) | ||||
@@ -151,7 +151,7 @@ alsa_driver_check_card_type (alsa_driver_t *driver) | |||||
* should be hw:x where x is the card number */ | * should be hw:x where x is the card number */ | ||||
char tmp[5]; | char tmp[5]; | ||||
strncpy(tmp,strstr(driver->alsa_name_playback,"hw"),4); | |||||
strncpy(tmp,strcasestr(driver->alsa_name_playback,"hw"),4); | |||||
tmp[4]='\0'; | tmp[4]='\0'; | ||||
jack_info("control device %s",tmp); | jack_info("control device %s",tmp); | ||||
ctl_name = strdup(tmp); | ctl_name = strdup(tmp); | ||||
@@ -9497,6 +9497,7 @@ | |||||
"-DUSE_POSIX_SHM", | "-DUSE_POSIX_SHM", | ||||
); | ); | ||||
OTHER_CPLUSPLUSFLAGS = ( | OTHER_CPLUSPLUSFLAGS = ( | ||||
"-DHAVE_CELT", | |||||
"-DSERVER_SIDE", | "-DSERVER_SIDE", | ||||
"-DJACK_32_64", | "-DJACK_32_64", | ||||
"-D__SMP__", | "-D__SMP__", | ||||
@@ -9565,6 +9566,7 @@ | |||||
"-DUSE_POSIX_SHM", | "-DUSE_POSIX_SHM", | ||||
); | ); | ||||
OTHER_CPLUSPLUSFLAGS = ( | OTHER_CPLUSPLUSFLAGS = ( | ||||
"-DHAVE_CELT", | |||||
"-DSERVER_SIDE", | "-DSERVER_SIDE", | ||||
"-DJACK_32_64", | "-DJACK_32_64", | ||||
"-D__SMP__", | "-D__SMP__", | ||||
@@ -13692,7 +13694,10 @@ | |||||
LIBRARY_STYLE = DYNAMIC; | LIBRARY_STYLE = DYNAMIC; | ||||
MACH_O_TYPE = mh_dylib; | MACH_O_TYPE = mh_dylib; | ||||
OTHER_CFLAGS = ""; | OTHER_CFLAGS = ""; | ||||
OTHER_CPLUSPLUSFLAGS = "-DMACH_RPC_MACH_SEMA"; | |||||
OTHER_CPLUSPLUSFLAGS = ( | |||||
"-DHAVE_CELT", | |||||
"-DMACH_RPC_MACH_SEMA", | |||||
); | |||||
OTHER_LDFLAGS = ( | OTHER_LDFLAGS = ( | ||||
/usr/local/lib/libsamplerate.a, | /usr/local/lib/libsamplerate.a, | ||||
"-framework", | "-framework", | ||||
@@ -13743,7 +13748,10 @@ | |||||
MACH_O_TYPE = mh_dylib; | MACH_O_TYPE = mh_dylib; | ||||
MACOSX_DEPLOYMENT_TARGET = 10.4; | MACOSX_DEPLOYMENT_TARGET = 10.4; | ||||
OTHER_CFLAGS = ""; | OTHER_CFLAGS = ""; | ||||
OTHER_CPLUSPLUSFLAGS = "-DMACH_RPC_MACH_SEMA"; | |||||
OTHER_CPLUSPLUSFLAGS = ( | |||||
"-DHAVE_CELT", | |||||
"-DMACH_RPC_MACH_SEMA", | |||||
); | |||||
OTHER_LDFLAGS = ( | OTHER_LDFLAGS = ( | ||||
/opt/local/lib/libsamplerate.a, | /opt/local/lib/libsamplerate.a, | ||||
"-framework", | "-framework", | ||||
@@ -14333,6 +14341,7 @@ | |||||
"-DUSE_POSIX_SHM", | "-DUSE_POSIX_SHM", | ||||
); | ); | ||||
OTHER_CPLUSPLUSFLAGS = ( | OTHER_CPLUSPLUSFLAGS = ( | ||||
"-DHAVE_CELT", | |||||
"-DSERVER_SIDE", | "-DSERVER_SIDE", | ||||
"-D__SMP__", | "-D__SMP__", | ||||
"-DMACH_RPC_MACH_SEMA", | "-DMACH_RPC_MACH_SEMA", | ||||
@@ -14393,6 +14402,7 @@ | |||||
"-DUSE_POSIX_SHM", | "-DUSE_POSIX_SHM", | ||||
); | ); | ||||
OTHER_CPLUSPLUSFLAGS = ( | OTHER_CPLUSPLUSFLAGS = ( | ||||
"-DHAVE_CELT", | |||||
"-DSERVER_SIDE", | "-DSERVER_SIDE", | ||||
"-D__SMP__", | "-D__SMP__", | ||||
"-DMACH_RPC_MACH_SEMA", | "-DMACH_RPC_MACH_SEMA", | ||||
@@ -16445,6 +16455,7 @@ | |||||
"-DUSE_POSIX_SHM", | "-DUSE_POSIX_SHM", | ||||
); | ); | ||||
OTHER_CPLUSPLUSFLAGS = ( | OTHER_CPLUSPLUSFLAGS = ( | ||||
"-DHAVE_CELT", | |||||
"-DJACK_MONITOR", | "-DJACK_MONITOR", | ||||
"-DSERVER_SIDE", | "-DSERVER_SIDE", | ||||
"-DJACK_32_64", | "-DJACK_32_64", | ||||
@@ -16513,6 +16524,7 @@ | |||||
"-DUSE_POSIX_SHM", | "-DUSE_POSIX_SHM", | ||||
); | ); | ||||
OTHER_CPLUSPLUSFLAGS = ( | OTHER_CPLUSPLUSFLAGS = ( | ||||
"-DHAVE_CELT", | |||||
"-DJACK_MONITOR", | "-DJACK_MONITOR", | ||||
"-DSERVER_SIDE", | "-DSERVER_SIDE", | ||||
"-DJACK_32_64", | "-DJACK_32_64", | ||||
@@ -17181,7 +17193,10 @@ | |||||
LIBRARY_STYLE = DYNAMIC; | LIBRARY_STYLE = DYNAMIC; | ||||
MACH_O_TYPE = mh_dylib; | MACH_O_TYPE = mh_dylib; | ||||
OTHER_CFLAGS = ""; | OTHER_CFLAGS = ""; | ||||
OTHER_CPLUSPLUSFLAGS = "-DMACH_RPC_MACH_SEMA"; | |||||
OTHER_CPLUSPLUSFLAGS = ( | |||||
"-DHAVE_CELT", | |||||
"-DMACH_RPC_MACH_SEMA", | |||||
); | |||||
OTHER_LDFLAGS = ( | OTHER_LDFLAGS = ( | ||||
"-framework", | "-framework", | ||||
Jackservermp, | Jackservermp, | ||||
@@ -17230,6 +17245,7 @@ | |||||
MACOSX_DEPLOYMENT_TARGET = 10.4; | MACOSX_DEPLOYMENT_TARGET = 10.4; | ||||
OTHER_CFLAGS = "-DJACK_32_64"; | OTHER_CFLAGS = "-DJACK_32_64"; | ||||
OTHER_CPLUSPLUSFLAGS = ( | OTHER_CPLUSPLUSFLAGS = ( | ||||
"-DHAVE_CELT", | |||||
"-DSERVER_SIDE", | "-DSERVER_SIDE", | ||||
"-DMACH_RPC_MACH_SEMA", | "-DMACH_RPC_MACH_SEMA", | ||||
"-DJACK_32_64", | "-DJACK_32_64", | ||||
@@ -17617,8 +17633,13 @@ | |||||
INSTALL_PATH = /usr/local/lib; | INSTALL_PATH = /usr/local/lib; | ||||
LIBRARY_STYLE = DYNAMIC; | LIBRARY_STYLE = DYNAMIC; | ||||
MACH_O_TYPE = mh_dylib; | MACH_O_TYPE = mh_dylib; | ||||
OTHER_CFLAGS = ""; | |||||
OTHER_CPLUSPLUSFLAGS = "-DMACH_RPC_MACH_SEMA"; | |||||
OTHER_CFLAGS = "-DJACK_32_64"; | |||||
OTHER_CPLUSPLUSFLAGS = ( | |||||
"-DJACK_32_64", | |||||
"-DHAVE_CELT", | |||||
"-DSERVER_SIDE", | |||||
"-DMACH_RPC_MACH_SEMA", | |||||
); | |||||
OTHER_LDFLAGS = ( | OTHER_LDFLAGS = ( | ||||
/opt/local/lib/libsamplerate.a, | /opt/local/lib/libsamplerate.a, | ||||
"-framework", | "-framework", | ||||
@@ -17669,9 +17690,10 @@ | |||||
MACOSX_DEPLOYMENT_TARGET = 10.4; | MACOSX_DEPLOYMENT_TARGET = 10.4; | ||||
OTHER_CFLAGS = "-DJACK_32_64"; | OTHER_CFLAGS = "-DJACK_32_64"; | ||||
OTHER_CPLUSPLUSFLAGS = ( | OTHER_CPLUSPLUSFLAGS = ( | ||||
"-DJACK_32_64", | |||||
"-DHAVE_CELT", | |||||
"-DSERVER_SIDE", | "-DSERVER_SIDE", | ||||
"-DMACH_RPC_MACH_SEMA", | "-DMACH_RPC_MACH_SEMA", | ||||
"-DJACK_32_64", | |||||
); | ); | ||||
OTHER_LDFLAGS = ( | OTHER_LDFLAGS = ( | ||||
/opt/local/lib/libsamplerate.a, | /opt/local/lib/libsamplerate.a, | ||||
@@ -18873,7 +18895,10 @@ | |||||
LIBRARY_STYLE = DYNAMIC; | LIBRARY_STYLE = DYNAMIC; | ||||
MACH_O_TYPE = mh_dylib; | MACH_O_TYPE = mh_dylib; | ||||
OTHER_CFLAGS = ""; | OTHER_CFLAGS = ""; | ||||
OTHER_CPLUSPLUSFLAGS = "-DMACH_RPC_MACH_SEMA"; | |||||
OTHER_CPLUSPLUSFLAGS = ( | |||||
"-DHAVE_CELT", | |||||
"-DMACH_RPC_MACH_SEMA", | |||||
); | |||||
OTHER_LDFLAGS = ( | OTHER_LDFLAGS = ( | ||||
"-framework", | "-framework", | ||||
Jackservermp, | Jackservermp, | ||||
@@ -18923,7 +18948,10 @@ | |||||
MACH_O_TYPE = mh_dylib; | MACH_O_TYPE = mh_dylib; | ||||
MACOSX_DEPLOYMENT_TARGET = 10.4; | MACOSX_DEPLOYMENT_TARGET = 10.4; | ||||
OTHER_CFLAGS = ""; | OTHER_CFLAGS = ""; | ||||
OTHER_CPLUSPLUSFLAGS = "-DMACH_RPC_MACH_SEMA"; | |||||
OTHER_CPLUSPLUSFLAGS = ( | |||||
"-DHAVE_CELT", | |||||
"-DMACH_RPC_MACH_SEMA", | |||||
); | |||||
OTHER_LDFLAGS = ( | OTHER_LDFLAGS = ( | ||||
"-framework", | "-framework", | ||||
Jackservermp, | Jackservermp, | ||||
@@ -1,19 +1,24 @@ | |||||
/* | /* | ||||
Copyright (C) 2006 Grame | |||||
This program is free software; you can redistribute it and/or modify | |||||
it under the terms of the GNU General Public License as published by | |||||
the Free Software Foundation; either version 2 of the License, or | |||||
(at your option) any later version. | |||||
This program is distributed in the hope that it will be useful, | |||||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU General Public License for more details. | |||||
You should have received a copy of the GNU General Public License | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
Copyright (C) 2006-2011 Grame | |||||
Permission is hereby granted, free of charge, to any person obtaining | |||||
a copy of this software and associated documentation files | |||||
(the "Software"), to deal in the Software without restriction, | |||||
including without limitation the rights to use, copy, modify, merge, | |||||
publish, distribute, sublicense, and/or sell copies of the Software, | |||||
and to permit persons to whom the Software is furnished to do so, | |||||
subject to the following conditions: | |||||
The above copyright notice and this permission notice shall be | |||||
included in all copies or substantial portions of the Software. | |||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR | |||||
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | |||||
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||||
*/ | */ | ||||
@@ -1,19 +1,24 @@ | |||||
/* | /* | ||||
Copyright (C) 2006 Grame | |||||
This program is free software; you can redistribute it and/or modify | |||||
it under the terms of the GNU General Public License as published by | |||||
the Free Software Foundation; either version 2 of the License, or | |||||
(at your option) any later version. | |||||
This program is distributed in the hope that it will be useful, | |||||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU General Public License for more details. | |||||
You should have received a copy of the GNU General Public License | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
Copyright (C) 2006-2011 Grame | |||||
Permission is hereby granted, free of charge, to any person obtaining | |||||
a copy of this software and associated documentation files | |||||
(the "Software"), to deal in the Software without restriction, | |||||
including without limitation the rights to use, copy, modify, merge, | |||||
publish, distribute, sublicense, and/or sell copies of the Software, | |||||
and to permit persons to whom the Software is furnished to do so, | |||||
subject to the following conditions: | |||||
The above copyright notice and this permission notice shall be | |||||
included in all copies or substantial portions of the Software. | |||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR | |||||
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | |||||
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||||
*/ | */ | ||||
@@ -22,13 +27,11 @@ Copyright (C) 2006 Grame | |||||
#include "asiosys.h" | #include "asiosys.h" | ||||
// Globals | // Globals | ||||
static int kBlockFrames = 256; | static int kBlockFrames = 256; | ||||
static int kNumInputs = 4; | static int kNumInputs = 4; | ||||
static int kNumOutputs = 4; | static int kNumOutputs = 4; | ||||
#if WINDOWS | #if WINDOWS | ||||
#include "jack.h" | #include "jack.h" | ||||
@@ -44,9 +47,7 @@ static int kNumOutputs = 4; | |||||
#include "iasiodrv.h" | #include "iasiodrv.h" | ||||
#define MAX_PORTS 32 | #define MAX_PORTS 32 | ||||
#define LONG_SAMPLE 1 | #define LONG_SAMPLE 1 | ||||
#define PATH_SEP "\\" | #define PATH_SEP "\\" | ||||
#include <list> | #include <list> | ||||
@@ -77,7 +78,6 @@ public: | |||||
#include "asiodrvr.h" | #include "asiodrvr.h" | ||||
//--------------------------------------------------------------------------------------------- | //--------------------------------------------------------------------------------------------- | ||||
class JackRouter : public AsioDriver | class JackRouter : public AsioDriver | ||||
{ | { | ||||
@@ -18,13 +18,13 @@ | |||||
<Project filename="jack_disconnect.cbp" /> | <Project filename="jack_disconnect.cbp" /> | ||||
<Project filename="jack_test.cbp" /> | <Project filename="jack_test.cbp" /> | ||||
<Project filename="multiple_metro.cbp" /> | <Project filename="multiple_metro.cbp" /> | ||||
<Project filename="jack_winmme.cbp" /> | |||||
<Project filename="jack_winmme.cbp" active="1" /> | |||||
<Project filename="jack_loopback.cbp" /> | <Project filename="jack_loopback.cbp" /> | ||||
<Project filename="jackd.cbp" /> | <Project filename="jackd.cbp" /> | ||||
<Project filename="jack_midi_latency_test.cbp" /> | <Project filename="jack_midi_latency_test.cbp" /> | ||||
<Project filename="jack_netadapter.cbp" /> | <Project filename="jack_netadapter.cbp" /> | ||||
<Project filename="jack_netsource.cbp" /> | <Project filename="jack_netsource.cbp" /> | ||||
<Project filename="libjacknet.cbp" /> | <Project filename="libjacknet.cbp" /> | ||||
<Project filename="jack_midi_dump.cbp" active="1" /> | |||||
<Project filename="jack_midi_dump.cbp" /> | |||||
</Workspace> | </Workspace> | ||||
</CodeBlocks_workspace_file> | </CodeBlocks_workspace_file> |
@@ -66,7 +66,7 @@ JackWinMMEInputPort::JackWinMMEInputPort(const char *alias_name, | |||||
} | } | ||||
sysex_header.dwBufferLength = max_bytes; | sysex_header.dwBufferLength = max_bytes; | ||||
sysex_header.dwFlags = 0; | sysex_header.dwFlags = 0; | ||||
sysex_header.lpData = (LPSTR)(((LPBYTE) &sysex_header) + sizeof(MIDIHDR)); | |||||
sysex_header.lpData = (LPSTR)sysex_buffer; | |||||
result = midiInPrepareHeader(handle, &sysex_header, sizeof(MIDIHDR)); | result = midiInPrepareHeader(handle, &sysex_header, sizeof(MIDIHDR)); | ||||
if (result != MMSYSERR_NOERROR) { | if (result != MMSYSERR_NOERROR) { | ||||
GetInErrorString(result, error_message); | GetInErrorString(result, error_message); | ||||