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