[PD-cvs] externals/postlude/dssi/src dssi~.c, 1.8, 1.9 dssi~.h, 1.5, 1.6 jsearch.c, 1.1, 1.2

Jamie Bullock postlude at users.sourceforge.net
Fri Mar 17 18:08:51 CET 2006


Update of /cvsroot/pure-data/externals/postlude/dssi/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8805/src

Modified Files:
	dssi~.c dssi~.h jsearch.c 
Log Message:
Restructed loader/free.Added plug facility, which currently doesn't work with DSP on.


Index: jsearch.c
===================================================================
RCS file: /cvsroot/pure-data/externals/postlude/dssi/src/jsearch.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** jsearch.c	11 Mar 2006 20:32:51 -0000	1.1
--- jsearch.c	17 Mar 2006 17:08:49 -0000	1.2
***************
*** 38,42 ****
    struct dirent * psDirectoryEntry;
    void * pvPluginHandle;
!   int is_DSSI;
  
    lDirLength = strlen(pcDirectory);
--- 38,42 ----
    struct dirent * psDirectoryEntry;
    void * pvPluginHandle;
!   int is_DSSI = 0;
  
    lDirLength = strlen(pcDirectory);

Index: dssi~.c
===================================================================
RCS file: /cvsroot/pure-data/externals/postlude/dssi/src/dssi~.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** dssi~.c	15 Mar 2006 17:29:14 -0000	1.8
--- dssi~.c	17 Mar 2006 17:08:49 -0000	1.9
***************
*** 112,116 ****
      return (DSSI_Descriptor *)dssiDesc;
  }
! 
  static void dssi_tilde_load_plugin(const char *dll_path, void **dll_handle){
  
--- 112,116 ----
      return (DSSI_Descriptor *)dssiDesc;
  }
! /*
  static void dssi_tilde_load_plugin(const char *dll_path, void **dll_handle){
  
***************
*** 123,127 ****
  
  }
! 
  static void dssi_tilde_port_info(t_dssi_tilde *x){
      t_int i;
--- 123,127 ----
  
  }
! */
  static void dssi_tilde_port_info(t_dssi_tilde *x){
      t_int i;
***************
*** 253,257 ****
  }
  
! static void dssi_tilde_initialize(t_dssi_tilde *x, t_int instance){
  
      x->instances[instance].pluginPrograms = NULL;
--- 253,257 ----
  }
  
! static void dssi_tilde_init_instance(t_dssi_tilde *x, t_int instance){
  
      x->instances[instance].pluginPrograms = NULL;
***************
*** 272,275 ****
--- 272,276 ----
      x->instances[instance].ui_hidden = 1;
      x->instances[instance].ui_show = 0;
+     x->instances[instance].gui_pid = 0;
  #if DEBUG		
      post("Instance %d initialized!", instance);
***************
*** 531,536 ****
      x->plugin_ControlDataInput[portno] = value;
  
!     lo_send(x->instances[instance].uiTarget, 
! 	    x->instances[instance].ui_osc_control_path, "if", port, value);
  }
  
--- 532,538 ----
      x->plugin_ControlDataInput[portno] = value;
  
!     if(x->is_DSSI)
! 	lo_send(x->instances[instance].uiTarget, 
! 		x->instances[instance].ui_osc_control_path, "if", port, value);
  }
  
***************
*** 738,741 ****
--- 740,758 ----
  }
  
+ static void dssi_tilde_get_current_program(t_dssi_tilde *x, int instance){
+     int i;
+     t_atom argv[2];
+     
+     argv[0].a_type = A_FLOAT;
+     argv[1].a_type = A_SYMBOL;
+     i = x->instances[instance].currentProgram;
+     
+     argv[0].a_w.w_float = x->instances[instance].pluginPrograms[i].Program;
+     argv[1].a_w.w_symbol = 
+ 	gensym ((char*)x->instances[instance].pluginPrograms[i].Name); 
+     outlet_anything (x->control_outlet, gensym ("program"), 2, argv);
+ 
+ }
+ 
  static void dssi_tilde_program_change(t_dssi_tilde *x, int instance){
      /* jack-dssi-host queues program changes by using  pending program change variables. In the audio callback, if a program change is received via MIDI it over writes the pending value (if any) set by the GUI. If unset, or processed the value will default back to -1. The following call to select_program is then made. I don't think it eventually needs to be done this way - i.e. do we need 'pending'? */ 
***************
*** 777,780 ****
--- 794,798 ----
  	x->instances[instance].pendingBankLSB = -1;
      }
+     dssi_tilde_get_current_program(x, instance);
  }
  
***************
*** 1270,1274 ****
  	    x->instanceHandles[instance], 
  	    key, value);
!     if(x->instances[instance].uiTarget != NULL)
  	lo_send(x->instances[instance].uiTarget, 
  		x->instances[instance].ui_osc_configure_path,
--- 1288,1292 ----
  	    x->instanceHandles[instance], 
  	    key, value);
!     if(x->instances[instance].uiTarget != NULL && x->is_DSSI)
  	lo_send(x->instances[instance].uiTarget, 
  		x->instances[instance].ui_osc_configure_path,
***************
*** 1467,1470 ****
--- 1485,1489 ----
  
  static t_int dssi_tilde_dssi_methods(t_dssi_tilde *x, t_symbol *s, int argc, t_atom *argv) {
+     if(x->is_DSSI){
      char *msg_type, *debug, *filename, *key, *value;
      msg_type = (char *)malloc(TYPE_STRING_SIZE);
***************
*** 1705,1708 ****
--- 1724,1730 ----
      free(msg_type);
      free(patchbuf);
+     }
+     else
+ 	post("dssi~: plugin is not a DSSI plugin, operation not supported");
      return 0;
  
***************
*** 1720,1808 ****
      int i, n, timediff, framediff, instance = 0; 
  
!     for(i = 0; i < x->plugin_ins; i++)
! 	memcpy(x->plugin_InputBuffers[i], x->inlets[i], N * 
! 		sizeof(LADSPA_Data));
  
!     for (i = 0; i < x->n_instances; i++)
! 	x->instanceEventCounts[i] = 0;
  
!     for (;x->bufReadIndex != x->bufWriteIndex; x->bufReadIndex = 
! 	    (x->bufReadIndex + 1) % EVENT_BUFSIZE) {
  
! 	instance = x->midiEventBuf[x->bufReadIndex].data.note.channel;
! 	/*This should never happen, but check anyway*/
! 	if(instance > x->n_instances || instance < 0){
! 	    post(
! 		    "%s: discarding spurious MIDI data, for instance %d", 
! 		    x->descriptor->LADSPA_Plugin->Label, 
! 		    instance);
  #if DEBUG
! 	    post("n_instances = %d", x->n_instances);
  #endif
! 	    continue;
! 	}
  
! 	if (x->instanceEventCounts[instance] == EVENT_BUFSIZE){
! 	    post("MIDI overflow on channel %d", instance);
! 	    continue;
! 	}
  
! 	timediff = (t_int)(clock_gettimesince(x->time_ref) * 1000) - 
! 	    x->midiEventBuf[x->bufReadIndex].time.time.tv_nsec;
! 	framediff = (t_int)((t_float)timediff * .000001 / x->sr_inv); 
  
! 	if (framediff >= N || framediff < 0) 
! 	    x->midiEventBuf[x->bufReadIndex].time.tick = 0;
! 	else
! 	    x->midiEventBuf[x->bufReadIndex].time.tick = 
! 		N - framediff - 1;
  
! 	x->instanceEventBuffers[instance]
! 	    [x->instanceEventCounts[instance]] = 
! 	    x->midiEventBuf[x->bufReadIndex];
  #if DEBUG
! 	post("%s, note received on channel %d", 
! 		x->descriptor->LADSPA_Plugin->Label, 
! 		x->instanceEventBuffers[instance]
! 		[x->instanceEventCounts[instance]].data.note.channel);
  #endif
! 	x->instanceEventCounts[instance]++; 
  
  #if DEBUG
! 	post("Instance event count for instance %d of %d: %d\n",
! 		instance + 1, x->n_instances, x->instanceEventCounts[instance]);
  #endif
  
-     }
- 
-     i = 0;
-     while(i < x->n_instances){
- 	if(x->instanceHandles[i] && 
- 		x->descriptor->run_multiple_synths){
- 	    x->descriptor->run_multiple_synths
- 		(x->n_instances, x->instanceHandles, 
- 		 (unsigned long)N, x->instanceEventBuffers,
- 		 &x->instanceEventCounts[0]);
- 	    break; 
  	}
- 	else if (x->instanceHandles[i] && 
- 		x->descriptor->run_synth){
- 	    x->descriptor->run_synth(x->instanceHandles[i], 
- 		    (unsigned long)N, x->instanceEventBuffers[i],
- 		    x->instanceEventCounts[i]); 
- 	    i++;
- 	}
- 	else if (x->instanceHandles[i] && 
- 		x->descriptor->LADSPA_Plugin->run){
- 	    x->descriptor->LADSPA_Plugin->run
- 		(x->instanceHandles[i], N);
- 	    i++;
- 	}
-     }
  
!     for(i = 0; i < x->plugin_outs; i++)
! 	memcpy(x->outlets[i], x->plugin_OutputBuffers[i], N * 
! 		sizeof(LADSPA_Data));
  
      return (w+3);
  }
--- 1742,1832 ----
      int i, n, timediff, framediff, instance = 0; 
  
!     if(x->dsp){
  
! 	for(i = 0; i < x->plugin_ins; i++)
! 	    memcpy(x->plugin_InputBuffers[i], x->inlets[i], N * 
! 		    sizeof(LADSPA_Data));
  
! 	for (i = 0; i < x->n_instances; i++)
! 	    x->instanceEventCounts[i] = 0;
  
! 	for (;x->bufReadIndex != x->bufWriteIndex; x->bufReadIndex = 
! 		(x->bufReadIndex + 1) % EVENT_BUFSIZE) {
! 
! 	    instance = x->midiEventBuf[x->bufReadIndex].data.note.channel;
! 	    /*This should never happen, but check anyway*/
! 	    if(instance > x->n_instances || instance < 0){
! 		post(
! 			"%s: discarding spurious MIDI data, for instance %d", 
! 			x->descriptor->LADSPA_Plugin->Label, 
! 			instance);
  #if DEBUG
! 		post("n_instances = %d", x->n_instances);
  #endif
! 		continue;
! 	    }
  
! 	    if (x->instanceEventCounts[instance] == EVENT_BUFSIZE){
! 		post("MIDI overflow on channel %d", instance);
! 		continue;
! 	    }
  
! 	    timediff = (t_int)(clock_gettimesince(x->time_ref) * 1000) - 
! 		x->midiEventBuf[x->bufReadIndex].time.time.tv_nsec;
! 	    framediff = (t_int)((t_float)timediff * .000001 / x->sr_inv); 
  
! 	    if (framediff >= N || framediff < 0) 
! 		x->midiEventBuf[x->bufReadIndex].time.tick = 0;
! 	    else
! 		x->midiEventBuf[x->bufReadIndex].time.tick = 
! 		    N - framediff - 1;
  
! 	    x->instanceEventBuffers[instance]
! 		[x->instanceEventCounts[instance]] = 
! 		x->midiEventBuf[x->bufReadIndex];
  #if DEBUG
! 	    post("%s, note received on channel %d", 
! 		    x->descriptor->LADSPA_Plugin->Label, 
! 		    x->instanceEventBuffers[instance]
! 		    [x->instanceEventCounts[instance]].data.note.channel);
  #endif
! 	    x->instanceEventCounts[instance]++; 
  
  #if DEBUG
! 	    post("Instance event count for instance %d of %d: %d\n",
! 		    instance + 1, x->n_instances, x->instanceEventCounts[instance]);
  #endif
  
  	}
  
! 	i = 0;
! 	while(i < x->n_instances){
! 	    if(x->instanceHandles[i] && 
! 		    x->descriptor->run_multiple_synths){
! 		x->descriptor->run_multiple_synths
! 		    (x->n_instances, x->instanceHandles, 
! 		     (unsigned long)N, x->instanceEventBuffers,
! 		     &x->instanceEventCounts[0]);
! 		break; 
! 	    }
! 	    else if (x->instanceHandles[i] && 
! 		    x->descriptor->run_synth){
! 		x->descriptor->run_synth(x->instanceHandles[i], 
! 			(unsigned long)N, x->instanceEventBuffers[i],
! 			x->instanceEventCounts[i]); 
! 		i++;
! 	    }
! 	    else if (x->instanceHandles[i] && 
! 		    x->descriptor->LADSPA_Plugin->run){
! 		x->descriptor->LADSPA_Plugin->run
! 		    (x->instanceHandles[i], N);
! 		i++;
! 	    }
! 	}
  
+ 	for(i = 0; i < x->plugin_outs; i++)
+ 	    memcpy(x->outlets[i], x->plugin_OutputBuffers[i], N * 
+ 		    sizeof(LADSPA_Data));
+     }
      return (w+3);
  }
***************
*** 1812,1817 ****
      if(x->n_instances){
  	int n, m;
! 	t_float **outlets = x->outlets;
! 	t_float **inlets = x->inlets;
  
  	m = 1;	
--- 1836,1841 ----
      if(x->n_instances){
  	int n, m;
! 	t_float **outlets = (t_float **)x->outlets;
! 	t_float **inlets = (t_float **)x->inlets;
  
  	m = 1;	
***************
*** 1826,1845 ****
  }
  
! static void *dssi_tilde_new(t_symbol *s, t_int argc, t_atom *argv){
  
!     int i,
! 	stop;
!     char *tmpstr,
! 	 *argstr,
! 	 *dll_arg,
! 	 *dll_name,
! 	 *plugin_label;
!     
!     stop = 0;
!     tmpstr = argstr = dll_name = dll_arg = NULL;
!     
!     t_dssi_tilde *x = (t_dssi_tilde *)pd_new(dssi_tilde_class);
!     post("==============================\ndssi~ %.2f\n a DSSI/LADSPA host for Pure Data\n==============================", VERSION);
!     
      x->project_dir = NULL;
      x->configure_buffer_head = NULL;
--- 1850,1949 ----
  }
  
! static void dssi_tilde_quit_plugin(t_dssi_tilde *x){
  
!     t_int i, instance;
!     for(instance = 0; instance < x->n_instances; instance++) {
! 	if(x->instances[instance].uiTarget && x->is_DSSI){
! 	    lo_send(x->instances[instance].uiTarget, 
! 		    x->instances[instance].ui_osc_quit_path, "");
! 	    lo_address_free(x->instances[instance].uiTarget);
! 	    x->instances[instance].uiTarget = NULL;
! 	}
! 	/* no -- see comment in osc_exiting_handler */
! 	/* if (!instances[i].inactive) { */
! 	if (x->descriptor->LADSPA_Plugin->deactivate) {
! 	    x->descriptor->LADSPA_Plugin->deactivate
! 		(x->instanceHandles[instance]);
! 	}
! 	/* } */
! 	if (x->descriptor->LADSPA_Plugin &&
! 		x->descriptor->LADSPA_Plugin->cleanup) {
! 	    x->descriptor->LADSPA_Plugin->cleanup
! 		(x->instanceHandles[instance]);
! 	}
!     }
! }
! 
! static void dssi_tilde_free_plugin(t_dssi_tilde *x){
! 
!     t_int i, instance;
!     if(x->dll_arg != NULL)
! 	free((char *)x->dll_arg);
!     if(x->plugin_label != NULL)
! 	free((char *)x->plugin_label);
!     if(x->dll_handle != NULL){
! 	instance = x->n_instances;
! 	free((LADSPA_Handle)x->instanceHandles);
! 	free(x->plugin_ControlInPortNumbers); 
! 	free((t_float *)x->plugin_InputBuffers);
! 	free(x->instanceEventCounts);
! 	free(x->plugin_ControlDataInput);
! 	free(x->plugin_ControlDataOutput);
! 
! 	while(instance--){
! 
! 	    if(x->instances[instance].gui_pid){
! #if DEBUG
! 		post("Killing GUI process PID = %d", x->instances[instance].gui_pid);
! #endif
! 		kill(x->instances[instance].gui_pid, SIGKILL);
! 	    } 
! 	    if (x->instances[instance].pluginPrograms) {
! 		for (i = 0; i < 
! 			x->instances[instance].plugin_ProgramCount; i++)
! 		    free((void *)
! 			    x->instances[instance].pluginPrograms[i].Name);
! 		free((char *)x->instances[instance].pluginPrograms);
! 		x->instances[instance].pluginPrograms = NULL;
! 		x->instances[instance].plugin_ProgramCount = 0;
! 	    }
! 	    free(x->instanceEventBuffers[instance]);
! 	    if(x->is_DSSI){
! 		free(x->instances[instance].ui_osc_control_path);
! 		free(x->instances[instance].ui_osc_configure_path);
! 		free(x->instances[instance].ui_osc_program_path);
! 		free(x->instances[instance].ui_osc_show_path);
! 		free(x->instances[instance].ui_osc_hide_path);
! 		free(x->instances[instance].ui_osc_quit_path);
! 		free(x->instances[instance].osc_url_path);
! 	    }
! 	    free(x->instances[instance].plugin_PortControlInNumbers);
! 	    if(x->plugin_outs)
! 		free(x->plugin_OutputBuffers[instance]);
! 	}
! 	if(x->is_DSSI){	
! 	    if(x->project_dir != NULL)
! 		free(x->project_dir);
! 	    free(x->osc_url_base);
! 	    dssi_tilde_configure_buffer_free(x);
! 	}
! 	free((snd_seq_event_t *)x->instanceEventBuffers);
! 	free(x->instances);
! 	free((t_float *)x->plugin_OutputBuffers);
! 
! 	/* Have a little nap so PD can catch up */
! 	/*sleep(1);*/
! 	for(i = 0; i < x->plugin_outs; i++)
! 	    outlet_free(x->outlets[i]);
! 	for(i = 0; i < x->plugin_ins; i++)
! 	    inlet_free(x->inlets[i]);
! 	outlet_free(x->control_outlet);
! 	free(x->dll_name);
! 	free(x->port_info);
!     }
! }
! 
! static void dssi_tilde_init_plugin(t_dssi_tilde *x){
!  
      x->project_dir = NULL;
      x->configure_buffer_head = NULL;
***************
*** 1851,1865 ****
      x->dll_arg = NULL;
      x->plugin_label = NULL;
!     x->sr = (t_int)sys_getsr();
!     x->sr_inv = 1 / (t_float)x->sr;
!     x->time_ref = (t_int)clock_getlogicaltime;
!     x->blksize = sys_getblksize();
      x->ports_in = x->ports_out = x->ports_controlIn = x->ports_controlOut = 0;
      x->bufWriteIndex = x->bufReadIndex = 0;
-     x->n_instances = 0; 
  
!     
!     
      if (argc){
  	argstr = (char *)malloc((strlen(argv[0].a_w.w_symbol->s_name) + 1) * 
  		sizeof(char));
--- 1955,1994 ----
      x->dll_arg = NULL;
      x->plugin_label = NULL;
!     x->dll_name = NULL;
!     x->osc_url_base = NULL;
!     x->plugin_ControlDataInput = x->plugin_ControlDataOutput = NULL;
!     x->plugin_InputBuffers = x->plugin_OutputBuffers = NULL;
!     x->plugin_ControlInPortNumbers = NULL;
!     x->port_info = NULL;
!     x->descriptor = NULL;
!     x->instanceEventCounts = NULL;
!     x->instances = NULL;
!     x->instanceHandles = NULL;
!     x->is_DSSI = 0;
!     x->n_instances = 0;
!     x->dsp = 0;
!     x->plugin_ins = x->plugin_outs = 
! 	x->plugin_controlIns = x->plugin_controlOuts = 0;
      x->ports_in = x->ports_out = x->ports_controlIn = x->ports_controlOut = 0;
      x->bufWriteIndex = x->bufReadIndex = 0;
  
! }
! 
! static void *dssi_tilde_load_plugin(t_dssi_tilde *x, t_int argc, t_atom *argv){
!     char *tmpstr,
! 	 *argstr,
! 	 *dll_arg,
! 	 *dll_name,
! 	 *plugin_label;
! #if DEBUG
!     post("argc = %d", argc);
! #endif
!     int i,
! 	stop;
! 
!     stop = 0;
! 
      if (argc){
+ 	tmpstr = argstr = dll_name = dll_arg = NULL;
  	argstr = (char *)malloc((strlen(argv[0].a_w.w_symbol->s_name) + 1) * 
  		sizeof(char));
***************
*** 1885,1894 ****
  	    }
  	}
- 
  #if DEBUG
  	post("plugin library = %s", x->dll_arg);
  	post("plugin name = %s", x->plugin_label);
  #endif
! 	
  	if(x->dll_arg != NULL){
  	    x->dll_handle = loadLADSPAPluginLibrary(x->dll_arg);
--- 2014,2022 ----
  	    }
  	}
  #if DEBUG
  	post("plugin library = %s", x->dll_arg);
  	post("plugin name = %s", x->plugin_label);
  #endif
! 
  	if(x->dll_arg != NULL){
  	    x->dll_handle = loadLADSPAPluginLibrary(x->dll_arg);
***************
*** 1896,1900 ****
  	}
  
- 
  	if (x->dll_handle != NULL){
  	    tmpstr = (char *)malloc((strlen(x->dll_arg) + 1) * sizeof(char));
--- 2024,2027 ----
***************
*** 1934,1937 ****
--- 2061,2068 ----
  		x->n_instances = 1;
  
+ 
+ #if DEBUG
+ 	    post("n_instances = %d", x->n_instances);
+ #endif
  	    x->instances = (t_dssi_instance *)malloc(sizeof(t_dssi_instance) * 
  		    x->n_instances);
***************
*** 1952,1956 ****
  		dssi_tilde_assign_ports(x);
  		for(i = 0; i < x->n_instances; i++){
! 		    x->instanceHandles[i] = x->descriptor->LADSPA_Plugin->instantiate(x->descriptor->LADSPA_Plugin, x->sr);
  		    if (!x->instanceHandles[i]){
  			post("instantiation of instance %d failed", i);
--- 2083,2089 ----
  		dssi_tilde_assign_ports(x);
  		for(i = 0; i < x->n_instances; i++){
! 		    x->instanceHandles[i] = 
! 			x->descriptor->LADSPA_Plugin->
! 			instantiate(x->descriptor->LADSPA_Plugin, x->sr);
  		    if (!x->instanceHandles[i]){
  			post("instantiation of instance %d failed", i);
***************
*** 1959,1978 ****
  		    }
  		}
- 		pthread_mutex_init(&x->midiEventBufferMutex, NULL);
  		if(!stop){
  		    for(i = 0;i < x->n_instances; i++)
! 			dssi_tilde_initialize(x, i);
  		    for(i = 0;i < x->n_instances; i++)
  			dssi_tilde_connect_ports(x, i); 
  		    for(i = 0;i < x->n_instances; i++)
- 			dssi_tilde_osc_setup(x, i);
- 		    for(i = 0;i < x->n_instances; i++)
  			dssi_tilde_activate(x, i);
! 		    for(i = 0;i < x->n_instances; i++)
! 			dssi_tilde_init_programs(x, i);
  #if LOADGUI
! 		    for(i = 0;i < x->n_instances; i++)
! 			dssi_tilde_load_gui(x, i);
  #endif
  		}
  	    }
--- 2092,2111 ----
  		    }
  		}
  		if(!stop){
  		    for(i = 0;i < x->n_instances; i++)
! 			dssi_tilde_init_instance(x, i);
  		    for(i = 0;i < x->n_instances; i++)
  			dssi_tilde_connect_ports(x, i); 
  		    for(i = 0;i < x->n_instances; i++)
  			dssi_tilde_activate(x, i);
! 		    if(x->is_DSSI)
! 			for(i = 0;i < x->n_instances; i++)
! 			    dssi_tilde_osc_setup(x, i);
  #if LOADGUI
! 			for(i = 0;i < x->n_instances; i++)
! 			    dssi_tilde_load_gui(x, i);
  #endif
+ 			for(i = 0;i < x->n_instances; i++)
+ 			    dssi_tilde_init_programs(x, i);
  		}
  	    }
***************
*** 1987,2095 ****
  	outlet_new (&x->x_obj, gensym("control"));
  
!     if(x->plugin_outs){
! 	for(i = 0;i < x->plugin_outs; i++)
! 	    outlet_new(&x->x_obj, &s_signal);
! 	x->outlets = 
! 	    (t_float **)calloc(x->plugin_outs, 
! 			       sizeof(t_float *));
!     }
!     if(x->plugin_ins){
! 	for(i = 0;i < x->plugin_ins; i++)
! 	    inlet_new(&x->x_obj, &x->x_obj.ob_pd,						&s_signal, &s_signal);
! 	x->inlets = 
! 	    (t_float **)calloc(x->plugin_ins, 
! 			       sizeof(t_float *));
      }
!     
!     return (void *)x;
  }
  
! static void dssi_tilde_free(t_dssi_tilde *x){
! 
!     t_int i;
! 
! #if DEBUG
!     post("Calling dssi_tilde_free");
! #endif
! 
!     t_int instance;
!     for(instance = 0; instance < x->n_instances; instance++) {
! 	if(x->instances[instance].uiTarget && x->is_DSSI){
! 	    lo_send(x->instances[instance].uiTarget, 
! 		    x->instances[instance].ui_osc_quit_path, "");
! 	    lo_address_free(x->instances[instance].uiTarget);
! 	    x->instances[instance].uiTarget = NULL;
! 	}
! 	/* no -- see comment in osc_exiting_handler */
! 	/* if (!instances[i].inactive) { */
! 	if (x->descriptor->LADSPA_Plugin->deactivate) {
! 	    x->descriptor->LADSPA_Plugin->deactivate
! 		(x->instanceHandles[instance]);
! 	}
! 	/* } */
! 	if (x->descriptor->LADSPA_Plugin &&
! 		x->descriptor->LADSPA_Plugin->cleanup) {
! 	    x->descriptor->LADSPA_Plugin->cleanup
! 		(x->instanceHandles[instance]);
! 	}
!     }
  
!     if(x->dll_arg != NULL)
! 	free((char *)x->dll_arg);
      
!     if(x->plugin_label != NULL)
! 	free((char *)x->plugin_label);
      
!     if(x->dll_handle){ 
! 	instance = x->n_instances;
! 	free((LADSPA_Handle)x->instanceHandles);
! 	free(x->plugin_ControlInPortNumbers); 
! 	free((t_float *)x->plugin_InputBuffers);
! 	free(x->instanceEventCounts);
! 	free(x->plugin_ControlDataInput);
! 	free(x->plugin_ControlDataOutput);
  
! 	while(instance--){
  
- 	    if(x->instances[instance].gui_pid){
  #if DEBUG
! 		post("Freeing GUI process PID = %d", x->instances[instance].gui_pid);
  #endif
- 		kill(x->instances[instance].gui_pid, SIGKILL);
- 	    } 
- 	    if (x->instances[instance].pluginPrograms) {
- 		for (i = 0; i < 
- 			x->instances[instance].plugin_ProgramCount; i++)
- 		    free((void *)
- 			    x->instances[instance].pluginPrograms[i].Name);
- 		free((char *)x->instances[instance].pluginPrograms);
- 		x->instances[instance].pluginPrograms = NULL;
- 		x->instances[instance].plugin_ProgramCount = 0;
- 	    }
- 	    if(x->plugin_outs)
- 		free(x->plugin_OutputBuffers[instance]);
- 	    free(x->instanceEventBuffers[instance]);
- 	    free(x->instances[instance].ui_osc_control_path);
- 	    free(x->instances[instance].ui_osc_configure_path);
- 	    free(x->instances[instance].ui_osc_program_path);
- 	    free(x->instances[instance].ui_osc_show_path);
- 	    free(x->instances[instance].ui_osc_hide_path);
- 	    free(x->instances[instance].ui_osc_quit_path);
- 	    free(x->instances[instance].osc_url_path);
- 	    free(x->instances[instance].plugin_PortControlInNumbers);
- 	}
- 	free((t_float *)x->plugin_OutputBuffers);
- 	free((snd_seq_event_t *)x->instanceEventBuffers);
- 	free(x->instances);
- 	free(x->project_dir);
- 	free((t_float *)x->outlets);
- 	free(x->osc_url_base);
- 	free(x->dll_name);
- 	free(x->port_info);
- 	dssi_tilde_configure_buffer_free(x);
- 	/*	  free(x->configure_buffer_head);*/
- 	/*	  free(x->dll_path);*/
-     }
  
  }
  
--- 2120,2183 ----
  	outlet_new (&x->x_obj, gensym("control"));
  
!     if (x->dll_handle != NULL){
! 	if(x->plugin_outs){
! 	    x->outlets = (t_outlet **)getbytes(x->plugin_outs * sizeof(t_outlet *)); 
! 	    for(i = 0;i < x->plugin_outs; i++)
! 		x->outlets[i] = outlet_new(&x->x_obj, &s_signal);
! 	    /*	x->outlets = 
! 		(t_float **)calloc(x->plugin_outs, 
! 		sizeof(t_float *));
! 		*/}
! 	    if(x->plugin_ins){
! 		x->inlets = (t_inlet **)getbytes(x->plugin_ins * sizeof(t_inlet *)); 
! 		for(i = 0;i < x->plugin_ins; i++)
! 		    x->inlets[i] = inlet_new(&x->x_obj, &x->x_obj.ob_pd,						&s_signal, &s_signal);
! 		/*	x->inlets = 
! 			(t_float **)calloc(x->plugin_ins, 
! 			sizeof(t_float *));
! 			*/}
! 
! 		post("dssi~: ready for input");
! 		x->dsp = 1;
      }
!     return (void *)x;    
  }
  
! static void dssi_tilde_plug_plugin(t_dssi_tilde *x, t_symbol *s, int argc, t_atom *argv){
!     
!     x->dsp = 0;
!     dssi_tilde_quit_plugin(x);
!     dssi_tilde_free_plugin(x);
!     dssi_tilde_init_plugin(x);
!     dssi_tilde_load_plugin(x, argc, argv);
!     
! }
  
! static void *dssi_tilde_new(t_symbol *s, t_int argc, t_atom *argv){
      
!     t_dssi_tilde *x = (t_dssi_tilde *)pd_new(dssi_tilde_class);
!     post("==============================\ndssi~ %.2f\n a DSSI/LADSPA host for Pure Data\n==============================", VERSION);
!       
!     dssi_tilde_init_plugin(x);
      
!     x->sr = (t_int)sys_getsr();
!     x->sr_inv = 1 / (t_float)x->sr;
!     x->time_ref = (t_int)clock_getlogicaltime;
!     x->blksize = sys_getblksize();
!  
!     pthread_mutex_init(&x->midiEventBufferMutex, NULL);
!     return dssi_tilde_load_plugin(x, argc, argv);
!     
! }
  
! static void dssi_tilde_free(t_dssi_tilde *x){
  
  #if DEBUG
!     post("Calling dssi_tilde_free");
  #endif
  
+     dssi_tilde_quit_plugin(x);
+     dssi_tilde_free_plugin(x);
+     
  }
  
***************
*** 2112,2117 ****
      class_addmethod (dssi_tilde_class,(t_method)dssi_tilde_reset,
  	    gensym ("reset"), A_DEFFLOAT, 0);
! /*    class_addmethod (dssi_tilde_class,(t_method)dssi_tilde_plug,
! 	    gensym ("plug"),A_DEFSYM,0);
      class_addmethod (dssi_tilde_class,(t_method)dssi_tilde_active,
  	    gensym ("active"),A_DEFFLOAT,0);*/
--- 2200,2205 ----
      class_addmethod (dssi_tilde_class,(t_method)dssi_tilde_reset,
  	    gensym ("reset"), A_DEFFLOAT, 0);
!     class_addmethod (dssi_tilde_class,(t_method)dssi_tilde_plug_plugin,
! 	    gensym ("plug"),A_GIMME,0);/*
      class_addmethod (dssi_tilde_class,(t_method)dssi_tilde_active,
  	    gensym ("active"),A_DEFFLOAT,0);*/

Index: dssi~.h
===================================================================
RCS file: /cvsroot/pure-data/externals/postlude/dssi/src/dssi~.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** dssi~.h	11 Mar 2006 20:32:51 -0000	1.5
--- dssi~.h	17 Mar 2006 17:08:49 -0000	1.6
***************
*** 53,57 ****
  
  #define LOADGUI 1 /* FIX: depracate this */
! #define DEBUG 1
  #ifdef DEBUG
  	#define CHECKSUM_PATCH_FILES_ON_LOAD 1
--- 53,57 ----
  
  #define LOADGUI 1 /* FIX: depracate this */
! #define DEBUG 0
  #ifdef DEBUG
  	#define CHECKSUM_PATCH_FILES_ON_LOAD 1
***************
*** 119,127 ****
    t_object  x_obj;
    t_int is_DSSI;
!   const char *dll_arg,  /*arg given by user - either path or dll name*/
!        	     *plugin_label;
    char	     *dll_path; /*absolute path to plugin */
    void *dll_handle;
!   char *dir; /* project dircetory */
    LADSPA_Handle *instanceHandles; /*was handle*/
    t_dssi_instance *instances; 
--- 119,127 ----
    t_object  x_obj;
    t_int is_DSSI;
!   char *dll_arg,  /*arg given by user - either path or dll name*/
!        	*plugin_label;
    char	     *dll_path; /*absolute path to plugin */
    void *dll_handle;
!   char *project_dir; /* project dircetory */
    LADSPA_Handle *instanceHandles; /*was handle*/
    t_dssi_instance *instances; 
***************
*** 161,168 ****
    t_float f;
    
!   t_float **outlets, **inlets;
    t_outlet *control_outlet;
  
    t_dssi_configure_pair *configure_buffer_head;
    
  } t_dssi_tilde;
--- 161,171 ----
    t_float f;
    
!   t_outlet **outlets; 
!   t_inlet **inlets;
    t_outlet *control_outlet;
  
    t_dssi_configure_pair *configure_buffer_head;
+ 
+   t_int dsp; /* boolean dsp setting */
    
  } t_dssi_tilde;





More information about the Pd-cvs mailing list