750 lines · 19.4 KB · C++
RawDownload
//-----------------------------------------------------------------------------// Entaro ChucK Developer!// This is a Chugin boilerplate, generated by chuginate!//----------------------------------------------------------------------------- // this should align with the correct versions of these ChucK files#include "chuck_dl.h"#include "chuck_def.h"#include "ladspa.h"//#include "utils.h" // general includes#include <math.h>//#include <stdio.h>//#include <limits.h>//#include <dlfcn.h>//#include <assert.h>//#include <cstring>//#include <string>  #define DEFAULT_BUFSIZE 1 #define DEBUG // declaration of chugin constructorCK_DLL_CTOR(ladspa_ctor);// declaration of chugin desctructorCK_DLL_DTOR(ladspa_dtor); CK_DLL_MFUN(ladspa_load);CK_DLL_MFUN(ladspa_list);CK_DLL_MFUN(ladspa_info);CK_DLL_MFUN(ladspa_label);CK_DLL_MFUN(ladspa_set);CK_DLL_MFUN(ladspa_get);CK_DLL_MFUN(ladspa_verbose); // for Chugins extending UGen, this is mono synthesis function for 1 sampleCK_DLL_TICKF(ladspa_tick); // this is a special offset reserved for Chugin internal datat_CKINT ladspa_data_offset = 0; // class definition for internal Chugin data// (note: this isn't strictly necessary, but serves as example// of one recommended approach)class Ladspa{public:  // create port type to differentiate control ports  enum port_t { INPUT, OUTPUT };    // control data is written into an array of ControlData structs  struct ControlData  {	unsigned short ladspaIndex;	LADSPA_Data value;	port_t porttype;  };   // constructor  Ladspa( t_CKFLOAT fs) :    pluginLoaded(false),    pluginActivated(false),    verbose(true),    srate(fs),    bufsize(DEFAULT_BUFSIZE)  {  }   // destructor  ~Ladspa()  {    if (pluginActivated) psDescriptor->cleanup(pPlugin);    if (pluginLoaded)      {	dlclose(pvPluginHandle);	if (verbose) printf("LADSPA: closed plugin\n");      }	for (int i=0; i<inports; i++)	  delete inbuf[i];	for (int i=0; i<outports; i++)	  delete outbuf[i];	delete [] inbuf;	delete [] outbuf;	delete [] kbuf;  }    // for Chugins extending UGen  void tick( SAMPLE *in, SAMPLE *out, int nframes )  {	if (pluginActivated)	  {		for (int i=0; i<inports; i++) inbuf[i][0] = (LADSPA_Data)in[i%2];		psDescriptor->run(pPlugin, bufsize);		for (int i=0; i<2; i++) out[i%2] = (SAMPLE)outbuf[i%outports][0];	  }	else	  {		out[0] = in[0];		out[1] = in[1];	  }  }   float set( float val, int param)  {#ifdef DEBUG    printf ("DEBUG: method 'set' : param number %d, value %f\n",param, val);#endif	if (pluginActivated)	  {		if (param < kports)		  if (kbuf[param].porttype != INPUT)			{			  printf ( "LADSPA error: selected param is output only.\n");			  return 0;			}		  else			{			  if (verbose) printf ("LADSPA: setting parameter \"%s\" to %g\n",								   psDescriptor->PortNames[kbuf[param].ladspaIndex], val);			  kbuf[param].value = (LADSPA_Data)val;			  psDescriptor->run(pPlugin, 0);			}		else		  if (kports>1)			printf ("LADSPA error: param must be between 0 and %d.\n", kports-1);		  else			printf ("LADSPA error: param must be 0.\n");	  }	return val;  }    float get (int param)  {	if (pluginActivated)	  {		if (param < kports)		  return kbuf[param].value;		if (kports>0)		  printf ("LADSPA error: param must be between 0 and %d.\n", kports-1);		else		  printf ("LADSPA error: param must be 0.\n");	  }	return 0;  }   int LADSPAverbose (int val)  {#ifdef DEBUG    printf ("DEBUG: method 'verbose' : value %d\n", val);#endif	if (val) verbose = true;	else verbose = false;	return val;  }    int LadspaActivate ( const char * pcPluginLabel )  {	assert(pcPluginLabel != NULL);	if (pluginLoaded)	  {#ifdef DEBUG	    printf("DEBUG: method 'LadspaActivate' received string \"%s\"\n", pcPluginLabel);#endif	    if (pluginActivated)	      {		psDescriptor->cleanup(pPlugin);		if (verbose) printf("LADSPA: deactivating current plugin...\n");		pluginActivated = false;	      }	    for (int i=0;; i++)		  {			psDescriptor = pfDescriptorFunction(i);			if (psDescriptor == NULL)			  {				printf("LADSPA error: unable to find label \"%s\" in plugin.\n", pcPluginLabel);				return 0;			  }			if (strcmp(psDescriptor->Label, pcPluginLabel) == 0)			  {				if (verbose) printf("LADSPA: activating plugin \"%s\"\n", pcPluginLabel);				pPlugin = psDescriptor->instantiate(psDescriptor, srate);				connectPorts();				pluginActivated = true;				return 1;			  }		  }	  }	else	  printf ("LADSPA error: no plugin loaded yet!\n");	return 0;  }   int LADSPA_load ( const char *  pcPluginFilename )  {#ifdef DEBUG	    printf("DEBUG: method 'LADSPA_load' received string \"%s\"\n", pcPluginFilename);#endif    if (pluginActivated)	  {		psDescriptor->cleanup(pPlugin);		if (verbose) printf("LADSPA: deactivating current plugin...\n");	  }    if (pluginLoaded)	  {		dlclose(pvPluginHandle);		if (verbose) printf("LADSPA: unloading current plugin...\n");	  }	pluginActivated = false;	pluginLoaded = false;	assert(pcPluginFilename != NULL);#ifdef DEBUG	printf("DEBUG: received string \"%s\"\n", pcPluginFilename);#endif    if (verbose) printf("LADSPA: loading plugin %s\n", pcPluginFilename);    pvPluginHandle = dlopen(pcPluginFilename, RTLD_NOW);    dlerror();        pfDescriptorFunction = (LADSPA_Descriptor_Function)dlsym(pvPluginHandle, "ladspa_descriptor");    if (!pfDescriptorFunction)      {		const char * pcError = dlerror();		if (pcError) 		  printf("LADSPA error: unable to find ladspa_descriptor() function in plugin file "				 "\"%s\"\n"				 "Are you sure this is a LADSPA plugin file?\n", 				 pcPluginFilename);		return 0;      }	pluginLoaded = true;	return 1;  }   // TODO: error checking    int LADSPA_list ()  {#ifdef DEBUG    printf("DEBUG: method 'Ladspa_list'\n");#endif    if (!pluginLoaded)      {	printf ("LADSPA error: no plugin loaded yet\n");	return 0;      }    printf ("Plugins available under this LADSPA file:\n");    for (int i = 0;; i++)      {	const LADSPA_Descriptor * testDescriptor = pfDescriptorFunction(i);	if (!testDescriptor)	  break;	putchar('\n');	printf("Plugin Label: \"%s\"\n", testDescriptor->Label);	printf("Plugin Name: \"%s\"\n", testDescriptor->Name);      }    printf("--------------------------------------------------\n");    return 1;  } int LADSPA_info ()  {#ifdef DEBUG	    printf("DEBUG: method 'Ladspa_info'\n");#endif	if (pluginActivated)	  {		bool bFound;		int knum;		unsigned long lIndex;		LADSPA_PortRangeHintDescriptor iHintDescriptor;		LADSPA_Data fBound;		printf("--------------------------------------------------\n");			printf(			   "Plugin \"%s\" has the following control inputs:\n",			   psDescriptor->Name);				knum = 0;		bFound = false;		for (lIndex = 0; lIndex < psDescriptor->PortCount; lIndex++)		  {			if (LADSPA_IS_PORT_CONTROL(psDescriptor->PortDescriptors[lIndex]))			  {				if (LADSPA_IS_PORT_INPUT(psDescriptor->PortDescriptors[lIndex]))				  {					printf("\tControl %d: %s", knum++, psDescriptor->PortNames[lIndex]);					bFound = true;					iHintDescriptor = psDescriptor->PortRangeHints[lIndex].HintDescriptor;					if (LADSPA_IS_HINT_BOUNDED_BELOW(iHintDescriptor)						|| LADSPA_IS_HINT_BOUNDED_ABOVE(iHintDescriptor))					  {						printf( " (");						if (LADSPA_IS_HINT_BOUNDED_BELOW(iHintDescriptor))						  {							fBound = psDescriptor->PortRangeHints[lIndex].LowerBound;							if (LADSPA_IS_HINT_SAMPLE_RATE(iHintDescriptor))							  {								if (fBound == 0) printf( "0");								else printf( "%g * sample rate", fBound);							  }							else printf( "%g", fBound);						  }						else						  printf( "...");						printf( " to ");						if (LADSPA_IS_HINT_BOUNDED_ABOVE(iHintDescriptor))						  {							fBound = psDescriptor->PortRangeHints[lIndex].UpperBound;							if (LADSPA_IS_HINT_SAMPLE_RATE(iHintDescriptor))							  {								if (fBound == 0)								  printf( "0");								else								  printf( "%g * sample rate", fBound);							  }							else							  printf( "%g", fBound);						  }						else						  printf( "...");						printf( "), default: %g\n", get_default(lIndex));					  }					else printf("\n");				  }				else				  {					printf("\tOutput %d: %s\n",knum++, psDescriptor->PortNames[lIndex]);					bFound = true;				  }			  }		  }				if (!bFound)		  printf( "\tnone\n");		printf("--------------------------------------------------\n");	  }	else	  if (!pluginLoaded)		printf ("LADSPA error: no plugin loaded yet!\n");	  else		printf ("LADSPA error: plugin not yet activated\n");	return 0;  } private:    void connectPorts()  {	//const LADSPA_Descriptor * thisDescriptor = psDescriptor;    //printf("Connecting LADSPA audio ports...\n\n");     // Count ports    inports = 0; // audio in    outports = 0; // audio out    kports = 0; // control data (in and out)     for (int i=0; i<psDescriptor->PortCount; i++)      {	iPortDescriptor = psDescriptor->PortDescriptors[i];	if (LADSPA_IS_PORT_AUDIO(iPortDescriptor))	  {	    if (LADSPA_IS_PORT_INPUT(iPortDescriptor)) inports++;	    else if (LADSPA_IS_PORT_OUTPUT(iPortDescriptor)) outports++;	  }	else if (LADSPA_IS_PORT_CONTROL(iPortDescriptor))	  {	    kports++;	  }      }        inbuf = new LADSPA_Data*[inports];    outbuf = new LADSPA_Data*[outports];	kbuf = new ControlData[kports];    for (int i=0; i<inports; i++)      {		inbuf[i] = new LADSPA_Data[bufsize];      }    for (int i=0; i<outports; i++)      {		outbuf[i] = new LADSPA_Data[bufsize];      }    for (int i=0; i<kports; i++)      {	kbuf[i].value = 0.0;	kbuf[i].ladspaIndex = 0;	kbuf[i].porttype = INPUT;      }	    //printf("Audio inports: %d, outports: %d, Control ports: %d\n",inports, outports, kports);        int inbufIndex = 0;    int outbufIndex = 0;    int kbufIndex = 0;     // connect ports    for (int i=0; i<psDescriptor->PortCount; i++)      {	iPortDescriptor = psDescriptor->PortDescriptors[i];	if (LADSPA_IS_PORT_AUDIO(iPortDescriptor))	  {	    if (LADSPA_IS_PORT_INPUT(iPortDescriptor))	      psDescriptor->connect_port(pPlugin, i, inbuf[inbufIndex++]);	    else if (LADSPA_IS_PORT_OUTPUT(iPortDescriptor))	      psDescriptor->connect_port(pPlugin, i, outbuf[outbufIndex++]);	  }	else if (LADSPA_IS_PORT_CONTROL(iPortDescriptor))	  {	    psDescriptor->connect_port(pPlugin, i, &kbuf[kbufIndex].value);	    kbuf[kbufIndex].ladspaIndex = i;	    if (LADSPA_IS_PORT_INPUT (iPortDescriptor))	      {		kbuf[kbufIndex].porttype = INPUT;		LADSPA_Data portDefault = get_default(i);		kbuf[kbufIndex].value = portDefault;	      }	    else kbuf[kbufIndex].porttype = OUTPUT;	    kbufIndex++;	  }      }		if (psDescriptor->activate != NULL)	  {		psDescriptor->activate(pPlugin);		pluginActivated = true;	  }  }   LADSPA_Data get_default ( int index )  {	iHintDescriptor = psDescriptor->PortRangeHints[index].HintDescriptor;	switch (iHintDescriptor & LADSPA_HINT_DEFAULT_MASK) {	case LADSPA_HINT_DEFAULT_NONE:	  break;	case LADSPA_HINT_DEFAULT_MINIMUM:	  fDefault = psDescriptor->PortRangeHints[index].LowerBound;	  break;	case LADSPA_HINT_DEFAULT_LOW:	  if (LADSPA_IS_HINT_LOGARITHMIC(iHintDescriptor)) {		fDefault 		  = exp(log(psDescriptor->PortRangeHints[index].LowerBound) 				* 0.75				+ log(psDescriptor->PortRangeHints[index].UpperBound) 				* 0.25);	  }	  else {		fDefault 		  = (psDescriptor->PortRangeHints[index].LowerBound			 * 0.75			 + psDescriptor->PortRangeHints[index].UpperBound			 * 0.25);	  }	  break;	case LADSPA_HINT_DEFAULT_MIDDLE:	  if (LADSPA_IS_HINT_LOGARITHMIC(iHintDescriptor)) {		fDefault 		  = sqrt(psDescriptor->PortRangeHints[index].LowerBound				 * psDescriptor->PortRangeHints[index].UpperBound);	  }	  else {		fDefault 		  = 0.5 * (psDescriptor->PortRangeHints[index].LowerBound				   + psDescriptor->PortRangeHints[index].UpperBound);	  }	  break;	case LADSPA_HINT_DEFAULT_HIGH:	  if (LADSPA_IS_HINT_LOGARITHMIC(iHintDescriptor)) {		fDefault 		  = exp(log(psDescriptor->PortRangeHints[index].LowerBound) 				* 0.25				+ log(psDescriptor->PortRangeHints[index].UpperBound) 				* 0.75);	  }	  else {		fDefault 		  = (psDescriptor->PortRangeHints[index].LowerBound			 * 0.25			 + psDescriptor->PortRangeHints[index].UpperBound			 * 0.75);	  }	  break;	case LADSPA_HINT_DEFAULT_MAXIMUM:	  fDefault = psDescriptor->PortRangeHints[index].UpperBound;	  break;	case LADSPA_HINT_DEFAULT_0:	  fDefault = 0;	  break;	case LADSPA_HINT_DEFAULT_1:	  fDefault = 1;	  break;	case LADSPA_HINT_DEFAULT_100:	  fDefault = 100;	  break;	case LADSPA_HINT_DEFAULT_440:	  fDefault = 440;	  break;	default:	  printf("LADSPA warning: UNKNOWN DEFAULT CODE\n");	  // (Not necessarily an error - may be a newer version.)	  break;	}

Lines 1–500 of 750.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t