@@ -25,19 +25,19 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
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 | |||
//we can't call JackNetSlaveInterface constructor with some parameters before | |||
//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 | |||
strcpy ( fMulticastIP, DEFAULT_MULTICAST_IP ); | |||
strcpy(fMulticastIP, DEFAULT_MULTICAST_IP); | |||
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.fTransportSync = 0; | |||
int send_audio = -1; | |||
@@ -53,19 +53,19 @@ namespace Jack | |||
//options parsing | |||
const JSList* node; | |||
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' : | |||
if (strlen (param->value.str) < 32) | |||
if (strlen(param->value.str) < 32) | |||
strcpy(fMulticastIP, param->value.str); | |||
else | |||
jack_error("Can't use multicast address %s, using default %s", param->value.ui, DEFAULT_MULTICAST_IP); | |||
break; | |||
case 'p' : | |||
fSocket.SetPort ( param->value.ui ); | |||
fSocket.SetPort(param->value.ui); | |||
break; | |||
case 'M' : | |||
fParams.fMtu = param->value.i; | |||
@@ -77,20 +77,30 @@ namespace Jack | |||
return_audio = param->value.i; | |||
break; | |||
case 'n' : | |||
strncpy ( fParams.fName, param->value.str, JACK_CLIENT_NAME_SIZE ); | |||
strncpy(fParams.fName, param->value.str, JACK_CLIENT_NAME_SIZE); | |||
break; | |||
case 't' : | |||
//fParams.fTransportSync = param->value.ui; | |||
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' : | |||
if ( strcmp ( param->value.str, "normal" ) == 0 ) | |||
if (strcmp(param->value.str, "normal") == 0) | |||
fParams.fNetworkMode = 'n'; | |||
else if ( strcmp ( param->value.str, "slow" ) == 0 ) | |||
else if (strcmp(param->value.str, "slow") == 0) | |||
fParams.fNetworkMode = 's'; | |||
else if ( strcmp ( param->value.str, "fast" ) == 0 ) | |||
else if (strcmp(param->value.str, "fast") == 0) | |||
fParams.fNetworkMode = 'f'; | |||
else | |||
jack_error ( "Unknown network mode, using 'normal' mode." ); | |||
jack_error("Unknown network mode, using 'normal' mode."); | |||
break; | |||
case 'q': | |||
fQuality = param->value.ui; | |||
@@ -103,18 +113,18 @@ namespace Jack | |||
} | |||
//set the socket parameters | |||
fSocket.SetPort ( port ); | |||
fSocket.SetAddress ( fMulticastIP, port ); | |||
fSocket.SetPort(port); | |||
fSocket.SetAddress(fMulticastIP, port); | |||
// If not set, takes deafault | |||
fParams.fSendAudioChannels = (send_audio == -1) ? 2 : send_audio; | |||
// If not set, takes deafault | |||
fParams.fReturnAudioChannels = (return_audio == -1) ? 2 : return_audio; | |||
//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) | |||
fSoftCaptureBuffer = NULL; | |||
@@ -123,18 +133,16 @@ namespace Jack | |||
JackNetAdapter::~JackNetAdapter() | |||
{ | |||
jack_log ("JackNetAdapter::~JackNetAdapter"); | |||
jack_log("JackNetAdapter::~JackNetAdapter"); | |||
int port_index; | |||
if (fSoftCaptureBuffer) | |||
{ | |||
if (fSoftCaptureBuffer) { | |||
for (port_index = 0; port_index < fCaptureChannels; port_index++) | |||
delete[] fSoftCaptureBuffer[port_index]; | |||
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; | |||
} | |||
@@ -143,14 +151,13 @@ namespace Jack | |||
//open/close-------------------------------------------------------------------------- | |||
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; | |||
} | |||
@@ -159,30 +166,28 @@ namespace Jack | |||
int JackNetAdapter::Close() | |||
{ | |||
jack_log ( "JackNetAdapter::Close" ); | |||
jack_log("JackNetAdapter::Close"); | |||
#ifdef JACK_MONITOR | |||
fTable.Save(fHostBufferSize, fHostSampleRate, fAdaptedSampleRate, fAdaptedBufferSize); | |||
#endif | |||
fSocket.Close(); | |||
switch ( fThread.GetStatus() ) | |||
switch (fThread.GetStatus()) | |||
{ | |||
// Kill the thread in Init phase | |||
case JackThread::kStarting: | |||
case JackThread::kIniting: | |||
if ( fThread.Kill() < 0 ) | |||
{ | |||
jack_error ( "Cannot kill thread" ); | |||
if (fThread.Kill() < 0) { | |||
jack_error("Cannot kill thread"); | |||
return -1; | |||
} | |||
break; | |||
// Stop when the thread cycle is finished | |||
case JackThread::kRunning: | |||
if ( fThread.Stop() < 0 ) | |||
{ | |||
jack_error ( "Cannot stop thread" ); | |||
if (fThread.Stop() < 0) { | |||
jack_error ("Cannot stop thread"); | |||
return -1; | |||
} | |||
break; | |||
@@ -194,55 +199,55 @@ namespace Jack | |||
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; | |||
} | |||
//thread------------------------------------------------------------------------------ | |||
// TODO : if failure, thread exist... need to restart ? | |||
bool JackNetAdapter::Init() | |||
{ | |||
jack_log ( "JackNetAdapter::Init" ); | |||
jack_log("JackNetAdapter::Init"); | |||
int port_index; | |||
//init network connection | |||
if (!JackNetSlaveInterface::Init()) { | |||
jack_error("JackNetSlaveInterface::Init() error..." ); | |||
jack_error("JackNetSlaveInterface::Init() error..."); | |||
return false; | |||
} | |||
//then set global parameters | |||
if (!SetParams()) { | |||
jack_error("SetParams error..." ); | |||
jack_error("SetParams error..."); | |||
return false; | |||
} | |||
//set buffers | |||
if (fCaptureChannels > 0) { | |||
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]; | |||
fNetAudioCaptureBuffer->SetBuffer ( port_index, fSoftCaptureBuffer[port_index] ); | |||
fNetAudioCaptureBuffer->SetBuffer(port_index, fSoftCaptureBuffer[port_index]); | |||
} | |||
} | |||
if (fPlaybackChannels > 0) { | |||
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]; | |||
fNetAudioPlaybackBuffer->SetBuffer ( port_index, fSoftPlaybackBuffer[port_index] ); | |||
fNetAudioPlaybackBuffer->SetBuffer(port_index, fSoftPlaybackBuffer[port_index]); | |||
} | |||
} | |||
//set audio adapter parameters | |||
SetAdaptedBufferSize ( fParams.fPeriodSize ); | |||
SetAdaptedSampleRate ( fParams.fSampleRate ); | |||
SetAdaptedBufferSize(fParams.fPeriodSize); | |||
SetAdaptedSampleRate(fParams.fSampleRate); | |||
// Will do "something" on OSX only... | |||
fThread.SetParams(GetEngineControl()->fPeriod, GetEngineControl()->fComputation, GetEngineControl()->fConstraint); | |||
@@ -254,7 +259,7 @@ namespace Jack | |||
} | |||
//init done, display parameters | |||
SessionParamsDisplay ( &fParams ); | |||
SessionParamsDisplay(&fParams); | |||
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) | |||
//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 : | |||
jack_transport_stop ( fJackClient ); | |||
jack_info ( "NetMaster : transport stops." ); | |||
jack_transport_stop(fJackClient); | |||
jack_info("NetMaster : transport stops."); | |||
break; | |||
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; | |||
case JackTransportRolling : | |||
//TODO , we need to : | |||
// - find a way to call TransportEngine->SetNetworkSync() | |||
// - turn the transport state to JackTransportRolling | |||
jack_info ( "NetMaster : transport rolls." ); | |||
jack_info("NetMaster : transport rolls."); | |||
break; | |||
} | |||
} | |||
@@ -318,33 +322,29 @@ namespace Jack | |||
int refnum = -1; | |||
bool conditional = 0; | |||
//TODO : get the actual timebase master | |||
if ( refnum != fLastTimebaseMaster ) | |||
{ | |||
if (refnum != fLastTimebaseMaster) { | |||
//timebase master has released its function | |||
if ( refnum == -1 ) | |||
{ | |||
if (refnum == -1) { | |||
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; | |||
} | |||
else | |||
} else { | |||
fReturnTransportData.fTimebaseMaster = NO_CHANGE; | |||
} | |||
//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...) ? | |||
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; | |||
} | |||
@@ -353,7 +353,7 @@ namespace Jack | |||
{ | |||
//don't return -1 in case of sync recv failure | |||
//we need the process to continue for network error detection | |||
if ( SyncRecv() == SOCKET_ERROR ) | |||
if (SyncRecv() == SOCKET_ERROR) | |||
return 0; | |||
DecodeSyncPacket(); | |||
@@ -364,7 +364,7 @@ namespace Jack | |||
{ | |||
EncodeSyncPacket(); | |||
if ( SyncSend() == SOCKET_ERROR ) | |||
if (SyncSend() == SOCKET_ERROR) | |||
return SOCKET_ERROR; | |||
return DataSend(); | |||
@@ -403,77 +403,87 @@ extern "C" | |||
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->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; | |||
strcpy ( desc->params[i].name, "multicast_ip" ); | |||
strcpy(desc->params[i].name, "multicast_ip"); | |||
desc->params[i].character = 'a'; | |||
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++; | |||
strcpy ( desc->params[i].name, "udp_net_port" ); | |||
strcpy(desc->params[i].name, "udp_net_port"); | |||
desc->params[i].character = 'p'; | |||
desc->params[i].type = JackDriverParamInt; | |||
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++; | |||
strcpy ( desc->params[i].name, "mtu" ); | |||
strcpy(desc->params[i].name, "mtu"); | |||
desc->params[i].character = 'M'; | |||
desc->params[i].type = JackDriverParamInt; | |||
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++; | |||
strcpy ( desc->params[i].name, "input-ports" ); | |||
strcpy(desc->params[i].name, "input-ports"); | |||
desc->params[i].character = 'C'; | |||
desc->params[i].type = JackDriverParamInt; | |||
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++; | |||
strcpy ( desc->params[i].name, "output-ports" ); | |||
strcpy(desc->params[i].name, "output-ports"); | |||
desc->params[i].character = 'P'; | |||
desc->params[i].type = JackDriverParamInt; | |||
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++; | |||
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].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++; | |||
strcpy ( desc->params[i].name, "transport-sync" ); | |||
strcpy(desc->params[i].name, "transport-sync"); | |||
desc->params[i].character = 't'; | |||
desc->params[i].type = JackDriverParamUInt; | |||
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++; | |||
strcpy ( desc->params[i].name, "mode" ); | |||
strcpy(desc->params[i].name, "mode"); | |||
desc->params[i].character = 'm'; | |||
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++; | |||
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)"); | |||
i++; | |||
strcpy ( desc->params[i].name, "auto-connect" ); | |||
strcpy (desc->params[i].name, "auto-connect"); | |||
desc->params[i].character = 'c'; | |||
desc->params[i].type = JackDriverParamBool; | |||
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; | |||
} | |||
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_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 { | |||
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) { | |||
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; | |||
bool parse_params = true; | |||
int res = 1; | |||
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) { | |||
res = jack_internal_initialize ( jack_client, params ); | |||
parser.FreeParams ( params ); | |||
res = jack_internal_initialize(jack_client, params); | |||
parser.FreeParams(params); | |||
} | |||
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) { | |||
jack_log ( "Unloading netadapter" ); | |||
jack_log("Unloading netadapter"); | |||
adapter->Close(); | |||
delete adapter; | |||
} | |||
@@ -27,22 +27,28 @@ using namespace std; | |||
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 | |||
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.fSendMidiChannels = midi_input_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.fNetworkMode = network_mode; | |||
fSendTransportData.fState = -1; | |||
@@ -67,30 +73,28 @@ namespace Jack | |||
} | |||
//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->fComputation = 500 * 1000; | |||
fEngineControl->fConstraint = 500 * 1000; | |||
return 0; | |||
} | |||
else | |||
{ | |||
} else { | |||
return -1; | |||
} | |||
} | |||
@@ -98,7 +102,7 @@ namespace Jack | |||
int JackNetDriver::Close() | |||
{ | |||
#ifdef JACK_MONITOR | |||
if ( fNetTimeMon ) | |||
if (fNetTimeMon) | |||
fNetTimeMon->Save(); | |||
#endif | |||
FreeAll(); | |||
@@ -139,8 +143,8 @@ namespace Jack | |||
fParams.fSlaveSyncMode = fEngineControl->fSyncMode; | |||
//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 | |||
if (!JackNetSlaveInterface::Init()) { | |||
@@ -150,7 +154,7 @@ namespace Jack | |||
//set global parameters | |||
if (!SetParams()) { | |||
jack_error("SetParams error..." ); | |||
jack_error("SetParams error..."); | |||
return false; | |||
} | |||
@@ -185,48 +189,48 @@ namespace Jack | |||
#ifdef JACK_MONITOR | |||
string plot_name; | |||
//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' : | |||
plot_name += string ( "_slow" ); | |||
plot_name += string("_slow"); | |||
break; | |||
case 'n' : | |||
plot_name += string ( "_normal" ); | |||
plot_name += string("_normal"); | |||
break; | |||
case 'f' : | |||
plot_name += string ( "_fast" ); | |||
plot_name += string("_fast"); | |||
break; | |||
} | |||
fNetTimeMon = new JackGnuPlotMonitor<float> ( 128, 5, plot_name ); | |||
fNetTimeMon = new JackGnuPlotMonitor<float>(128, 5, plot_name); | |||
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 ( "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 | |||
//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 | |||
fEngineControl->fTransport.SetNetworkSync ( fParams.fTransportSync ); | |||
fEngineControl->fTransport.SetNetworkSync(fParams.fTransportSync); | |||
return true; | |||
} | |||
@@ -261,7 +265,7 @@ namespace Jack | |||
//jack ports and buffers-------------------------------------------------------------- | |||
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; | |||
jack_port_id_t port_id; | |||
@@ -274,39 +278,39 @@ namespace Jack | |||
//audio | |||
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; | |||
} | |||
port = fGraphManager->GetPort ( port_id ); | |||
port->SetAlias ( alias ); | |||
port = fGraphManager->GetPort(port_id); | |||
port->SetAlias(alias); | |||
//port latency | |||
range.min = range.max = fEngineControl->fBufferSize; | |||
port->SetLatencyRange(JackCaptureLatency, &range); | |||
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; | |||
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; | |||
} | |||
port = fGraphManager->GetPort ( port_id ); | |||
port->SetAlias ( alias ); | |||
port = fGraphManager->GetPort(port_id); | |||
port->SetAlias(alias); | |||
//port latency | |||
switch ( fParams.fNetworkMode ) | |||
switch (fParams.fNetworkMode) | |||
{ | |||
case 'f' : | |||
range.min = range.max = (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize; | |||
@@ -320,42 +324,42 @@ namespace Jack | |||
} | |||
port->SetLatencyRange(JackPlaybackLatency, &range); | |||
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 | |||
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; | |||
} | |||
port = fGraphManager->GetPort ( port_id ); | |||
port = fGraphManager->GetPort(port_id); | |||
//port latency | |||
range.min = range.max = fEngineControl->fBufferSize; | |||
port->SetLatencyRange(JackCaptureLatency, &range); | |||
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; | |||
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; | |||
} | |||
port = fGraphManager->GetPort ( port_id ); | |||
port = fGraphManager->GetPort(port_id); | |||
//port latency | |||
switch ( fParams.fNetworkMode ) | |||
switch (fParams.fNetworkMode) | |||
{ | |||
case 'f' : | |||
range.min = range.max = (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize; | |||
@@ -369,7 +373,7 @@ namespace Jack | |||
} | |||
port->SetLatencyRange(JackPlaybackLatency, &range); | |||
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; | |||
@@ -412,14 +416,14 @@ namespace Jack | |||
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--------------------------------------------------------------------------- | |||
@@ -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 | |||
int refnum; | |||
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 ? | |||
if ( fSendTransportData.fNewState && ( fSendTransportData.fState != fEngineControl->fTransport.GetState() ) ) | |||
if (fSendTransportData.fNewState &&(fSendTransportData.fState != fEngineControl->fTransport.GetState())) | |||
{ | |||
switch ( fSendTransportData.fState ) | |||
switch (fSendTransportData.fState) | |||
{ | |||
case JackTransportStopped : | |||
fEngineControl->fTransport.SetCommand ( TransportCommandStop ); | |||
jack_info ( "Master stops transport." ); | |||
fEngineControl->fTransport.SetCommand(TransportCommandStop); | |||
jack_info("Master stops transport."); | |||
break; | |||
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; | |||
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; | |||
} | |||
} | |||
@@ -471,20 +475,20 @@ namespace Jack | |||
//is there a timebase master change ? | |||
int refnum; | |||
bool conditional; | |||
fEngineControl->fTransport.GetTimebaseMaster ( refnum, conditional ); | |||
if ( refnum != fLastTimebaseMaster ) | |||
fEngineControl->fTransport.GetTimebaseMaster(refnum, conditional); | |||
if (refnum != fLastTimebaseMaster) | |||
{ | |||
//timebase master has released its function | |||
if ( refnum == -1 ) | |||
if (refnum == -1) | |||
{ | |||
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 | |||
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; | |||
} | |||
@@ -493,14 +497,14 @@ namespace Jack | |||
*/ | |||
//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...) ? | |||
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; | |||
} | |||
@@ -511,17 +515,17 @@ namespace Jack | |||
int audio_port_index; | |||
//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 | |||
fNetTimeMon->New(); | |||
#endif | |||
//receive sync (launch the cycle) | |||
if ( SyncRecv() == SOCKET_ERROR ) | |||
if (SyncRecv() == SOCKET_ERROR) | |||
return 0; | |||
#ifdef JACK_MONITOR | |||
@@ -534,17 +538,17 @@ namespace Jack | |||
DecodeSyncPacket(); | |||
#ifdef JACK_MONITOR | |||
fNetTimeMon->Add ( ( ( float ) ( GetMicroSeconds() - fRcvSyncUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f ); | |||
fNetTimeMon->Add(((float)(GetMicroSeconds() - fRcvSyncUst) / (float)fEngineControl->fPeriodUsecs) * 100.f); | |||
#endif | |||
//audio, midi or sync if driver is late | |||
if ( DataRecv() == SOCKET_ERROR ) | |||
if (DataRecv() == SOCKET_ERROR) | |||
return SOCKET_ERROR; | |||
//take the time at the beginning of the cycle | |||
JackDriver::CycleTakeBeginTime(); | |||
#ifdef JACK_MONITOR | |||
fNetTimeMon->Add ( ( ( float ) ( GetMicroSeconds() - fRcvSyncUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f ); | |||
fNetTimeMon->Add(((float)(GetMicroSeconds() - fRcvSyncUst) / (float)fEngineControl->fPeriodUsecs) * 100.f); | |||
#endif | |||
return 0; | |||
@@ -556,32 +560,32 @@ namespace Jack | |||
int audio_port_index; | |||
//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 | |||
fNetTimeMon->Add ( ( ( float ) ( GetMicroSeconds() - fRcvSyncUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f ); | |||
fNetTimeMon->Add(((float) (GetMicroSeconds() - fRcvSyncUst) / (float)fEngineControl->fPeriodUsecs) * 100.f); | |||
#endif | |||
//sync | |||
EncodeSyncPacket(); | |||
//send sync | |||
if ( SyncSend() == SOCKET_ERROR ) | |||
if (SyncSend() == SOCKET_ERROR) | |||
return SOCKET_ERROR; | |||
#ifdef JACK_MONITOR | |||
fNetTimeMon->Add ( ( ( float ) ( GetMicroSeconds() - fRcvSyncUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f ); | |||
fNetTimeMon->Add(((float)(GetMicroSeconds() - fRcvSyncUst) / (float) fEngineControl->fPeriodUsecs) * 100.f); | |||
#endif | |||
//send data | |||
if ( DataSend() == SOCKET_ERROR ) | |||
if (DataSend() == SOCKET_ERROR) | |||
return SOCKET_ERROR; | |||
#ifdef JACK_MONITOR | |||
fNetTimeMon->AddLast ( ( ( float ) ( GetMicroSeconds() - fRcvSyncUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f ); | |||
fNetTimeMon->AddLast(((float)(GetMicroSeconds() - fRcvSyncUst) / (float) fEngineControl->fPeriodUsecs) * 100.f); | |||
#endif | |||
return 0; | |||
@@ -593,103 +597,112 @@ namespace Jack | |||
extern "C" | |||
{ | |||
#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; | |||
strcpy ( desc->params[i].name, "multicast_ip" ); | |||
strcpy(desc->params[i].name, "multicast_ip"); | |||
desc->params[i].character = 'a'; | |||
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++; | |||
strcpy ( desc->params[i].name, "udp_net_port" ); | |||
strcpy(desc->params[i].name, "udp_net_port"); | |||
desc->params[i].character = 'p'; | |||
desc->params[i].type = JackDriverParamInt; | |||
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++; | |||
strcpy ( desc->params[i].name, "mtu" ); | |||
strcpy(desc->params[i].name, "mtu"); | |||
desc->params[i].character = 'M'; | |||
desc->params[i].type = JackDriverParamInt; | |||
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++; | |||
strcpy ( desc->params[i].name, "input_ports" ); | |||
strcpy(desc->params[i].name, "input_ports"); | |||
desc->params[i].character = 'C'; | |||
desc->params[i].type = JackDriverParamInt; | |||
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++; | |||
strcpy ( desc->params[i].name, "output_ports" ); | |||
strcpy(desc->params[i].name, "output_ports"); | |||
desc->params[i].character = 'P'; | |||
desc->params[i].type = JackDriverParamInt; | |||
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++; | |||
strcpy ( desc->params[i].name, "midi_in_ports" ); | |||
strcpy(desc->params[i].name, "midi_in_ports"); | |||
desc->params[i].character = 'i'; | |||
desc->params[i].type = JackDriverParamInt; | |||
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++; | |||
strcpy ( desc->params[i].name, "midi_out_ports" ); | |||
strcpy(desc->params[i].name, "midi_out_ports"); | |||
desc->params[i].character = 'o'; | |||
desc->params[i].type = JackDriverParamInt; | |||
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++; | |||
strcpy ( desc->params[i].name, "client_name" ); | |||
strcpy(desc->params[i].name, "client_name"); | |||
desc->params[i].character = 'n'; | |||
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++; | |||
strcpy ( desc->params[i].name, "transport_sync" ); | |||
strcpy(desc->params[i].name, "transport_sync"); | |||
desc->params[i].character = 't'; | |||
desc->params[i].type = JackDriverParamUInt; | |||
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++; | |||
strcpy ( desc->params[i].name, "mode" ); | |||
strcpy(desc->params[i].name, "mode"); | |||
desc->params[i].character = 'm'; | |||
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; | |||
} | |||
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]; | |||
strcpy ( multicast_ip, DEFAULT_MULTICAST_IP ); | |||
strcpy(multicast_ip, DEFAULT_MULTICAST_IP); | |||
char net_name[JACK_CLIENT_NAME_SIZE + 1]; | |||
int udp_port = DEFAULT_PORT; | |||
int mtu = DEFAULT_MTU; | |||
@@ -700,6 +713,7 @@ namespace Jack | |||
int audio_playback_ports = -1; | |||
int midi_input_ports = 0; | |||
int midi_output_ports = 0; | |||
int celt_encoding = -1; | |||
bool monitor = false; | |||
char network_mode = 's'; | |||
const JSList* node; | |||
@@ -707,13 +721,12 @@ namespace Jack | |||
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' : | |||
strncpy ( multicast_ip, param->value.str, 15 ); | |||
strncpy(multicast_ip, param->value.str, 15); | |||
break; | |||
case 'p': | |||
udp_port = param->value.ui; | |||
@@ -733,46 +746,45 @@ namespace Jack | |||
case 'o': | |||
midi_output_ports = param->value.i; | |||
break; | |||
#if HAVE_CELT | |||
case 'c': | |||
celt_encoding = param->value.i; | |||
break; | |||
#endif | |||
case 'n' : | |||
strncpy ( net_name, param->value.str, JACK_CLIENT_NAME_SIZE ); | |||
strncpy(net_name, param->value.str, JACK_CLIENT_NAME_SIZE); | |||
break; | |||
case 't' : | |||
transport_sync = param->value.ui; | |||
break; | |||
case 'm' : | |||
if ( strcmp ( param->value.str, "normal" ) == 0 ) | |||
if (strcmp(param->value.str, "normal") == 0) | |||
network_mode = 'n'; | |||
else if ( strcmp ( param->value.str, "slow" ) == 0 ) | |||
else if (strcmp(param->value.str, "slow") == 0) | |||
network_mode = 's'; | |||
else if ( strcmp ( param->value.str, "fast" ) == 0 ) | |||
else if (strcmp(param->value.str, "fast") == 0) | |||
network_mode = 'f'; | |||
else | |||
jack_error ( "Unknown network mode, using 'normal' mode." ); | |||
jack_error("Unknown network mode, using 'normal' mode."); | |||
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; | |||
} | |||
else | |||
{ | |||
} else { | |||
delete driver; | |||
return NULL; | |||
} | |||
} | |||
catch ( ... ) | |||
{ | |||
} catch (...) { | |||
return NULL; | |||
} | |||
} | |||
@@ -68,14 +68,14 @@ namespace Jack | |||
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(); | |||
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 Attach(); | |||
@@ -258,11 +258,13 @@ namespace Jack | |||
break; | |||
case JackCeltEncoder: | |||
#ifdef CELT | |||
#ifdef HAVE_CELT | |||
fNetAudioCaptureBuffer = new NetCeltAudioBuffer(&fParams, fParams.fSendAudioChannels, fTxData, fParams.fKBps); | |||
#endif | |||
break; | |||
} | |||
assert(fNetAudioCaptureBuffer); | |||
} | |||
if (fParams.fReturnAudioChannels) { | |||
@@ -278,11 +280,13 @@ namespace Jack | |||
break; | |||
case JackCeltEncoder: | |||
#ifdef CELT | |||
#ifdef HAVE_CELT | |||
fNetAudioPlaybackBuffer = new NetCeltAudioBuffer(&fParams, fParams.fReturnAudioChannels, fRxData, fParams.fKBps); | |||
#endif | |||
break; | |||
} | |||
assert(fNetAudioPlaybackBuffer); | |||
} | |||
} catch (exception&) { | |||
@@ -788,19 +792,21 @@ namespace Jack | |||
switch (fParams.fSampleEncoder) { | |||
case JackFloatEncoder: | |||
fNetAudioCaptureBuffer = new NetFloatAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | |||
fNetAudioCaptureBuffer = new NetFloatAudioBuffer(&fParams, fParams.fSendAudioChannels, fRxData); | |||
break; | |||
case JackIntEncoder: | |||
fNetAudioCaptureBuffer = new NetIntAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | |||
fNetAudioCaptureBuffer = new NetIntAudioBuffer(&fParams, fParams.fSendAudioChannels, fRxData); | |||
break; | |||
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 | |||
break; | |||
} | |||
assert(fNetAudioCaptureBuffer); | |||
} | |||
if (fParams.fReturnAudioChannels) { | |||
@@ -808,19 +814,21 @@ namespace Jack | |||
switch (fParams.fSampleEncoder) { | |||
case JackFloatEncoder: | |||
fNetAudioPlaybackBuffer = new NetFloatAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | |||
fNetAudioPlaybackBuffer = new NetFloatAudioBuffer(&fParams, fParams.fReturnAudioChannels, fTxData); | |||
break; | |||
case JackIntEncoder: | |||
fNetAudioPlaybackBuffer = new NetIntAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData); | |||
fNetAudioPlaybackBuffer = new NetIntAudioBuffer(&fParams, fParams.fReturnAudioChannels, fTxData); | |||
break; | |||
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 | |||
break; | |||
} | |||
assert(fNetAudioPlaybackBuffer); | |||
} | |||
} catch (exception&) { | |||
@@ -871,6 +871,7 @@ extern "C" | |||
"Factor for sample rate reduction on the upstream"); | |||
strcpy (params[i].long_desc, params[i].short_desc); | |||
#if HAVE_CELT | |||
i++; | |||
strcpy (params[i].name, "celt"); | |||
params[i].character = 'c'; | |||
@@ -879,7 +880,7 @@ extern "C" | |||
strcpy (params[i].short_desc, | |||
"sets celt encoding and number of kbits per channel"); | |||
strcpy (params[i].long_desc, params[i].short_desc); | |||
#endif | |||
i++; | |||
strcpy (params[i].name, "bit-depth"); | |||
params[i].character = 'b'; | |||
@@ -249,7 +249,7 @@ namespace Jack | |||
// Celt audio buffer ********************************************************************************* | |||
#ifdef CELT | |||
#ifdef HAVE_CELT | |||
#define KPS 32 | |||
#define KPS_DIV 8 | |||
@@ -729,6 +729,7 @@ namespace Jack | |||
break; | |||
case (JackCeltEncoder): | |||
jack_info ( "SampleEncoder : %s", "CELT"); | |||
jack_info ( "kBits : %d", params->fKBps); | |||
break; | |||
}; | |||
jack_info ( "Slave mode : %s", ( params->fSlaveSyncMode ) ? "sync" : "async" ); | |||
@@ -558,7 +558,7 @@ namespace Jack | |||
int RenderToNetwork (int subcycle, size_t total_size ); | |||
}; | |||
#ifdef CELT | |||
#ifdef HAVE_CELT | |||
#include <celt/celt.h> | |||
@@ -44,6 +44,7 @@ bool JackPort::Allocate(int refnum, const char* port_name, const char* port_type | |||
fInUse = true; | |||
fLatency = 0; | |||
fTotalLatency = 0; | |||
fMonitorRequests = 0; | |||
fPlaybackLatency.min = fPlaybackLatency.max = 0; | |||
fCaptureLatency.min = fCaptureLatency.max = 0; | |||
fTied = NO_PORT; | |||
@@ -65,6 +66,8 @@ void JackPort::Release() | |||
fLatency = 0; | |||
fTotalLatency = 0; | |||
fMonitorRequests = 0; | |||
fPlaybackLatency.min = fPlaybackLatency.max = 0; | |||
fCaptureLatency.min = fCaptureLatency.max = 0; | |||
fTied = NO_PORT; | |||
fAlias1[0] = '\0'; | |||
fAlias2[0] = '\0'; | |||
@@ -107,7 +110,7 @@ void JackPort::SetLatencyRange(jack_latency_callback_mode_t mode, jack_latency_r | |||
if (mode == JackCaptureLatency) { | |||
fCaptureLatency = *range; | |||
/* hack to set port->shared->latency up for | |||
/* hack to set latency up for | |||
* backend ports | |||
*/ | |||
if ((fFlags & JackPortIsOutput) && (fFlags & JackPortIsPhysical)) | |||
@@ -115,7 +118,7 @@ void JackPort::SetLatencyRange(jack_latency_callback_mode_t mode, jack_latency_r | |||
} else { | |||
fPlaybackLatency = *range; | |||
/* hack to set port->shared->latency up for | |||
/* hack to set latency up for | |||
* backend ports | |||
*/ | |||
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 */ | |||
char tmp[5]; | |||
strncpy(tmp,strstr(driver->alsa_name_playback,"hw"),4); | |||
strncpy(tmp,strcasestr(driver->alsa_name_playback,"hw"),4); | |||
tmp[4]='\0'; | |||
jack_info("control device %s",tmp); | |||
ctl_name = strdup(tmp); | |||
@@ -9497,6 +9497,7 @@ | |||
"-DUSE_POSIX_SHM", | |||
); | |||
OTHER_CPLUSPLUSFLAGS = ( | |||
"-DHAVE_CELT", | |||
"-DSERVER_SIDE", | |||
"-DJACK_32_64", | |||
"-D__SMP__", | |||
@@ -9565,6 +9566,7 @@ | |||
"-DUSE_POSIX_SHM", | |||
); | |||
OTHER_CPLUSPLUSFLAGS = ( | |||
"-DHAVE_CELT", | |||
"-DSERVER_SIDE", | |||
"-DJACK_32_64", | |||
"-D__SMP__", | |||
@@ -13692,7 +13694,10 @@ | |||
LIBRARY_STYLE = DYNAMIC; | |||
MACH_O_TYPE = mh_dylib; | |||
OTHER_CFLAGS = ""; | |||
OTHER_CPLUSPLUSFLAGS = "-DMACH_RPC_MACH_SEMA"; | |||
OTHER_CPLUSPLUSFLAGS = ( | |||
"-DHAVE_CELT", | |||
"-DMACH_RPC_MACH_SEMA", | |||
); | |||
OTHER_LDFLAGS = ( | |||
/usr/local/lib/libsamplerate.a, | |||
"-framework", | |||
@@ -13743,7 +13748,10 @@ | |||
MACH_O_TYPE = mh_dylib; | |||
MACOSX_DEPLOYMENT_TARGET = 10.4; | |||
OTHER_CFLAGS = ""; | |||
OTHER_CPLUSPLUSFLAGS = "-DMACH_RPC_MACH_SEMA"; | |||
OTHER_CPLUSPLUSFLAGS = ( | |||
"-DHAVE_CELT", | |||
"-DMACH_RPC_MACH_SEMA", | |||
); | |||
OTHER_LDFLAGS = ( | |||
/opt/local/lib/libsamplerate.a, | |||
"-framework", | |||
@@ -14333,6 +14341,7 @@ | |||
"-DUSE_POSIX_SHM", | |||
); | |||
OTHER_CPLUSPLUSFLAGS = ( | |||
"-DHAVE_CELT", | |||
"-DSERVER_SIDE", | |||
"-D__SMP__", | |||
"-DMACH_RPC_MACH_SEMA", | |||
@@ -14393,6 +14402,7 @@ | |||
"-DUSE_POSIX_SHM", | |||
); | |||
OTHER_CPLUSPLUSFLAGS = ( | |||
"-DHAVE_CELT", | |||
"-DSERVER_SIDE", | |||
"-D__SMP__", | |||
"-DMACH_RPC_MACH_SEMA", | |||
@@ -16445,6 +16455,7 @@ | |||
"-DUSE_POSIX_SHM", | |||
); | |||
OTHER_CPLUSPLUSFLAGS = ( | |||
"-DHAVE_CELT", | |||
"-DJACK_MONITOR", | |||
"-DSERVER_SIDE", | |||
"-DJACK_32_64", | |||
@@ -16513,6 +16524,7 @@ | |||
"-DUSE_POSIX_SHM", | |||
); | |||
OTHER_CPLUSPLUSFLAGS = ( | |||
"-DHAVE_CELT", | |||
"-DJACK_MONITOR", | |||
"-DSERVER_SIDE", | |||
"-DJACK_32_64", | |||
@@ -17181,7 +17193,10 @@ | |||
LIBRARY_STYLE = DYNAMIC; | |||
MACH_O_TYPE = mh_dylib; | |||
OTHER_CFLAGS = ""; | |||
OTHER_CPLUSPLUSFLAGS = "-DMACH_RPC_MACH_SEMA"; | |||
OTHER_CPLUSPLUSFLAGS = ( | |||
"-DHAVE_CELT", | |||
"-DMACH_RPC_MACH_SEMA", | |||
); | |||
OTHER_LDFLAGS = ( | |||
"-framework", | |||
Jackservermp, | |||
@@ -17230,6 +17245,7 @@ | |||
MACOSX_DEPLOYMENT_TARGET = 10.4; | |||
OTHER_CFLAGS = "-DJACK_32_64"; | |||
OTHER_CPLUSPLUSFLAGS = ( | |||
"-DHAVE_CELT", | |||
"-DSERVER_SIDE", | |||
"-DMACH_RPC_MACH_SEMA", | |||
"-DJACK_32_64", | |||
@@ -17617,8 +17633,13 @@ | |||
INSTALL_PATH = /usr/local/lib; | |||
LIBRARY_STYLE = DYNAMIC; | |||
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 = ( | |||
/opt/local/lib/libsamplerate.a, | |||
"-framework", | |||
@@ -17669,9 +17690,10 @@ | |||
MACOSX_DEPLOYMENT_TARGET = 10.4; | |||
OTHER_CFLAGS = "-DJACK_32_64"; | |||
OTHER_CPLUSPLUSFLAGS = ( | |||
"-DJACK_32_64", | |||
"-DHAVE_CELT", | |||
"-DSERVER_SIDE", | |||
"-DMACH_RPC_MACH_SEMA", | |||
"-DJACK_32_64", | |||
); | |||
OTHER_LDFLAGS = ( | |||
/opt/local/lib/libsamplerate.a, | |||
@@ -18873,7 +18895,10 @@ | |||
LIBRARY_STYLE = DYNAMIC; | |||
MACH_O_TYPE = mh_dylib; | |||
OTHER_CFLAGS = ""; | |||
OTHER_CPLUSPLUSFLAGS = "-DMACH_RPC_MACH_SEMA"; | |||
OTHER_CPLUSPLUSFLAGS = ( | |||
"-DHAVE_CELT", | |||
"-DMACH_RPC_MACH_SEMA", | |||
); | |||
OTHER_LDFLAGS = ( | |||
"-framework", | |||
Jackservermp, | |||
@@ -18923,7 +18948,10 @@ | |||
MACH_O_TYPE = mh_dylib; | |||
MACOSX_DEPLOYMENT_TARGET = 10.4; | |||
OTHER_CFLAGS = ""; | |||
OTHER_CPLUSPLUSFLAGS = "-DMACH_RPC_MACH_SEMA"; | |||
OTHER_CPLUSPLUSFLAGS = ( | |||
"-DHAVE_CELT", | |||
"-DMACH_RPC_MACH_SEMA", | |||
); | |||
OTHER_LDFLAGS = ( | |||
"-framework", | |||
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" | |||
// Globals | |||
static int kBlockFrames = 256; | |||
static int kNumInputs = 4; | |||
static int kNumOutputs = 4; | |||
#if WINDOWS | |||
#include "jack.h" | |||
@@ -44,9 +47,7 @@ static int kNumOutputs = 4; | |||
#include "iasiodrv.h" | |||
#define MAX_PORTS 32 | |||
#define LONG_SAMPLE 1 | |||
#define PATH_SEP "\\" | |||
#include <list> | |||
@@ -77,7 +78,6 @@ public: | |||
#include "asiodrvr.h" | |||
//--------------------------------------------------------------------------------------------- | |||
class JackRouter : public AsioDriver | |||
{ | |||
@@ -18,13 +18,13 @@ | |||
<Project filename="jack_disconnect.cbp" /> | |||
<Project filename="jack_test.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="jackd.cbp" /> | |||
<Project filename="jack_midi_latency_test.cbp" /> | |||
<Project filename="jack_netadapter.cbp" /> | |||
<Project filename="jack_netsource.cbp" /> | |||
<Project filename="libjacknet.cbp" /> | |||
<Project filename="jack_midi_dump.cbp" active="1" /> | |||
<Project filename="jack_midi_dump.cbp" /> | |||
</Workspace> | |||
</CodeBlocks_workspace_file> |
@@ -66,7 +66,7 @@ JackWinMMEInputPort::JackWinMMEInputPort(const char *alias_name, | |||
} | |||
sysex_header.dwBufferLength = max_bytes; | |||
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)); | |||
if (result != MMSYSERR_NOERROR) { | |||
GetInErrorString(result, error_message); | |||