 Devin Anderson
					
					
					14 years ago
						Devin Anderson
					
					
					14 years ago
				| @@ -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); | ||||