diff --git a/SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.C b/SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.C index b440fe7..93b92ba 100644 --- a/SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.C +++ b/SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.C @@ -17,7 +17,9 @@ */ #include "LADSPAPlugin.h" #include "LADSPAPluginGUI.h" -#include +#include +#include +#include #include "SpiralIcon.xpm" #include "utils.h" #include @@ -63,7 +65,9 @@ void describePluginLibrary(const char * pcFullFilename, void * pvPluginHandle, pi.Filename = pcFullFilename; pi.Label = psDescriptor->Label; 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); } else { cerr << "Plugin ignored...\n\n"; @@ -76,6 +80,7 @@ void describePluginLibrary(const char * pcFullFilename, void * pvPluginHandle, void LADSPAPlugin::LoadPluginList(void) { m_LADSPAList.clear(); + m_CurrentPlugin.Name = ""; m_CurrentPlugin.Filename = ""; m_CurrentPlugin.Label = ""; @@ -85,7 +90,7 @@ void LADSPAPlugin::LoadPluginList(void) lg = NULL; sort(m_LADSPAList.begin(), m_LADSPAList.end(), LPluginInfoSortAsc()); -} +} //////////////////////////////////////////////////// @@ -108,35 +113,74 @@ int GetID() /////////////////////////////////////////////////////// -LADSPAPlugin::LADSPAPlugin() : -PlugHandle(0), +LADSPAPlugin::LADSPAPlugin() : +PlugHandle(0), PlugDesc(NULL), m_Gain(1.0f), m_Amped(false) { m_Version=3; - + m_PluginInfo.Name="LADSPA"; m_PluginInfo.Width=600; m_PluginInfo.Height=300; m_PluginInfo.NumInputs=0; 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("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(); + +// Examine plugin list and find highest input port count + for (vector::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"<BUFSIZE]; m_LADSPABufVec.push_back(NewPort); - return Info; + return Info; } 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() @@ -188,10 +233,10 @@ void LADSPAPlugin::Execute() for (int i=0; iBUFSIZE; i++) m_LADSPABufVec[n][i]=0; } } - + // run plugin - PlugDesc->run(PlugInstHandle,m_HostInfo->BUFSIZE); - + PlugDesc->run(PlugInstHandle,m_HostInfo->BUFSIZE); + // convert outputs for (int n=0; nGetCommand()) { - 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) { s<>Filename>>Label; - + if (Filename!="None") { UpdatePlugin(Filename.c_str(), Label.c_str()); @@ -430,10 +473,10 @@ bool LADSPAPlugin::UpdatePlugin(const char * filename, const char * label, bool PlugHandle = 0; return 0; } - + m_PluginInfo.NumInputs=getPortCountByType(PlugDesc, LADSPA_PORT_INPUT); m_PluginInfo.NumOutputs=getPortCountByType(PlugDesc, LADSPA_PORT_OUTPUT); - + ///////////////////////////////// // LADSPA Buffers @@ -442,9 +485,9 @@ bool LADSPAPlugin::UpdatePlugin(const char * filename, const char * label, bool { if (*i) delete[] (*i); } - m_LADSPABufVec.clear(); - - unsigned long c=0; + m_LADSPABufVec.clear(); + + unsigned long c=0; for (unsigned int n=0; nPortCount; 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]; m_LADSPABufVec.push_back(NewPort); PlugDesc->connect_port(PlugInstHandle, n, m_LADSPABufVec[c]); - m_PortID.push_back(n); + m_PortID.push_back(n); c++; - } - } - + } + } + for (unsigned int n=0; nPortCount; 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]); m_PortID.push_back(n); c++; - } - } - + } + } + // activate the plugin now if (PlugDesc->activate) PlugDesc->activate(PlugInstHandle); @@ -481,9 +524,9 @@ bool LADSPAPlugin::UpdatePlugin(const char * filename, const char * label, bool RemoveAllOutputs(); // Reallocate the i/o buffers required - for (int n=0; nMaker; m_CurrentPlugin.Filename=filename; m_CurrentPlugin.Label=label; - + m_CurrentPlugin.Ports.clear(); m_PluginInfo.PortTips.clear(); - + string desc; 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]) + (LADSPA_IS_PORT_CONTROL(PlugDesc->PortDescriptors[i]) ? " (CV)" : " (AU)"); m_PluginInfo.PortTips.push_back(desc.c_str()); - + LPluginInfo::LPortDetails PortDetails; PortDetails.Name=m_PluginInfo.PortTips[c].c_str(); m_CurrentPlugin.Ports.push_back(PortDetails); - + 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])) { desc = string(PlugDesc->PortNames[i]) + (LADSPA_IS_PORT_CONTROL(PlugDesc->PortDescriptors[i]) ? " (CV)" : " (AU)"); - + m_PluginInfo.PortTips.push_back(desc.c_str()); } } - + UpdatePluginInfoWithHost(); if (PortClampReset) { m_PortMin.clear(); - m_PortMax.clear(); + m_PortMax.clear(); m_PortClamp.clear(); for (int n=0; nPortRangeHints[Port].HintDescriptor; - if (LADSPA_IS_HINT_BOUNDED_BELOW(HintDesc)) + if (LADSPA_IS_HINT_BOUNDED_BELOW(HintDesc)) { Min=PlugDesc->PortRangeHints[Port].LowerBound; 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; } } - if (LADSPA_IS_HINT_BOUNDED_ABOVE(HintDesc)) + if (LADSPA_IS_HINT_BOUNDED_ABOVE(HintDesc)) { Max=PlugDesc->PortRangeHints[Port].UpperBound; 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; } } - + m_PortMin.push_back(Min); m_PortMax.push_back(Max); // PortClamp defaults to true m_PortClamp.push_back(true); - + m_CurrentPlugin.Ports[n].Min=Min; m_CurrentPlugin.Ports[n].Max=Max; 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; } } - + cerr << "Error loading LADSPA Plugin.\n"; - + return false; } diff --git a/SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.h b/SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.h index 28d3609..589bd05 100644 --- a/SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.h +++ b/SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.h @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ +*/ #include "../SpiralPlugin.h" #include @@ -32,16 +32,17 @@ public: string Label; string Name; string Maker; - + unsigned long InputPortCount; + struct LPortDetails { string Name; float Min,Max; bool Clamped; }; - + vector Ports; - + 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: LADSPAPlugin(); virtual ~LADSPAPlugin(); - + virtual PluginInfo &Initialise(const HostInfo *Host); virtual SpiralGUIType *CreateGUI(); virtual void Execute(); - virtual void ExecuteCommands(); + virtual void ExecuteCommands(); virtual void StreamOut(ostream &s); virtual void StreamIn(istream &s); - + float GetGain() { return m_Gain; } 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(const char * filename, const char * label, bool PortClampReset=true); @@ -96,20 +85,33 @@ private: void * PlugHandle; const LADSPA_Descriptor * PlugDesc; - + vector m_LADSPABufVec; LADSPA_Handle PlugInstHandle; - vector m_PortID; + + vector m_PortID; vector m_PortMin; - vector m_PortMax; - vector m_PortClamp; - + vector m_PortMax; + vector m_PortClamp; + // our database of ladspa plugins vector m_LADSPAList; 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 diff --git a/SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.C b/SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.C index 384b630..1af94f7 100644 --- a/SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.C +++ b/SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.C @@ -21,8 +21,8 @@ #include #include #include "ladspa.h" -#include -#include +#include +#include #include #include #include "utils.h" @@ -35,7 +35,7 @@ LADSPAPluginGUI::LADSPAPluginGUI(int w, int h,LADSPAPlugin *o, ChannelHandler *c SpiralPluginGUI(w,h,o,ch) { PluginList=PVec; - + m_Filename="None"; 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->callback((Fl_Callback*)cb_Select); - + for (vector::iterator i=PluginList.begin(); i!=PluginList.end(); i++) { 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"<align(FL_ALIGN_TOP_LEFT); m_InputScroll->type(Fl_Scroll::VERTICAL); @@ -57,71 +74,77 @@ SpiralPluginGUI(w,h,o,ch) add(m_InputScroll); m_InputPack = new Fl_Pack(300,85,300,100,""); m_InputScroll->add(m_InputPack); - + m_Name = new Fl_Box(290,20,10,20,"None"); m_Name->align(FL_ALIGN_RIGHT); m_Name->labelcolor(GUI_COLOUR); m_Name->labelsize(10); add(m_Name); - + m_Maker = new Fl_Box(290,40,10,20,"None"); m_Maker->align(FL_ALIGN_RIGHT); m_Maker->labelcolor(GUI_COLOUR); m_Maker->labelsize(10); add(m_Maker); - + m_OutputGain = new Fl_Knob(545,240,40,40,"Output Gain"); m_OutputGain->color(GUI_COLOUR); m_OutputGain->type(Fl_Knob::DOTLIN); 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->callback((Fl_Callback*)cb_Gain); add(m_OutputGain); - + m_UpdateInputs = new Fl_Button(480,252,50,25,"Refresh"); m_UpdateInputs->labelsize(10); m_UpdateInputs->value(1); m_UpdateInputs->type(1); add(m_UpdateInputs); - + m_UpdateMinMax = new Fl_Button(400,252,85,25,"Update Min/Max"); m_UpdateMinMax->labelsize(10); m_UpdateMinMax->callback((Fl_Callback*)cb_MinMax); add(m_UpdateMinMax); - + m_PowerAmp = new Fl_Button(320,252,80,25,"PowerAmp"); m_PowerAmp->labelsize(10); m_PowerAmp->value(0); m_PowerAmp->type(1); m_PowerAmp->callback((Fl_Callback*)cb_PowerAmp); add(m_PowerAmp); - + 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(); } void LADSPAPluginGUI::UpdatePortDisplay(int n, float v) { if (!m_UpdateInputs->value()) return; - + char temp[256]; - sprintf(temp,"%f",v); + sprintf(temp,"%f",v); m_PortOutput[n]->value(temp); } void LADSPAPluginGUI::SetMinMax(int n, float min, float max, bool clamp) { char temp[256]; - sprintf(temp,"%f",min); + sprintf(temp,"%f",min); m_PortMin[n]->value(temp); - - sprintf(temp,"%f",max); + + sprintf(temp,"%f",max); m_PortMax[n]->value(temp); sprintf(temp, "%d",clamp); @@ -144,7 +167,7 @@ void LADSPAPluginGUI::SetMaker(const char *s) { m_Maker->label(s); } - + void LADSPAPluginGUI::ClearPortInfo() { for (vector::iterator i=m_PackVec.begin(); @@ -152,12 +175,12 @@ void LADSPAPluginGUI::ClearPortInfo() { m_InputPack->remove((*i)); } - - m_InputScroll->remove(m_InputPack); + + m_InputScroll->remove(m_InputPack); delete m_InputPack; 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_PackVec.clear(); m_PortMin.clear(); @@ -166,24 +189,24 @@ void LADSPAPluginGUI::ClearPortInfo() } void LADSPAPluginGUI::AddPortInfo(const char *Info) -{ +{ Fl_Group* NewGroup = new Fl_Group(0,85,150,15,""); NewGroup->box(FL_FLAT_BOX); m_InputPack->add(NewGroup); m_PackVec.push_back(NewGroup); - + Fl_Box* NewText = new Fl_Box(100,85,80,15,""); NewText->label(Info); NewText->labelsize(8); NewText->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); NewGroup->add(NewText); - + Fl_Output* NewOutput = new Fl_Output(5,85,20,15,""); NewOutput->value(0); NewOutput->textsize(10); NewGroup->add(NewOutput); m_PortOutput.push_back(NewOutput); - + Fl_Input* NewInput = new Fl_Input(26,85,20,15,""); NewInput->value(0); NewInput->textsize(10); @@ -195,7 +218,7 @@ void LADSPAPluginGUI::AddPortInfo(const char *Info) NewInput->textsize(10); NewGroup->add(NewInput); m_PortMax.push_back(NewInput); - + Fl_Check_Button* NewCheckButton = new Fl_Check_Button(80,85,15,15,""); NewCheckButton->value(0); NewGroup->add(NewCheckButton); @@ -204,63 +227,92 @@ void LADSPAPluginGUI::AddPortInfo(const char *Info) NewGroup->redraw(); m_InputPack->redraw(); m_InputScroll->redraw(); - + redraw(); } - void LADSPAPluginGUI::UpdateValues(SpiralPlugin *o) { LADSPAPlugin* Plugin = (LADSPAPlugin*)o; 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_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); + +// 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; for (vector::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=0; for (vector::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=0; for (vector::iterator i=m_PortClamp.begin(); i!=m_PortClamp.end(); i++) { - m_GUICH->Set("Clamp",(bool)(n,(*i)->value())); 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())); } -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); +} diff --git a/SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.h b/SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.h index cb517ea..114125b 100644 --- a/SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.h +++ b/SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.h @@ -39,8 +39,8 @@ #ifndef LADSPAGUI #define LADSPAGUI -#include -#include +#include +#include #include #include @@ -65,35 +65,35 @@ public: string GetLabel() { return m_Label; } void SetFilename(string s) { m_Filename=s; } void SetLabel(string s) { m_Label=s; } - + private: 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 m_PortOutput; - vector m_PortMin; - vector 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 m_PortOutput; + vector m_PortMin; + vector m_PortMax; vector m_PortClamp; - + vector PluginList; - + // this is needed as fltk seems to crash if you delete // the pack, is won't delete the children properly??? vector m_PackVec; - + int inited; - + string m_Filename; string m_Label; - + inline void cb_Select_i(Fl_Hold_Browser* o); static void cb_Select(Fl_Hold_Browser* o); 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); 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 };