Browse Source

Merge branch 'master' of ssh://repo.or.cz/srv/git/jack2 into newer-midi

tags/1.9.8
Devin Anderson 14 years ago
parent
commit
134def28b6
14 changed files with 472 additions and 404 deletions
  1. +143
    -133
      common/JackNetAdapter.cpp
  2. +215
    -203
      common/JackNetDriver.cpp
  3. +6
    -6
      common/JackNetDriver.h
  4. +18
    -10
      common/JackNetInterface.cpp
  5. +2
    -1
      common/JackNetOneDriver.cpp
  6. +2
    -1
      common/JackNetTool.cpp
  7. +1
    -1
      common/JackNetTool.h
  8. +5
    -2
      common/JackPort.cpp
  9. +1
    -1
      linux/alsa/alsa_driver.c
  10. +36
    -8
      macosx/Jackdmp.xcodeproj/project.pbxproj
  11. +20
    -15
      windows/JackRouter/JackRouter.cpp
  12. +20
    -20
      windows/JackRouter/JackRouter.h
  13. +2
    -2
      windows/jackd.workspace
  14. +1
    -1
      windows/winmme/JackWinMMEInputPort.cpp

+ 143
- 133
common/JackNetAdapter.cpp View File

@@ -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, &params );
Jack::JackArgParser parser(load_init);
if (parser.GetArgc() > 0)
parse_params = parser.ParseParams(desc, &params);


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;
} }


+ 215
- 203
common/JackNetDriver.cpp View File

@@ -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;
} }
} }


+ 6
- 6
common/JackNetDriver.h View File

@@ -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();


+ 18
- 10
common/JackNetInterface.cpp View File

@@ -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&) {


+ 2
- 1
common/JackNetOneDriver.cpp View File

@@ -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';


+ 2
- 1
common/JackNetTool.cpp View File

@@ -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" );


+ 1
- 1
common/JackNetTool.h View File

@@ -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>




+ 5
- 2
common/JackPort.cpp View File

@@ -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))


+ 1
- 1
linux/alsa/alsa_driver.c View File

@@ -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);


+ 36
- 8
macosx/Jackdmp.xcodeproj/project.pbxproj View File

@@ -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,


+ 20
- 15
windows/JackRouter/JackRouter.cpp View File

@@ -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.
*/ */


+ 20
- 20
windows/JackRouter/JackRouter.h View File

@@ -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
{ {


+ 2
- 2
windows/jackd.workspace View File

@@ -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>

+ 1
- 1
windows/winmme/JackWinMMEInputPort.cpp View 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);


Loading…
Cancel
Save