Browse Source

Getting there - GUI now shows name, maker and port info. Can't set Min/Max yet, though... On way :)

master
waxfrenzy 22 years ago
parent
commit
e1abb7fbc0
4 changed files with 305 additions and 165 deletions
  1. +134
    -61
      SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.C
  2. +32
    -30
      SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.h
  3. +106
    -54
      SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.C
  4. +33
    -20
      SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.h

+ 134
- 61
SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.C View File

@@ -17,7 +17,9 @@
*/ */
#include "LADSPAPlugin.h" #include "LADSPAPlugin.h"
#include "LADSPAPluginGUI.h" #include "LADSPAPluginGUI.h"
#include <stdio.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include "SpiralIcon.xpm" #include "SpiralIcon.xpm"
#include "utils.h" #include "utils.h"
#include <algorithm> #include <algorithm>
@@ -63,7 +65,9 @@ void describePluginLibrary(const char * pcFullFilename, void * pvPluginHandle,
pi.Filename = pcFullFilename; pi.Filename = pcFullFilename;
pi.Label = psDescriptor->Label; pi.Label = psDescriptor->Label;
pi.Name = psDescriptor->Name; pi.Name = psDescriptor->Name;
/* ARGH! I really can't stand this ugly hack */
pi.InputPortCount = getPortCountByType(psDescriptor, LADSPA_PORT_INPUT);
// ARGH! I really can't stand this ugly hack
lg->m_LADSPAList.push_back(pi); lg->m_LADSPAList.push_back(pi);
} else { } else {
cerr << "Plugin ignored...\n\n"; cerr << "Plugin ignored...\n\n";
@@ -76,6 +80,7 @@ void describePluginLibrary(const char * pcFullFilename, void * pvPluginHandle,
void LADSPAPlugin::LoadPluginList(void) void LADSPAPlugin::LoadPluginList(void)
{ {
m_LADSPAList.clear(); m_LADSPAList.clear();

m_CurrentPlugin.Name = ""; m_CurrentPlugin.Name = "";
m_CurrentPlugin.Filename = ""; m_CurrentPlugin.Filename = "";
m_CurrentPlugin.Label = ""; m_CurrentPlugin.Label = "";
@@ -85,7 +90,7 @@ void LADSPAPlugin::LoadPluginList(void)
lg = NULL; lg = NULL;


sort(m_LADSPAList.begin(), m_LADSPAList.end(), LPluginInfoSortAsc()); sort(m_LADSPAList.begin(), m_LADSPAList.end(), LPluginInfoSortAsc());
}
}


//////////////////////////////////////////////////// ////////////////////////////////////////////////////


@@ -108,35 +113,74 @@ int GetID()


/////////////////////////////////////////////////////// ///////////////////////////////////////////////////////


LADSPAPlugin::LADSPAPlugin() :
PlugHandle(0),
LADSPAPlugin::LADSPAPlugin() :
PlugHandle(0),
PlugDesc(NULL), PlugDesc(NULL),
m_Gain(1.0f), m_Gain(1.0f),
m_Amped(false) m_Amped(false)
{ {
m_Version=3; m_Version=3;
m_PluginInfo.Name="LADSPA"; m_PluginInfo.Name="LADSPA";
m_PluginInfo.Width=600; m_PluginInfo.Width=600;
m_PluginInfo.Height=300; m_PluginInfo.Height=300;
m_PluginInfo.NumInputs=0; m_PluginInfo.NumInputs=0;
m_PluginInfo.NumOutputs=1; m_PluginInfo.NumOutputs=1;
m_PluginInfo.PortTips.push_back("Nuffink yet");
m_PluginInfo.PortTips.push_back("Nuffink yet");

m_InputPortCountMax = 0;
m_InputPortCount = 0;

// For receiving from GUI
m_AudioCH->Register("Gain",&m_Gain); m_AudioCH->Register("Gain",&m_Gain);
m_AudioCH->Register("Amped",&m_Amped); m_AudioCH->Register("Amped",&m_Amped);
m_AudioCH->RegisterData("Desc",ChannelHandler::OUTPUT,&PlugDesc,sizeof(PlugDesc));
m_AudioCH->Register("Num",&m_GUIArgs.Num);
m_AudioCH->Register("Value",&m_GUIArgs.Value);
m_AudioCH->Register("Clamp",&m_GUIArgs.Clamp);
m_AudioCH->RegisterData("Filename",ChannelHandler::INPUT,&m_GUIArgs.Filename,sizeof(m_GUIArgs.Filename));
m_AudioCH->RegisterData("Label",ChannelHandler::INPUT,&m_GUIArgs.Label,sizeof(m_GUIArgs.Label));
m_AudioCH->RegisterData("PluginIndex", ChannelHandler::INPUT,&m_PluginIndex,sizeof(m_PluginIndex));

LoadPluginList(); LoadPluginList();

// Examine plugin list and find highest input port count
for (vector<LPluginInfo>::iterator i = m_LADSPAList.begin();
i != m_LADSPAList.end(); i++) {
if ((*i).InputPortCount > m_InputPortCountMax)
m_InputPortCountMax = (*i).InputPortCount;
}

// Now we have a maximum input port count, so we can allocate and register our
// port info arrays
m_AudioCH->RegisterData("InputPortCountMax",ChannelHandler::OUTPUT,&m_InputPortCountMax,sizeof(m_InputPortCountMax));
m_AudioCH->RegisterData("InputPortCount",ChannelHandler::OUTPUT,&m_InputPortCount,sizeof(m_InputPortCount));

m_InputPortMin = (float *)malloc(sizeof(float) * m_InputPortCountMax);
m_InputPortMax = (float *)malloc(sizeof(float) * m_InputPortCountMax);
m_InputPortClamp = (bool *)malloc(sizeof(bool) * m_InputPortCountMax);
m_InputPortNames = (char *)malloc(256 * m_InputPortCountMax);

m_Name = (char *)malloc(256);
m_Maker = (char *)malloc(256);

if (m_InputPortMin && m_InputPortMax && m_InputPortClamp && m_InputPortNames &&
m_Name && m_Maker) {
m_AudioCH->RegisterData("InputPortMin", ChannelHandler::OUTPUT, m_InputPortMin, sizeof(float) * m_InputPortCountMax);
m_AudioCH->RegisterData("InputPortMax", ChannelHandler::OUTPUT, m_InputPortMax, sizeof(float) * m_InputPortCountMax);
m_AudioCH->RegisterData("InputPortClamp", ChannelHandler::OUTPUT, m_InputPortClamp, sizeof(bool) * m_InputPortCountMax);
m_AudioCH->RegisterData("InputPortNames", ChannelHandler::OUTPUT, m_InputPortNames, 256 * m_InputPortCountMax);

m_AudioCH->RegisterData("Name",ChannelHandler::OUTPUT,m_Name,256);
m_AudioCH->RegisterData("Maker",ChannelHandler::OUTPUT,m_Maker,256);
} else {
cerr<<"Memory allocation error\n"<<endl;
}
} }


LADSPAPlugin::~LADSPAPlugin() LADSPAPlugin::~LADSPAPlugin()
{ {
// Free allocated buffers
if (m_InputPortMin) free(m_InputPortMin);
if (m_InputPortMax) free(m_InputPortMax);
if (m_InputPortClamp) free(m_InputPortClamp);
if (m_InputPortNames) free(m_InputPortNames);
if (m_Name) free(m_Name);
if (m_Maker) free(m_Maker);
} }


PluginInfo &LADSPAPlugin::Initialise(const HostInfo *Host) PluginInfo &LADSPAPlugin::Initialise(const HostInfo *Host)
@@ -144,12 +188,13 @@ PluginInfo &LADSPAPlugin::Initialise(const HostInfo *Host)
PluginInfo& Info = SpiralPlugin::Initialise(Host); PluginInfo& Info = SpiralPlugin::Initialise(Host);
LADSPA_Data *NewPort = new LADSPA_Data[m_HostInfo->BUFSIZE]; LADSPA_Data *NewPort = new LADSPA_Data[m_HostInfo->BUFSIZE];
m_LADSPABufVec.push_back(NewPort); m_LADSPABufVec.push_back(NewPort);
return Info;
return Info;
} }


SpiralGUIType *LADSPAPlugin::CreateGUI() SpiralGUIType *LADSPAPlugin::CreateGUI()
{ {
return new LADSPAPluginGUI(m_PluginInfo.Width,m_PluginInfo.Height,this,m_AudioCH,m_HostInfo,m_LADSPAList);
return new LADSPAPluginGUI(m_PluginInfo.Width, m_PluginInfo.Height,
this, m_AudioCH, m_HostInfo, m_LADSPAList);
} }


void LADSPAPlugin::Execute() void LADSPAPlugin::Execute()
@@ -188,10 +233,10 @@ void LADSPAPlugin::Execute()
for (int i=0; i<m_HostInfo->BUFSIZE; i++) m_LADSPABufVec[n][i]=0; for (int i=0; i<m_HostInfo->BUFSIZE; i++) m_LADSPABufVec[n][i]=0;
} }
} }
// run plugin // run plugin
PlugDesc->run(PlugInstHandle,m_HostInfo->BUFSIZE);
PlugDesc->run(PlugInstHandle,m_HostInfo->BUFSIZE);
// convert outputs // convert outputs
for (int n=0; n<m_PluginInfo.NumOutputs; n++) for (int n=0; n<m_PluginInfo.NumOutputs; n++)
{ {
@@ -219,10 +264,8 @@ void LADSPAPlugin::ExecuteCommands()
{ {
switch(m_AudioCH->GetCommand()) switch(m_AudioCH->GetCommand())
{ {
case (SETMIN) : SetMin(m_GUIArgs.Num,m_GUIArgs.Value); break;
case (SETMAX) : SetMax(m_GUIArgs.Num,m_GUIArgs.Value); break;
case (SETCLAMP) : SetPortClamp(m_GUIArgs.Num,m_GUIArgs.Clamp); break;
case (UPDATEPLUGIN) : UpdatePlugin(m_GUIArgs.Num); break;
case (UPDATERANGES) : break;
case (UPDATEPLUGIN) : UpdatePlugin(m_PluginIndex); break;
}; };
} }
} }
@@ -230,7 +273,7 @@ void LADSPAPlugin::ExecuteCommands()
void LADSPAPlugin::StreamOut(ostream &s) void LADSPAPlugin::StreamOut(ostream &s)
{ {
s<<m_Version<<" "; s<<m_Version<<" ";
switch (m_Version) switch (m_Version)
{ {
case 3: case 3:
@@ -329,7 +372,7 @@ void LADSPAPlugin::StreamIn(istream &s)
{ {
UpdatePlugin(Filename.c_str(), Label.c_str(), false); UpdatePlugin(Filename.c_str(), Label.c_str(), false);
} }
m_CurrentPlugin.Ports.reserve(PortCount); m_CurrentPlugin.Ports.reserve(PortCount);
for (int n=0; n<PortCount; n++) for (int n=0; n<PortCount; n++)
@@ -390,7 +433,7 @@ void LADSPAPlugin::StreamIn(istream &s)
string Filename,Label; string Filename,Label;
s>>Filename>>Label; s>>Filename>>Label;
if (Filename!="None") if (Filename!="None")
{ {
UpdatePlugin(Filename.c_str(), Label.c_str()); UpdatePlugin(Filename.c_str(), Label.c_str());
@@ -430,10 +473,10 @@ bool LADSPAPlugin::UpdatePlugin(const char * filename, const char * label, bool
PlugHandle = 0; PlugHandle = 0;
return 0; return 0;
} }
m_PluginInfo.NumInputs=getPortCountByType(PlugDesc, LADSPA_PORT_INPUT); m_PluginInfo.NumInputs=getPortCountByType(PlugDesc, LADSPA_PORT_INPUT);
m_PluginInfo.NumOutputs=getPortCountByType(PlugDesc, LADSPA_PORT_OUTPUT); m_PluginInfo.NumOutputs=getPortCountByType(PlugDesc, LADSPA_PORT_OUTPUT);
///////////////////////////////// /////////////////////////////////
// LADSPA Buffers // LADSPA Buffers


@@ -442,9 +485,9 @@ bool LADSPAPlugin::UpdatePlugin(const char * filename, const char * label, bool
{ {
if (*i) delete[] (*i); if (*i) delete[] (*i);
} }
m_LADSPABufVec.clear();
unsigned long c=0;
m_LADSPABufVec.clear();
unsigned long c=0;
for (unsigned int n=0; n<PlugDesc->PortCount; n++) for (unsigned int n=0; n<PlugDesc->PortCount; n++)
{ {
if (LADSPA_IS_PORT_INPUT(PlugDesc->PortDescriptors[n])) if (LADSPA_IS_PORT_INPUT(PlugDesc->PortDescriptors[n]))
@@ -452,11 +495,11 @@ bool LADSPAPlugin::UpdatePlugin(const char * filename, const char * label, bool
LADSPA_Data *NewPort = new LADSPA_Data[m_HostInfo->BUFSIZE]; LADSPA_Data *NewPort = new LADSPA_Data[m_HostInfo->BUFSIZE];
m_LADSPABufVec.push_back(NewPort); m_LADSPABufVec.push_back(NewPort);
PlugDesc->connect_port(PlugInstHandle, n, m_LADSPABufVec[c]); PlugDesc->connect_port(PlugInstHandle, n, m_LADSPABufVec[c]);
m_PortID.push_back(n);
m_PortID.push_back(n);
c++; c++;
}
}
}
}
for (unsigned int n=0; n<PlugDesc->PortCount; n++) for (unsigned int n=0; n<PlugDesc->PortCount; n++)
{ {
if (LADSPA_IS_PORT_OUTPUT(PlugDesc->PortDescriptors[n])) if (LADSPA_IS_PORT_OUTPUT(PlugDesc->PortDescriptors[n]))
@@ -466,9 +509,9 @@ bool LADSPAPlugin::UpdatePlugin(const char * filename, const char * label, bool
PlugDesc->connect_port(PlugInstHandle, n, m_LADSPABufVec[c]); PlugDesc->connect_port(PlugInstHandle, n, m_LADSPABufVec[c]);
m_PortID.push_back(n); m_PortID.push_back(n);
c++; c++;
}
}
}
}
// activate the plugin now // activate the plugin now
if (PlugDesc->activate) if (PlugDesc->activate)
PlugDesc->activate(PlugInstHandle); PlugDesc->activate(PlugInstHandle);
@@ -481,9 +524,9 @@ bool LADSPAPlugin::UpdatePlugin(const char * filename, const char * label, bool
RemoveAllOutputs(); RemoveAllOutputs();


// Reallocate the i/o buffers required // Reallocate the i/o buffers required
for (int n=0; n<m_PluginInfo.NumInputs; n++) AddInput();
for (int n=0; n<m_PluginInfo.NumInputs; n++) AddInput();
for (int n=0; n<m_PluginInfo.NumOutputs; n++) AddOutput(); for (int n=0; n<m_PluginInfo.NumOutputs; n++) AddOutput();
////////////////////////////// //////////////////////////////
// Update the GUI stuff // Update the GUI stuff


@@ -491,55 +534,55 @@ bool LADSPAPlugin::UpdatePlugin(const char * filename, const char * label, bool
m_CurrentPlugin.Maker=PlugDesc->Maker; m_CurrentPlugin.Maker=PlugDesc->Maker;
m_CurrentPlugin.Filename=filename; m_CurrentPlugin.Filename=filename;
m_CurrentPlugin.Label=label; m_CurrentPlugin.Label=label;
m_CurrentPlugin.Ports.clear(); m_CurrentPlugin.Ports.clear();
m_PluginInfo.PortTips.clear(); m_PluginInfo.PortTips.clear();
string desc; string desc;
c=0; c=0;
for (unsigned int i = 0; i < PlugDesc->PortCount; i++)
for (unsigned int i = 0; i < PlugDesc->PortCount; i++)
{ {
if (LADSPA_IS_PORT_INPUT(PlugDesc->PortDescriptors[i]))
if (LADSPA_IS_PORT_INPUT(PlugDesc->PortDescriptors[i]))
{ {
desc = string(PlugDesc->PortNames[i]) + desc = string(PlugDesc->PortNames[i]) +
(LADSPA_IS_PORT_CONTROL(PlugDesc->PortDescriptors[i]) ? " (CV)" : " (AU)"); (LADSPA_IS_PORT_CONTROL(PlugDesc->PortDescriptors[i]) ? " (CV)" : " (AU)");
m_PluginInfo.PortTips.push_back(desc.c_str()); m_PluginInfo.PortTips.push_back(desc.c_str());
LPluginInfo::LPortDetails PortDetails; LPluginInfo::LPortDetails PortDetails;
PortDetails.Name=m_PluginInfo.PortTips[c].c_str(); PortDetails.Name=m_PluginInfo.PortTips[c].c_str();
m_CurrentPlugin.Ports.push_back(PortDetails); m_CurrentPlugin.Ports.push_back(PortDetails);
c++; c++;
} }
} }
for (unsigned int i = 0; i < PlugDesc->PortCount; i++)
{
for (unsigned int i = 0; i < PlugDesc->PortCount; i++)
{
if (LADSPA_IS_PORT_OUTPUT(PlugDesc->PortDescriptors[i])) { if (LADSPA_IS_PORT_OUTPUT(PlugDesc->PortDescriptors[i])) {


desc = string(PlugDesc->PortNames[i]) + desc = string(PlugDesc->PortNames[i]) +
(LADSPA_IS_PORT_CONTROL(PlugDesc->PortDescriptors[i]) ? " (CV)" : " (AU)"); (LADSPA_IS_PORT_CONTROL(PlugDesc->PortDescriptors[i]) ? " (CV)" : " (AU)");
m_PluginInfo.PortTips.push_back(desc.c_str()); m_PluginInfo.PortTips.push_back(desc.c_str());
} }
} }
UpdatePluginInfoWithHost(); UpdatePluginInfoWithHost();


if (PortClampReset) if (PortClampReset)
{ {
m_PortMin.clear(); m_PortMin.clear();
m_PortMax.clear();
m_PortMax.clear();
m_PortClamp.clear(); m_PortClamp.clear();


for (int n=0; n<m_PluginInfo.NumInputs; n++) for (int n=0; n<m_PluginInfo.NumInputs; n++)
{ {
float Max=1.0f, Min=-1.0f; float Max=1.0f, Min=-1.0f;
int Port=m_PortID[n]; int Port=m_PortID[n];
// Get the bounding hints for the port // Get the bounding hints for the port
LADSPA_PortRangeHintDescriptor HintDesc=PlugDesc->PortRangeHints[Port].HintDescriptor; LADSPA_PortRangeHintDescriptor HintDesc=PlugDesc->PortRangeHints[Port].HintDescriptor;
if (LADSPA_IS_HINT_BOUNDED_BELOW(HintDesc))
if (LADSPA_IS_HINT_BOUNDED_BELOW(HintDesc))
{ {
Min=PlugDesc->PortRangeHints[Port].LowerBound; Min=PlugDesc->PortRangeHints[Port].LowerBound;
if (LADSPA_IS_HINT_SAMPLE_RATE(HintDesc)) if (LADSPA_IS_HINT_SAMPLE_RATE(HintDesc))
@@ -547,7 +590,7 @@ bool LADSPAPlugin::UpdatePlugin(const char * filename, const char * label, bool
Min*=m_HostInfo->SAMPLERATE; Min*=m_HostInfo->SAMPLERATE;
} }
} }
if (LADSPA_IS_HINT_BOUNDED_ABOVE(HintDesc))
if (LADSPA_IS_HINT_BOUNDED_ABOVE(HintDesc))
{ {
Max=PlugDesc->PortRangeHints[Port].UpperBound; Max=PlugDesc->PortRangeHints[Port].UpperBound;
if (LADSPA_IS_HINT_SAMPLE_RATE(HintDesc)) if (LADSPA_IS_HINT_SAMPLE_RATE(HintDesc))
@@ -555,23 +598,53 @@ bool LADSPAPlugin::UpdatePlugin(const char * filename, const char * label, bool
Max*=m_HostInfo->SAMPLERATE; Max*=m_HostInfo->SAMPLERATE;
} }
} }
m_PortMin.push_back(Min); m_PortMin.push_back(Min);
m_PortMax.push_back(Max); m_PortMax.push_back(Max);
// PortClamp defaults to true // PortClamp defaults to true
m_PortClamp.push_back(true); m_PortClamp.push_back(true);
m_CurrentPlugin.Ports[n].Min=Min; m_CurrentPlugin.Ports[n].Min=Min;
m_CurrentPlugin.Ports[n].Max=Max; m_CurrentPlugin.Ports[n].Max=Max;
m_CurrentPlugin.Ports[n].Clamped=true; m_CurrentPlugin.Ports[n].Clamped=true;
} }
}
}

// Finally, we need to supply the GUI with information via
// ChannelHandler.
m_InputPortCount = m_PluginInfo.NumInputs;
int lbl_length;
char *lbl_start;

lbl_length = m_CurrentPlugin.Name.size();
lbl_length = lbl_length > 255 ? 255 : lbl_length;
strncpy(m_Name, m_CurrentPlugin.Name.substr(0, lbl_length).c_str(), lbl_length);
m_Name[lbl_length] = '\0';

lbl_length = m_CurrentPlugin.Maker.size();
lbl_length = lbl_length > 255 ? 255 : lbl_length;
strncpy(m_Maker, m_CurrentPlugin.Maker.substr(0, lbl_length).c_str(), lbl_length);
m_Maker[lbl_length] = '\0';

lbl_start = m_InputPortNames;
for (unsigned long n = 0; n < m_InputPortCount; n++) {
m_InputPortMin[n] = m_CurrentPlugin.Ports[n].Min;
m_InputPortMax[n] = m_CurrentPlugin.Ports[n].Max;
m_InputPortClamp[n] = m_CurrentPlugin.Ports[n].Clamped;

lbl_length = m_CurrentPlugin.Ports[n].Name.size();
lbl_length = lbl_length > 255 ? 255 : lbl_length;
strncpy(lbl_start, m_CurrentPlugin.Ports[n].Name.substr(0, lbl_length).c_str(), lbl_length);
lbl_start[lbl_length] = '\0';
lbl_start += 256;
}

return true; return true;
} }
} }
cerr << "Error loading LADSPA Plugin.\n"; cerr << "Error loading LADSPA Plugin.\n";
return false; return false;
} }



+ 32
- 30
SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.h View File

@@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
*/


#include "../SpiralPlugin.h" #include "../SpiralPlugin.h"
#include <FL/Fl_Pixmap.H> #include <FL/Fl_Pixmap.H>
@@ -32,16 +32,17 @@ public:
string Label; string Label;
string Name; string Name;
string Maker; string Maker;
unsigned long InputPortCount;

struct LPortDetails struct LPortDetails
{ {
string Name; string Name;
float Min,Max; float Min,Max;
bool Clamped; bool Clamped;
}; };
vector<LPortDetails> Ports; vector<LPortDetails> Ports;
bool operator<(const LPluginInfo & li) { return (Name < li.Name); } bool operator<(const LPluginInfo & li) { return (Name < li.Name); }
bool operator==(const LPluginInfo& li) { return (Name == li.Name); } bool operator==(const LPluginInfo& li) { return (Name == li.Name); }
}; };
@@ -60,34 +61,22 @@ class LADSPAPlugin : public SpiralPlugin
public: public:
LADSPAPlugin(); LADSPAPlugin();
virtual ~LADSPAPlugin(); virtual ~LADSPAPlugin();
virtual PluginInfo &Initialise(const HostInfo *Host); virtual PluginInfo &Initialise(const HostInfo *Host);
virtual SpiralGUIType *CreateGUI(); virtual SpiralGUIType *CreateGUI();
virtual void Execute(); virtual void Execute();
virtual void ExecuteCommands();
virtual void ExecuteCommands();
virtual void StreamOut(ostream &s); virtual void StreamOut(ostream &s);
virtual void StreamIn(istream &s); virtual void StreamIn(istream &s);
float GetGain() { return m_Gain; } float GetGain() { return m_Gain; }
bool GetAmped() { return m_Amped; } bool GetAmped() { return m_Amped; }
enum GUICommands{NONE,SETMIN,SETMAX,SETCLAMP,UPDATEPLUGIN};
struct GUIArgs
{
int Num;
float Value;
bool Clamp;
char Filename[256];
char Label[256];
};
private:


GUIArgs m_GUIArgs;
enum GUICommands{NONE,UPDATERANGES,UPDATEPLUGIN};

private:


void SetMin(int n,float min) { m_PortMin[n]=min; }
void SetMax(int n,float max) { m_PortMax[n]=max; }
void SetPortClamp(int n,bool i) { m_PortClamp[n]=i; }
void UpdatePortRange(void);
bool UpdatePlugin(int n); bool UpdatePlugin(int n);
bool UpdatePlugin(const char * filename, const char * label, bool PortClampReset=true); bool UpdatePlugin(const char * filename, const char * label, bool PortClampReset=true);


@@ -96,20 +85,33 @@ private:


void * PlugHandle; void * PlugHandle;
const LADSPA_Descriptor * PlugDesc; const LADSPA_Descriptor * PlugDesc;
vector<LADSPA_Data*> m_LADSPABufVec; vector<LADSPA_Data*> m_LADSPABufVec;
LADSPA_Handle PlugInstHandle; LADSPA_Handle PlugInstHandle;
vector<int> m_PortID;

vector<int> m_PortID;
vector<float> m_PortMin; vector<float> m_PortMin;
vector<float> m_PortMax;
vector<bool> m_PortClamp;
vector<float> m_PortMax;
vector<bool> m_PortClamp;
// our database of ladspa plugins // our database of ladspa plugins
vector<LPluginInfo> m_LADSPAList; vector<LPluginInfo> m_LADSPAList;
LPluginInfo m_CurrentPlugin; LPluginInfo m_CurrentPlugin;


float m_Gain;
bool m_Amped;
float m_Gain;
bool m_Amped;
unsigned long m_PluginIndex;
char *m_Name;
char *m_Maker;

unsigned long m_InputPortCountMax; // Maximum number of input ports
// Corresponds to input port count of one
// (or more) plugins found
unsigned long m_InputPortCount; // Number of input ports in current plugin
float *m_InputPortMin; // Input port range minima
float *m_InputPortMax; // Input port range maxima
bool *m_InputPortClamp; // Input port clamp state
char *m_InputPortNames; // Input port names
}; };


#endif #endif

+ 106
- 54
SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.C View File

@@ -21,8 +21,8 @@
#include <FL/fl_draw.h> #include <FL/fl_draw.h>
#include <FL/fl_draw.H> #include <FL/fl_draw.H>
#include "ladspa.h" #include "ladspa.h"
#include <stdio.h>
#include <math.h>
#include <cstdio>
#include <cmath>
#include <dlfcn.h> #include <dlfcn.h>
#include <vector> #include <vector>
#include "utils.h" #include "utils.h"
@@ -35,7 +35,7 @@ LADSPAPluginGUI::LADSPAPluginGUI(int w, int h,LADSPAPlugin *o, ChannelHandler *c
SpiralPluginGUI(w,h,o,ch) SpiralPluginGUI(w,h,o,ch)
{ {
PluginList=PVec; PluginList=PVec;
m_Filename="None"; m_Filename="None";


int Width=20; int Width=20;
@@ -43,13 +43,30 @@ SpiralPluginGUI(w,h,o,ch)


m_Browser= new Fl_Hold_Browser(5,20,290,260,"LADSPA Plugins"); m_Browser= new Fl_Hold_Browser(5,20,290,260,"LADSPA Plugins");
m_Browser->callback((Fl_Callback*)cb_Select); m_Browser->callback((Fl_Callback*)cb_Select);
for (vector<LPluginInfo>::iterator i=PluginList.begin(); for (vector<LPluginInfo>::iterator i=PluginList.begin();
i!=PluginList.end(); i++) i!=PluginList.end(); i++)
{ {
m_Browser->add((*i).Name.c_str()); m_Browser->add((*i).Name.c_str());
} }


// Get maximum input port count
m_GUICH->GetData("InputPortCountMax",&m_InputPortCountMax);

// Set up buffers for data transfer via ChannelHandler
m_InputPortMin = (float *)malloc(sizeof(float) * m_InputPortCountMax);
m_InputPortMax = (float *)malloc(sizeof(float) * m_InputPortCountMax);
m_InputPortClamp = (bool *)malloc(sizeof(bool) * m_InputPortCountMax);
m_InputPortNames = (char *)malloc(256 * m_InputPortCountMax);
m_NameString = (char *)malloc(256);
m_MakerString = (char *)malloc(256);

if (!(m_InputPortMin && m_InputPortMax && m_InputPortClamp && m_InputPortNames &&
m_NameString && m_MakerString)) {
cerr<<"Memory allocation error\n"<<endl;
}

m_InputScroll = new Fl_Scroll(300,80,290,150," Value Min Max Clamp?"); m_InputScroll = new Fl_Scroll(300,80,290,150," Value Min Max Clamp?");
m_InputScroll->align(FL_ALIGN_TOP_LEFT); m_InputScroll->align(FL_ALIGN_TOP_LEFT);
m_InputScroll->type(Fl_Scroll::VERTICAL); m_InputScroll->type(Fl_Scroll::VERTICAL);
@@ -57,71 +74,77 @@ SpiralPluginGUI(w,h,o,ch)
add(m_InputScroll); add(m_InputScroll);
m_InputPack = new Fl_Pack(300,85,300,100,""); m_InputPack = new Fl_Pack(300,85,300,100,"");
m_InputScroll->add(m_InputPack); m_InputScroll->add(m_InputPack);
m_Name = new Fl_Box(290,20,10,20,"None"); m_Name = new Fl_Box(290,20,10,20,"None");
m_Name->align(FL_ALIGN_RIGHT); m_Name->align(FL_ALIGN_RIGHT);
m_Name->labelcolor(GUI_COLOUR); m_Name->labelcolor(GUI_COLOUR);
m_Name->labelsize(10); m_Name->labelsize(10);
add(m_Name); add(m_Name);
m_Maker = new Fl_Box(290,40,10,20,"None"); m_Maker = new Fl_Box(290,40,10,20,"None");
m_Maker->align(FL_ALIGN_RIGHT); m_Maker->align(FL_ALIGN_RIGHT);
m_Maker->labelcolor(GUI_COLOUR); m_Maker->labelcolor(GUI_COLOUR);
m_Maker->labelsize(10); m_Maker->labelsize(10);
add(m_Maker); add(m_Maker);
m_OutputGain = new Fl_Knob(545,240,40,40,"Output Gain"); m_OutputGain = new Fl_Knob(545,240,40,40,"Output Gain");
m_OutputGain->color(GUI_COLOUR); m_OutputGain->color(GUI_COLOUR);
m_OutputGain->type(Fl_Knob::DOTLIN); m_OutputGain->type(Fl_Knob::DOTLIN);
m_OutputGain->maximum(2); m_OutputGain->maximum(2);
m_OutputGain->step(0.001);
m_OutputGain->value(1.0);
m_OutputGain->step(0.001);
m_OutputGain->value(1.0);
m_OutputGain->labelsize(10); m_OutputGain->labelsize(10);
m_OutputGain->callback((Fl_Callback*)cb_Gain); m_OutputGain->callback((Fl_Callback*)cb_Gain);
add(m_OutputGain); add(m_OutputGain);
m_UpdateInputs = new Fl_Button(480,252,50,25,"Refresh"); m_UpdateInputs = new Fl_Button(480,252,50,25,"Refresh");
m_UpdateInputs->labelsize(10); m_UpdateInputs->labelsize(10);
m_UpdateInputs->value(1); m_UpdateInputs->value(1);
m_UpdateInputs->type(1); m_UpdateInputs->type(1);
add(m_UpdateInputs); add(m_UpdateInputs);
m_UpdateMinMax = new Fl_Button(400,252,85,25,"Update Min/Max"); m_UpdateMinMax = new Fl_Button(400,252,85,25,"Update Min/Max");
m_UpdateMinMax->labelsize(10); m_UpdateMinMax->labelsize(10);
m_UpdateMinMax->callback((Fl_Callback*)cb_MinMax); m_UpdateMinMax->callback((Fl_Callback*)cb_MinMax);
add(m_UpdateMinMax); add(m_UpdateMinMax);
m_PowerAmp = new Fl_Button(320,252,80,25,"PowerAmp"); m_PowerAmp = new Fl_Button(320,252,80,25,"PowerAmp");
m_PowerAmp->labelsize(10); m_PowerAmp->labelsize(10);
m_PowerAmp->value(0); m_PowerAmp->value(0);
m_PowerAmp->type(1); m_PowerAmp->type(1);
m_PowerAmp->callback((Fl_Callback*)cb_PowerAmp); m_PowerAmp->callback((Fl_Callback*)cb_PowerAmp);
add(m_PowerAmp); add(m_PowerAmp);
end(); end();
} }


LADSPAPluginGUI::~LADSPAPluginGUI(void)
LADSPAPluginGUI::~LADSPAPluginGUI(void)
{ {
if (m_InputPortMin) free(m_InputPortMin);
if (m_InputPortMax) free(m_InputPortMax);
if (m_InputPortClamp) free(m_InputPortClamp);
if (m_InputPortNames) free(m_InputPortNames);
if (m_NameString) free(m_NameString);
if (m_MakerString) free(m_MakerString);
Fl::check(); Fl::check();
} }


void LADSPAPluginGUI::UpdatePortDisplay(int n, float v) void LADSPAPluginGUI::UpdatePortDisplay(int n, float v)
{ {
if (!m_UpdateInputs->value()) return; if (!m_UpdateInputs->value()) return;
char temp[256]; char temp[256];
sprintf(temp,"%f",v);
sprintf(temp,"%f",v);
m_PortOutput[n]->value(temp); m_PortOutput[n]->value(temp);
} }


void LADSPAPluginGUI::SetMinMax(int n, float min, float max, bool clamp) void LADSPAPluginGUI::SetMinMax(int n, float min, float max, bool clamp)
{ {
char temp[256]; char temp[256];
sprintf(temp,"%f",min);
sprintf(temp,"%f",min);
m_PortMin[n]->value(temp); m_PortMin[n]->value(temp);
sprintf(temp,"%f",max);
sprintf(temp,"%f",max);
m_PortMax[n]->value(temp); m_PortMax[n]->value(temp);


sprintf(temp, "%d",clamp); sprintf(temp, "%d",clamp);
@@ -144,7 +167,7 @@ void LADSPAPluginGUI::SetMaker(const char *s)
{ {
m_Maker->label(s); m_Maker->label(s);
} }
void LADSPAPluginGUI::ClearPortInfo() void LADSPAPluginGUI::ClearPortInfo()
{ {
for (vector<Fl_Group*>::iterator i=m_PackVec.begin(); for (vector<Fl_Group*>::iterator i=m_PackVec.begin();
@@ -152,12 +175,12 @@ void LADSPAPluginGUI::ClearPortInfo()
{ {
m_InputPack->remove((*i)); m_InputPack->remove((*i));
} }
m_InputScroll->remove(m_InputPack);
m_InputScroll->remove(m_InputPack);
delete m_InputPack; delete m_InputPack;
m_InputPack = new Fl_Pack(x()+300,y()+85,300,100,""); m_InputPack = new Fl_Pack(x()+300,y()+85,300,100,"");
m_InputScroll->add(m_InputPack);
m_InputScroll->add(m_InputPack);
m_PortOutput.clear(); m_PortOutput.clear();
m_PackVec.clear(); m_PackVec.clear();
m_PortMin.clear(); m_PortMin.clear();
@@ -166,24 +189,24 @@ void LADSPAPluginGUI::ClearPortInfo()
} }


void LADSPAPluginGUI::AddPortInfo(const char *Info) void LADSPAPluginGUI::AddPortInfo(const char *Info)
{
{
Fl_Group* NewGroup = new Fl_Group(0,85,150,15,""); Fl_Group* NewGroup = new Fl_Group(0,85,150,15,"");
NewGroup->box(FL_FLAT_BOX); NewGroup->box(FL_FLAT_BOX);
m_InputPack->add(NewGroup); m_InputPack->add(NewGroup);
m_PackVec.push_back(NewGroup); m_PackVec.push_back(NewGroup);
Fl_Box* NewText = new Fl_Box(100,85,80,15,""); Fl_Box* NewText = new Fl_Box(100,85,80,15,"");
NewText->label(Info); NewText->label(Info);
NewText->labelsize(8); NewText->labelsize(8);
NewText->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); NewText->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
NewGroup->add(NewText); NewGroup->add(NewText);
Fl_Output* NewOutput = new Fl_Output(5,85,20,15,""); Fl_Output* NewOutput = new Fl_Output(5,85,20,15,"");
NewOutput->value(0); NewOutput->value(0);
NewOutput->textsize(10); NewOutput->textsize(10);
NewGroup->add(NewOutput); NewGroup->add(NewOutput);
m_PortOutput.push_back(NewOutput); m_PortOutput.push_back(NewOutput);
Fl_Input* NewInput = new Fl_Input(26,85,20,15,""); Fl_Input* NewInput = new Fl_Input(26,85,20,15,"");
NewInput->value(0); NewInput->value(0);
NewInput->textsize(10); NewInput->textsize(10);
@@ -195,7 +218,7 @@ void LADSPAPluginGUI::AddPortInfo(const char *Info)
NewInput->textsize(10); NewInput->textsize(10);
NewGroup->add(NewInput); NewGroup->add(NewInput);
m_PortMax.push_back(NewInput); m_PortMax.push_back(NewInput);
Fl_Check_Button* NewCheckButton = new Fl_Check_Button(80,85,15,15,""); Fl_Check_Button* NewCheckButton = new Fl_Check_Button(80,85,15,15,"");
NewCheckButton->value(0); NewCheckButton->value(0);
NewGroup->add(NewCheckButton); NewGroup->add(NewCheckButton);
@@ -204,63 +227,92 @@ void LADSPAPluginGUI::AddPortInfo(const char *Info)
NewGroup->redraw(); NewGroup->redraw();
m_InputPack->redraw(); m_InputPack->redraw();
m_InputScroll->redraw(); m_InputScroll->redraw();
redraw(); redraw();
} }



void LADSPAPluginGUI::UpdateValues(SpiralPlugin *o) void LADSPAPluginGUI::UpdateValues(SpiralPlugin *o)
{ {
LADSPAPlugin* Plugin = (LADSPAPlugin*)o; LADSPAPlugin* Plugin = (LADSPAPlugin*)o;
m_OutputGain->value(Plugin->GetGain()); m_OutputGain->value(Plugin->GetGain());
} }


inline void LADSPAPluginGUI::cb_Gain_i(Fl_Knob* o, void* v)
{ m_GUICH->Set("Gain",(float)(o->value())); }
void LADSPAPluginGUI::cb_Gain(Fl_Knob* o, void* v)
{ ((LADSPAPluginGUI*)(o->parent()))->cb_Gain_i(o,v); }
inline void LADSPAPluginGUI::cb_Gain_i(Fl_Knob* o, void* v)
{
m_GUICH->Set("Gain",(float)(o->value()));
}
void LADSPAPluginGUI::cb_Gain(Fl_Knob* o, void* v)
{
((LADSPAPluginGUI*)(o->parent()))->cb_Gain_i(o,v);
}


inline void LADSPAPluginGUI::cb_Select_i(Fl_Hold_Browser* o)
{
inline void LADSPAPluginGUI::cb_Select_i(Fl_Hold_Browser* o)
{
m_Filename=PluginList[o->value()-1].Filename; m_Filename=PluginList[o->value()-1].Filename;
m_Label=PluginList[o->value()-1].Label; m_Label=PluginList[o->value()-1].Label;
m_GUICH->Set("Num",o->value()-1);
m_GUICH->Set("PluginIndex",o->value()-1);
m_GUICH->SetCommand(LADSPAPlugin::UPDATEPLUGIN); m_GUICH->SetCommand(LADSPAPlugin::UPDATEPLUGIN);

// Wait until next update for data to be set up for new plugin
m_GUICH->Wait();

// Now get the new values to populate GUI controls
m_GUICH->GetData("Name", m_NameString);
m_GUICH->GetData("Maker", m_MakerString);
m_GUICH->GetData("InputPortCount", &m_InputPortCount);
m_GUICH->GetData("InputPortMin", m_InputPortMin);
m_GUICH->GetData("InputPortMax", m_InputPortMax);
m_GUICH->GetData("InputPortClamp", m_InputPortClamp);
m_GUICH->GetData("InputPortNames", m_InputPortNames);

SetName((const char *)m_NameString);
SetMaker((const char *)m_MakerString);

// Clear out port info, and refresh
ClearPortInfo();

for (unsigned long n = 0; n < m_InputPortCount; n++) {
AddPortInfo((const char *)(m_InputPortNames + n * 256));
SetMinMax(n, m_InputPortMin[n], m_InputPortMax[n], m_InputPortClamp[n]);
}
}
void LADSPAPluginGUI::cb_Select(Fl_Hold_Browser* o)
{
((LADSPAPluginGUI*)(o->parent()))->cb_Select_i(o);
} }
void LADSPAPluginGUI::cb_Select(Fl_Hold_Browser* o)
{ ((LADSPAPluginGUI*)(o->parent()))->cb_Select_i(o);}


inline void LADSPAPluginGUI::cb_MinMax_i(Fl_Button* o, void* v)
{
inline void LADSPAPluginGUI::cb_MinMax_i(Fl_Button* o, void* v)
{
int n=0; int n=0;
for (vector<Fl_Input*>::iterator i=m_PortMin.begin(); for (vector<Fl_Input*>::iterator i=m_PortMin.begin();
i!=m_PortMin.end(); i++)
i!=m_PortMin.end(); i++)
{ {
m_GUICH->Set("Min",(float)(n,atof((*i)->value())));
n++; n++;
} }
n=0; n=0;
for (vector<Fl_Input*>::iterator i=m_PortMax.begin(); for (vector<Fl_Input*>::iterator i=m_PortMax.begin();
i!=m_PortMax.end(); i++)
i!=m_PortMax.end(); i++)
{ {
m_GUICH->Set("Max",(n,atof((*i)->value())));
n++; n++;
} }
n=0; n=0;
for (vector<Fl_Check_Button*>::iterator i=m_PortClamp.begin(); for (vector<Fl_Check_Button*>::iterator i=m_PortClamp.begin();
i!=m_PortClamp.end(); i++) i!=m_PortClamp.end(); i++)
{ {
m_GUICH->Set("Clamp",(bool)(n,(*i)->value()));
n++; n++;
} }
} }
void LADSPAPluginGUI::cb_MinMax(Fl_Button* o, void* v)
{ ((LADSPAPluginGUI*)(o->parent()))->cb_MinMax_i(o,v);}
void LADSPAPluginGUI::cb_MinMax(Fl_Button* o, void* v)
{
((LADSPAPluginGUI*)(o->parent()))->cb_MinMax_i(o,v);
}


inline void LADSPAPluginGUI::cb_PowerAmp_i(Fl_Button* o, void* v)
{
inline void LADSPAPluginGUI::cb_PowerAmp_i(Fl_Button* o, void* v)
{
m_GUICH->Set("Amped",(bool)(o->value())); m_GUICH->Set("Amped",(bool)(o->value()));
} }
void LADSPAPluginGUI::cb_PowerAmp(Fl_Button* o, void* v)
{ ((LADSPAPluginGUI*)(o->parent()))->cb_PowerAmp_i(o,v);}
void LADSPAPluginGUI::cb_PowerAmp(Fl_Button* o, void* v)
{
((LADSPAPluginGUI*)(o->parent()))->cb_PowerAmp_i(o,v);
}

+ 33
- 20
SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.h View File

@@ -39,8 +39,8 @@
#ifndef LADSPAGUI #ifndef LADSPAGUI
#define LADSPAGUI #define LADSPAGUI


#include <stdio.h>
#include <math.h>
#include <cstdio>
#include <cmath>
#include <dlfcn.h> #include <dlfcn.h>
#include <vector> #include <vector>


@@ -65,35 +65,35 @@ public:
string GetLabel() { return m_Label; } string GetLabel() { return m_Label; }
void SetFilename(string s) { m_Filename=s; } void SetFilename(string s) { m_Filename=s; }
void SetLabel(string s) { m_Label=s; } void SetLabel(string s) { m_Label=s; }
private: private:
LPluginInfo m_CurrentPlugin; LPluginInfo m_CurrentPlugin;


Fl_Scroll *m_InputScroll;
Fl_Pack *m_InputPack;
Fl_Hold_Browser *m_Browser;
Fl_Knob *m_OutputGain;
Fl_Box *m_Name;
Fl_Box *m_Maker;
Fl_Button *m_UpdateInputs;
Fl_Button *m_UpdateMinMax;
Fl_Button *m_PowerAmp;
vector<Fl_Output*> m_PortOutput;
vector<Fl_Input*> m_PortMin;
vector<Fl_Input*> m_PortMax;
Fl_Scroll *m_InputScroll;
Fl_Pack *m_InputPack;
Fl_Hold_Browser *m_Browser;
Fl_Knob *m_OutputGain;
Fl_Box *m_Name;
Fl_Box *m_Maker;
Fl_Button *m_UpdateInputs;
Fl_Button *m_UpdateMinMax;
Fl_Button *m_PowerAmp;
vector<Fl_Output*> m_PortOutput;
vector<Fl_Input*> m_PortMin;
vector<Fl_Input*> m_PortMax;
vector<Fl_Check_Button*> m_PortClamp; vector<Fl_Check_Button*> m_PortClamp;
vector<LPluginInfo> PluginList; vector<LPluginInfo> PluginList;
// this is needed as fltk seems to crash if you delete // this is needed as fltk seems to crash if you delete
// the pack, is won't delete the children properly??? // the pack, is won't delete the children properly???
vector<Fl_Group*> m_PackVec; vector<Fl_Group*> m_PackVec;
int inited; int inited;
string m_Filename; string m_Filename;
string m_Label; string m_Label;
inline void cb_Select_i(Fl_Hold_Browser* o); inline void cb_Select_i(Fl_Hold_Browser* o);
static void cb_Select(Fl_Hold_Browser* o); static void cb_Select(Fl_Hold_Browser* o);
inline void cb_Gain_i(Fl_Knob* o, void* v); inline void cb_Gain_i(Fl_Knob* o, void* v);
@@ -103,6 +103,19 @@ private:
inline void cb_PowerAmp_i(Fl_Button* o, void* v); inline void cb_PowerAmp_i(Fl_Button* o, void* v);
static void cb_PowerAmp(Fl_Button* o, void* v); static void cb_PowerAmp(Fl_Button* o, void* v);


// This lot is for copying plugin info from the audio thread
// to the GUI thread, via ChannelHandler

char *m_NameString; // Plugin Name
char *m_MakerString; // Plugin Maker;
unsigned long m_InputPortCountMax; // Maximum number of input ports
// Corresponds to input port count of one
// (or more) plugins found
unsigned long m_InputPortCount; // Number of input ports in current plugin
float *m_InputPortMin; // Input port range minima
float *m_InputPortMax; // Input port range maxima
bool *m_InputPortClamp; // Input port clamp state
char *m_InputPortNames; // Input port names
}; };






Loading…
Cancel
Save