git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4253 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.8
@@ -34,6 +34,11 @@ Valerio Pilo | |||
Jackdmp changes log | |||
--------------------------- | |||
2011-04-02 Stephane Letz <letz@grame.fr> | |||
* Netdriver can now ask for in/out values from the master (in progress). | |||
* Correct drivers parameter settings. | |||
2011-04-01 Stephane Letz <letz@grame.fr> | |||
* Merge newer-midi branch (Devin Anderson redesign of the MIDI drivers: alsarawmidi, ffado, coremidi and winmme). | |||
@@ -150,6 +150,10 @@ namespace Jack | |||
//set global parameters | |||
SetParams(); | |||
// If -1 at conection time, in/out channels count is sent by the master | |||
fCaptureChannels = fParams.fSendAudioChannels; | |||
fPlaybackChannels = fParams.fReturnAudioChannels; | |||
//allocate midi ports lists | |||
fMidiCapturePortList = new jack_port_id_t [fParams.fSendMidiChannels]; | |||
fMidiPlaybackPortList = new jack_port_id_t [fParams.fReturnMidiChannels]; | |||
@@ -157,10 +161,10 @@ namespace Jack | |||
assert(fMidiCapturePortList); | |||
assert(fMidiPlaybackPortList); | |||
for (uint midi_port_index = 0; midi_port_index < fParams.fSendMidiChannels; midi_port_index++) { | |||
for (int midi_port_index = 0; midi_port_index < fParams.fSendMidiChannels; midi_port_index++) { | |||
fMidiCapturePortList[midi_port_index] = NULL; | |||
} | |||
for (uint midi_port_index = 0; midi_port_index < fParams.fReturnMidiChannels; midi_port_index++) { | |||
for (int midi_port_index = 0; midi_port_index < fParams.fReturnMidiChannels; midi_port_index++) { | |||
fMidiPlaybackPortList[midi_port_index] = NULL; | |||
} | |||
@@ -261,7 +265,7 @@ namespace Jack | |||
char alias[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; | |||
unsigned long port_flags; | |||
int audio_port_index; | |||
uint midi_port_index; | |||
int midi_port_index; | |||
jack_latency_range_t range; | |||
//audio | |||
@@ -383,13 +387,13 @@ namespace Jack | |||
} | |||
} | |||
for (uint midi_port_index = 0; midi_port_index < fParams.fSendMidiChannels; midi_port_index++) { | |||
for (int midi_port_index = 0; midi_port_index < fParams.fSendMidiChannels; midi_port_index++) { | |||
if (fMidiCapturePortList && fMidiCapturePortList[midi_port_index] > 0) { | |||
fGraphManager->ReleasePort ( fClientControl.fRefNum, fMidiCapturePortList[midi_port_index]); | |||
} | |||
} | |||
for (uint midi_port_index = 0; midi_port_index < fParams.fReturnMidiChannels; midi_port_index++) { | |||
for (int midi_port_index = 0; midi_port_index < fParams.fReturnMidiChannels; midi_port_index++) { | |||
if (fMidiPlaybackPortList && fMidiPlaybackPortList[midi_port_index] > 0) { | |||
fGraphManager->ReleasePort ( fClientControl.fRefNum, fMidiPlaybackPortList[midi_port_index]); | |||
} | |||
@@ -495,8 +499,8 @@ namespace Jack | |||
//driver processes-------------------------------------------------------------------- | |||
int JackNetDriver::Read() | |||
{ | |||
uint midi_port_index; | |||
uint audio_port_index; | |||
int midi_port_index; | |||
int audio_port_index; | |||
//buffers | |||
for ( midi_port_index = 0; midi_port_index < fParams.fSendMidiChannels; midi_port_index++ ) | |||
@@ -540,7 +544,7 @@ namespace Jack | |||
int JackNetDriver::Write() | |||
{ | |||
uint midi_port_index; | |||
int midi_port_index; | |||
int audio_port_index; | |||
//buffers | |||
@@ -618,24 +622,24 @@ namespace Jack | |||
i++; | |||
strcpy ( desc->params[i].name, "input_ports" ); | |||
desc->params[i].character = 'C'; | |||
desc->params[i].type = JackDriverParamInt; | |||
desc->params[i].value.i = 2; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.ui = 2; | |||
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" ); | |||
desc->params[i].character = 'P'; | |||
desc->params[i].type = JackDriverParamInt; | |||
desc->params[i].value.i = 2; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.ui = 2; | |||
strcpy ( desc->params[i].short_desc, "Number of audio output ports" ); | |||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||
i++; | |||
strcpy ( desc->params[i].name, "midi_in_ports" ); | |||
desc->params[i].character = 'i'; | |||
desc->params[i].type = JackDriverParamInt; | |||
desc->params[i].value.i = 0; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.ui = 0; | |||
strcpy ( desc->params[i].short_desc, "Number of midi input ports" ); | |||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||
@@ -643,7 +647,7 @@ namespace Jack | |||
strcpy ( desc->params[i].name, "midi_out_ports" ); | |||
desc->params[i].character = 'o'; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.i = 0; | |||
desc->params[i].value.ui = 0; | |||
strcpy ( desc->params[i].short_desc, "Number of midi output ports" ); | |||
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); | |||
@@ -542,6 +542,32 @@ namespace Jack | |||
SocketAPIEnd(); | |||
} | |||
int JackNetMasterManager::CountPhysicalInputs() | |||
{ | |||
const char **ports; | |||
int count = 0; | |||
ports = jack_get_ports(fManagerClient, NULL, NULL, JackPortIsPhysical | JackPortIsOutput); | |||
if (ports != NULL) { | |||
while(ports[count]) count++; | |||
free(ports); | |||
} | |||
return count; | |||
} | |||
int JackNetMasterManager::CountPhysicalOutputs() | |||
{ | |||
const char **ports; | |||
int count = 0; | |||
ports = jack_get_ports(fManagerClient, NULL, NULL, JackPortIsPhysical | JackPortIsInput); | |||
if (ports != NULL) { | |||
while(ports[count]) count++; | |||
free(ports); | |||
} | |||
return count; | |||
} | |||
int JackNetMasterManager::SetSyncCallback ( jack_transport_state_t state, jack_position_t* pos, void* arg ) | |||
{ | |||
return static_cast<JackNetMasterManager*> ( arg )->SyncCallback ( state, pos ); | |||
@@ -669,13 +695,23 @@ namespace Jack | |||
params.fSampleRate = jack_get_sample_rate ( fManagerClient ); | |||
params.fPeriodSize = jack_get_buffer_size ( fManagerClient ); | |||
params.fBitdepth = 0; | |||
SetSlaveName ( params ); | |||
if (params.fSendAudioChannels == -1) { | |||
params.fSendAudioChannels = CountPhysicalInputs(); | |||
jack_info( "Takes physical %d inputs for client", params.fSendAudioChannels); | |||
} | |||
if (params.fReturnAudioChannels == -1) { | |||
params.fReturnAudioChannels = CountPhysicalOutputs(); | |||
jack_info("Takes physical %d outputs for client", params.fReturnAudioChannels); | |||
} | |||
SetSlaveName (params); | |||
//create a new master and add it to the list | |||
JackNetMaster* master = new JackNetMaster(fSocket, params, fMulticastIP); | |||
if ( master->Init(fAutoConnect) ) | |||
{ | |||
fMasterList.push_back ( master ); | |||
if (master->Init(fAutoConnect)) { | |||
fMasterList.push_back(master); | |||
return master; | |||
} | |||
delete master; | |||
@@ -37,6 +37,9 @@ namespace Jack | |||
class JackNetMaster : public JackNetMasterInterface | |||
{ | |||
friend class JackNetMasterManager; | |||
private: | |||
private: | |||
static int SetProcess ( jack_nframes_t nframes, void* arg ); | |||
static int SetBufferSize (jack_nframes_t nframes, void* arg); | |||
@@ -90,7 +93,9 @@ namespace Jack | |||
class JackNetMasterManager | |||
{ | |||
friend class JackNetMaster; | |||
private: | |||
static int SetSyncCallback ( jack_transport_state_t state, jack_position_t* pos, void* arg ); | |||
static void* NetManagerThread ( void* arg ); | |||
@@ -111,7 +116,12 @@ namespace Jack | |||
void SetSlaveName ( session_params_t& params ); | |||
int SyncCallback ( jack_transport_state_t state, jack_position_t* pos ); | |||
int CountPhysicalInputs(); | |||
int CountPhysicalOutputs(); | |||
public: | |||
JackNetMasterManager ( jack_client_t* jack_client, const JSList* params); | |||
~JackNetMasterManager(); | |||
}; | |||
@@ -81,10 +81,10 @@ namespace Jack | |||
uint32_t fMtu; //connection mtu | |||
uint32_t fID; //slave's ID | |||
uint32_t fTransportSync; //is the transport synced ? | |||
uint32_t fSendAudioChannels; //number of master->slave channels | |||
uint32_t fReturnAudioChannels; //number of slave->master channels | |||
uint32_t fSendMidiChannels; //number of master->slave midi channels | |||
uint32_t fReturnMidiChannels; //number of slave->master midi channels | |||
int32_t fSendAudioChannels; //number of master->slave channels | |||
int32_t fReturnAudioChannels; //number of slave->master channels | |||
int32_t fSendMidiChannels; //number of master->slave midi channels | |||
int32_t fReturnMidiChannels; //number of slave->master midi channels | |||
uint32_t fSampleRate; //session sample rate | |||
uint32_t fPeriodSize; //period size | |||
uint32_t fFramesPerPacket; //complete frames per packet | |||
@@ -259,7 +259,7 @@ extern "C" | |||
i++; | |||
strcpy ( desc->params[i].name, "inchannels" ); | |||
desc->params[i].character = 'i'; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].type = JackDriverParamInt; | |||
desc->params[i].value.i = 0; | |||
strcpy ( desc->params[i].short_desc, | |||
"Number of capture channels (defaults to hardware max)" ); | |||
@@ -268,7 +268,7 @@ extern "C" | |||
i++; | |||
strcpy ( desc->params[i].name, "outchannels" ); | |||
desc->params[i].character = 'o'; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].type = JackDriverParamInt; | |||
desc->params[i].value.i = 0; | |||
strcpy ( desc->params[i].short_desc, | |||
"Number of playback channels (defaults to hardware max)" ); | |||
@@ -277,7 +277,7 @@ extern "C" | |||
i++; | |||
strcpy(desc->params[i].name, "quality"); | |||
desc->params[i].character = 'q'; | |||
desc->params[i].type = JackDriverParamInt; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.ui = 0; | |||
strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); | |||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||
@@ -285,7 +285,7 @@ extern "C" | |||
i++; | |||
strcpy(desc->params[i].name, "ring-buffer"); | |||
desc->params[i].character = 'g'; | |||
desc->params[i].type = JackDriverParamInt; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.ui = 32768; | |||
strcpy(desc->params[i].short_desc, "Fixed ringbuffer size"); | |||
strcpy(desc->params[i].long_desc, "Fixed ringbuffer size (if not set => automatic adaptative)"); | |||
@@ -845,7 +845,7 @@ SERVER_EXPORT const jack_driver_desc_t* driver_get_descriptor () | |||
i++; | |||
strcpy (params[i].name, "inchannels"); | |||
params[i].character = 'i'; | |||
params[i].type = JackDriverParamUInt; | |||
params[i].type = JackDriverParamInt; | |||
params[i].value.i = 0; | |||
strcpy (params[i].short_desc, | |||
"Number of capture channels (defaults to hardware max)"); | |||
@@ -854,7 +854,7 @@ SERVER_EXPORT const jack_driver_desc_t* driver_get_descriptor () | |||
i++; | |||
strcpy (params[i].name, "outchannels"); | |||
params[i].character = 'o'; | |||
params[i].type = JackDriverParamUInt; | |||
params[i].type = JackDriverParamInt; | |||
params[i].value.i = 0; | |||
strcpy (params[i].short_desc, | |||
"Number of playback channels (defaults to hardware max)"); | |||
@@ -872,7 +872,7 @@ SERVER_EXPORT const jack_driver_desc_t* driver_get_descriptor () | |||
strcpy (params[i].name, "input-latency"); | |||
params[i].character = 'I'; | |||
params[i].type = JackDriverParamUInt; | |||
params[i].value.i = 0; | |||
params[i].value.ui = 0; | |||
strcpy (params[i].short_desc, "Extra input latency (frames)"); | |||
strcpy (params[i].long_desc, params[i].short_desc); | |||
@@ -880,7 +880,7 @@ SERVER_EXPORT const jack_driver_desc_t* driver_get_descriptor () | |||
strcpy (params[i].name, "output-latency"); | |||
params[i].character = 'O'; | |||
params[i].type = JackDriverParamUInt; | |||
params[i].value.i = 0; | |||
params[i].value.ui = 0; | |||
strcpy (params[i].short_desc, "Extra output latency (frames)"); | |||
strcpy (params[i].long_desc, params[i].short_desc); | |||
@@ -1511,7 +1511,7 @@ extern "C" | |||
strcpy(desc->params[i].name, "channels"); | |||
desc->params[i].character = 'c'; | |||
desc->params[i].type = JackDriverParamInt; | |||
desc->params[i].value.ui = -1; | |||
desc->params[i].value.i = -1; | |||
strcpy(desc->params[i].short_desc, "Maximum number of channels"); | |||
strcpy(desc->params[i].long_desc, "Maximum number of channels. If -1, max possible number of channels will be used"); | |||
@@ -1519,7 +1519,7 @@ extern "C" | |||
strcpy(desc->params[i].name, "inchannels"); | |||
desc->params[i].character = 'i'; | |||
desc->params[i].type = JackDriverParamInt; | |||
desc->params[i].value.ui = -1; | |||
desc->params[i].value.i = -1; | |||
strcpy(desc->params[i].short_desc, "Maximum number of input channels"); | |||
strcpy(desc->params[i].long_desc, "Maximum number of input channels. If -1, max possible number of input channels will be used"); | |||
@@ -1527,7 +1527,7 @@ extern "C" | |||
strcpy(desc->params[i].name, "outchannels"); | |||
desc->params[i].character = 'o'; | |||
desc->params[i].type = JackDriverParamInt; | |||
desc->params[i].value.ui = -1; | |||
desc->params[i].value.i = -1; | |||
strcpy(desc->params[i].short_desc, "Maximum number of output channels"); | |||
strcpy(desc->params[i].long_desc, "Maximum number of output channels. If -1, max possible number of output channels will be used"); | |||
@@ -1844,7 +1844,7 @@ extern "C" | |||
strcpy(desc->params[i].name, "channels"); | |||
desc->params[i].character = 'c'; | |||
desc->params[i].type = JackDriverParamInt; | |||
desc->params[i].value.ui = -1; | |||
desc->params[i].value.i = -1; | |||
strcpy(desc->params[i].short_desc, "Maximum number of channels"); | |||
strcpy(desc->params[i].long_desc, "Maximum number of channels. If -1, max possible number of channels will be used"); | |||
@@ -1852,7 +1852,7 @@ extern "C" | |||
strcpy(desc->params[i].name, "inchannels"); | |||
desc->params[i].character = 'i'; | |||
desc->params[i].type = JackDriverParamInt; | |||
desc->params[i].value.ui = -1; | |||
desc->params[i].value.i = -1; | |||
strcpy(desc->params[i].short_desc, "Maximum number of input channels"); | |||
strcpy(desc->params[i].long_desc, "Maximum number of input channels. If -1, max possible number of input channels will be used"); | |||
@@ -1860,7 +1860,7 @@ extern "C" | |||
strcpy(desc->params[i].name, "outchannels"); | |||
desc->params[i].character = 'o'; | |||
desc->params[i].type = JackDriverParamInt; | |||
desc->params[i].value.ui = -1; | |||
desc->params[i].value.i = -1; | |||
strcpy(desc->params[i].short_desc, "Maximum number of output channels"); | |||
strcpy(desc->params[i].long_desc, "Maximum number of output channels. If -1, max possible number of output channels will be used"); | |||
@@ -1921,7 +1921,7 @@ extern "C" | |||
strcpy(desc->params[i].name, "input-latency"); | |||
desc->params[i].character = 'I'; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.i = 0; | |||
desc->params[i].value.ui = 0; | |||
strcpy(desc->params[i].short_desc, "Extra input latency (frames)"); | |||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||
@@ -1929,7 +1929,7 @@ extern "C" | |||
strcpy(desc->params[i].name, "output-latency"); | |||
desc->params[i].character = 'O'; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.i = 0; | |||
desc->params[i].value.ui = 0; | |||
strcpy(desc->params[i].short_desc, "Extra output latency (frames)"); | |||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||
@@ -1953,7 +1953,7 @@ extern "C" | |||
strcpy(desc->params[i].name, "async-latency"); | |||
desc->params[i].character = 'L'; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.i = 100; | |||
desc->params[i].value.ui = 100; | |||
strcpy(desc->params[i].short_desc, "Extra output latency in asynchronous mode (percent)"); | |||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||
@@ -1961,7 +1961,7 @@ extern "C" | |||
strcpy(desc->params[i].name, "grain"); | |||
desc->params[i].character = 'G'; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.i = 100; | |||
desc->params[i].value.ui = 100; | |||
strcpy(desc->params[i].short_desc, "Computation grain in RT thread (percent)"); | |||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||
@@ -911,7 +911,7 @@ SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor() | |||
strcpy(desc->params[i].name, "input-latency"); | |||
desc->params[i].character = 'I'; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.i = 0; | |||
desc->params[i].value.ui = 0; | |||
strcpy(desc->params[i].short_desc, "Extra input latency"); | |||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||
@@ -919,7 +919,7 @@ SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor() | |||
strcpy(desc->params[i].name, "output-latency"); | |||
desc->params[i].character = 'O'; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.i = 0; | |||
desc->params[i].value.ui = 0; | |||
strcpy(desc->params[i].short_desc, "Extra output latency"); | |||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||
@@ -836,7 +836,7 @@ SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor() | |||
strcpy(desc->params[i].name, "input-latency"); | |||
desc->params[i].character = 'I'; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.i = 0; | |||
desc->params[i].value.ui = 0; | |||
strcpy(desc->params[i].short_desc, "Extra input latency"); | |||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||
@@ -844,7 +844,7 @@ SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor() | |||
strcpy(desc->params[i].name, "output-latency"); | |||
desc->params[i].character = 'O'; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.i = 0; | |||
desc->params[i].value.ui = 0; | |||
strcpy(desc->params[i].short_desc, "Extra output latency"); | |||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||
@@ -253,7 +253,7 @@ extern "C" | |||
i = 0; | |||
strcpy(desc->params[i].name, "channels"); | |||
desc->params[i].character = 'c'; | |||
desc->params[i].type = JackDriverParamInt; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.ui = 0; | |||
strcpy(desc->params[i].short_desc, "Maximum number of channels"); | |||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||
@@ -261,7 +261,7 @@ extern "C" | |||
i++; | |||
strcpy(desc->params[i].name, "inchannels"); | |||
desc->params[i].character = 'i'; | |||
desc->params[i].type = JackDriverParamInt; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.ui = 0; | |||
strcpy(desc->params[i].short_desc, "Maximum number of input channels"); | |||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||
@@ -269,7 +269,7 @@ extern "C" | |||
i++; | |||
strcpy(desc->params[i].name, "outchannels"); | |||
desc->params[i].character = 'o'; | |||
desc->params[i].type = JackDriverParamInt; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.ui = 0; | |||
strcpy(desc->params[i].short_desc, "Maximum number of output channels"); | |||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||
@@ -334,7 +334,7 @@ extern "C" | |||
strcpy(desc->params[i].name, "input-latency"); | |||
desc->params[i].character = 'I'; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.i = 0; | |||
desc->params[i].value.ui = 0; | |||
strcpy(desc->params[i].short_desc, "Extra input latency"); | |||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||
@@ -342,7 +342,7 @@ extern "C" | |||
strcpy(desc->params[i].name, "output-latency"); | |||
desc->params[i].character = 'O'; | |||
desc->params[i].type = JackDriverParamUInt; | |||
desc->params[i].value.i = 0; | |||
desc->params[i].value.ui = 0; | |||
strcpy(desc->params[i].short_desc, "Extra output latency"); | |||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||