Netdriver can now ask for in/out values from the master (in progress).

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4253 0c269be4-1314-0410-8aa9-9f06e86f4224
This commit is contained in:
sletz 2011-04-02 10:21:31 +00:00
parent 4789c74f37
commit 3ea1d70b0c
12 changed files with 105 additions and 50 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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