diff --git a/ChangeLog b/ChangeLog index ba91b540..6f0ffb6e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -34,6 +34,11 @@ Valerio Pilo Jackdmp changes log --------------------------- +2011-04-02 Stephane Letz + + * Netdriver can now ask for in/out values from the master (in progress). + * Correct drivers parameter settings. + 2011-04-01 Stephane Letz * Merge newer-midi branch (Devin Anderson redesign of the MIDI drivers: alsarawmidi, ffado, coremidi and winmme). diff --git a/common/JackNetDriver.cpp b/common/JackNetDriver.cpp index b52a8a07..9a1a8f0a 100644 --- a/common/JackNetDriver.cpp +++ b/common/JackNetDriver.cpp @@ -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 ); diff --git a/common/JackNetManager.cpp b/common/JackNetManager.cpp index ab97637b..7fa2456a 100644 --- a/common/JackNetManager.cpp +++ b/common/JackNetManager.cpp @@ -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 ( 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; diff --git a/common/JackNetManager.h b/common/JackNetManager.h index cbeaee9e..09fd640f 100644 --- a/common/JackNetManager.h +++ b/common/JackNetManager.h @@ -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(); }; diff --git a/common/JackNetTool.h b/common/JackNetTool.h index cb6f494f..725d100c 100644 --- a/common/JackNetTool.h +++ b/common/JackNetTool.h @@ -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 diff --git a/linux/alsa/JackAlsaAdapter.cpp b/linux/alsa/JackAlsaAdapter.cpp index ba847851..070dacd4 100644 --- a/linux/alsa/JackAlsaAdapter.cpp +++ b/linux/alsa/JackAlsaAdapter.cpp @@ -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)"); diff --git a/linux/alsa/JackAlsaDriver.cpp b/linux/alsa/JackAlsaDriver.cpp index fb816453..f0da6578 100644 --- a/linux/alsa/JackAlsaDriver.cpp +++ b/linux/alsa/JackAlsaDriver.cpp @@ -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); diff --git a/macosx/coreaudio/JackCoreAudioAdapter.cpp b/macosx/coreaudio/JackCoreAudioAdapter.cpp index d086a877..f77a5e3a 100644 --- a/macosx/coreaudio/JackCoreAudioAdapter.cpp +++ b/macosx/coreaudio/JackCoreAudioAdapter.cpp @@ -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"); diff --git a/macosx/coreaudio/JackCoreAudioDriver.cpp b/macosx/coreaudio/JackCoreAudioDriver.cpp index 97352bca..adbb5805 100644 --- a/macosx/coreaudio/JackCoreAudioDriver.cpp +++ b/macosx/coreaudio/JackCoreAudioDriver.cpp @@ -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); diff --git a/solaris/oss/JackBoomerDriver.cpp b/solaris/oss/JackBoomerDriver.cpp index bbf1c67c..63446f14 100644 --- a/solaris/oss/JackBoomerDriver.cpp +++ b/solaris/oss/JackBoomerDriver.cpp @@ -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); diff --git a/solaris/oss/JackOSSDriver.cpp b/solaris/oss/JackOSSDriver.cpp index be62f37d..444fce44 100644 --- a/solaris/oss/JackOSSDriver.cpp +++ b/solaris/oss/JackOSSDriver.cpp @@ -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); diff --git a/windows/portaudio/JackPortAudioDriver.cpp b/windows/portaudio/JackPortAudioDriver.cpp index c0dadbc6..aff1dbdb 100644 --- a/windows/portaudio/JackPortAudioDriver.cpp +++ b/windows/portaudio/JackPortAudioDriver.cpp @@ -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);