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

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


+ 215
- 203
common/JackNetDriver.cpp View File

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


+ 6
- 6
common/JackNetDriver.h View File

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


+ 18
- 10
common/JackNetInterface.cpp View File

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


+ 2
- 1
common/JackNetOneDriver.cpp View File

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


+ 2
- 1
common/JackNetTool.cpp View File

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


+ 1
- 1
common/JackNetTool.h View File

@@ -558,7 +558,7 @@ namespace Jack
int RenderToNetwork (int subcycle, size_t total_size );
};

#ifdef CELT
#ifdef HAVE_CELT

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


+ 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 */

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


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

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


+ 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"
// 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
{


+ 2
- 2
windows/jackd.workspace View File

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

+ 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.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);


Loading…
Cancel
Save