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