diff --git a/SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.C b/SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.C index 8c801d0..1c0f45a 100644 --- a/SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.C +++ b/SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.C @@ -205,6 +205,17 @@ LADSPAInfo::GetPluginList(void) return m_OrderedPluginList; } +unsigned long +LADSPAInfo::GetPluginListEntryByID(unsigned long unique_id) +{ + unsigned long j = 0; + for (vector::iterator i = m_OrderedPluginList.begin(); + i != m_OrderedPluginList.end(); i++, j++) { + if (i->UniqueID == unique_id) return j; + } + return m_OrderedPluginList.size(); +} + // **************************************************************************** // ** Private Member Functions ** // **************************************************************************** diff --git a/SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.h b/SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.h index fc5a5b1..b7d62c6 100644 --- a/SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.h +++ b/SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.h @@ -62,7 +62,15 @@ public: std::string Name; }; + // Get a list of plugins ordered by name const std::vector GetPluginList(void); + + // Get the index in the above list for given Unique ID + // If not found, this returns the size of the above list + unsigned long GetPluginListEntryByID(unsigned long unique_id); + + // Get the number of input ports for the plugin with the most + // input ports unsigned long GetMaxInputPortCount(void) { return m_MaxInputPortCount; } private: diff --git a/SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.C b/SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.C index a966a82..50fb2b4 100644 --- a/SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.C +++ b/SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.C @@ -46,13 +46,13 @@ int GetID() /////////////////////////////////////////////////////// -LADSPAPlugin::LADSPAPlugin() : -PlugHandle(0), -PlugDesc(NULL), -m_Gain(1.0f), -m_Amped(false) +LADSPAPlugin::LADSPAPlugin() { - m_Version=4; + PlugDesc = NULL; + + ClearPlugin(); + + m_Version=5; m_PluginInfo.Name="LADSPA"; m_PluginInfo.Width=500; @@ -61,9 +61,7 @@ m_Amped(false) m_PluginInfo.NumOutputs=1; m_PluginInfo.PortTips.push_back("Nuffink yet"); - m_PluginIndex = 0; m_MaxInputPortCount = m_LADSPAInfo.GetMaxInputPortCount(); - m_InputPortCount = 0; // For receiving from GUI m_AudioCH->Register("SetGain",&(m_InData.Gain)); @@ -96,6 +94,9 @@ m_Amped(false) LADSPAPlugin::~LADSPAPlugin() { +// Clear plugin + ClearPlugin(); + // Free allocated buffers if (m_OutData.InputPortNames) free(m_OutData.InputPortNames); if (m_OutData.InputPortSettings) free(m_OutData.InputPortSettings); @@ -186,12 +187,18 @@ void LADSPAPlugin::ExecuteCommands() { switch(m_AudioCH->GetCommand()) { - case (SETPORTSETTINGS) : + case (SETPORTSETTINGS): SetPortSettings(); break; - case (SELECTPLUGIN) : + case (CLEARPLUGIN): + ClearPlugin(); + m_PluginInfo.NumOutputs=1; + m_PluginInfo.PortTips.push_back("Nuffink yet"); + UpdatePluginInfoWithHost(); + break; + case (SELECTPLUGIN): vector pe = m_LADSPAInfo.GetPluginList(); - UpdatePlugin(pe[m_InData.PluginIndex].UniqueID); + UpdatePlugin(pe[m_InData.PluginIndex - 1].UniqueID); break; } } @@ -203,7 +210,7 @@ void LADSPAPlugin::StreamOut(ostream &s) switch (m_Version) { - case 4: + case 5: { s<::iterator i=m_PortMin.begin(); +// i!=m_PortMin.end(); i++) +// { +// s<<*i<<" "; +// } +// for (vector::iterator i=m_PortMax.begin(); +// i!=m_PortMax.end(); i++) +// { +// s<<*i<<" "; +// } +// for (vector::iterator i=m_PortClamp.begin(); +// i!=m_PortClamp.end(); i++) +// { +// s<<*i<<" "; +// } + } + break; + case 3: + { // s<>m_Gain; + + unsigned long UniqueID; + s>>UniqueID; + int PortCount; + s>>PortCount; + float Min, Max; + bool Clamp; + float Default; + + for (int n=0; n>Min; + m_PortMin.push_back(Min); + } + + for (int n=0; n>Max; + m_PortMax.push_back(Max); + } + for (int n=0; n>Clamp; + m_PortClamp.push_back(Clamp); + } + for (int n=0; n>Default; + m_PortDefault.push_back(Default); + } + + UpdatePlugin(UniqueID, false); + } + break; case 4: { s>>m_Gain; @@ -304,30 +373,29 @@ void LADSPAPlugin::StreamIn(istream &s) s>>UniqueID; int PortCount; s>>PortCount; - float min,max; - bool clamp; - float defolt; + float Min, Max; + bool Clamp; for (int n=0; n>min; - m_PortMin.push_back(min); + s>>Min; + m_PortMin.push_back(Min); } for (int n=0; n>max; - m_PortMax.push_back(max); + s>>Max; + m_PortMax.push_back(Max); } for (int n=0; n>clamp; - m_PortClamp.push_back(clamp); + s>>Clamp; + m_PortClamp.push_back(Clamp); } for (int n=0; n>defolt; - m_PortDefault.push_back(defolt); + // Set defaults to zero + m_PortDefault.push_back(0.0f); } UpdatePlugin(UniqueID, false); @@ -362,6 +430,12 @@ void LADSPAPlugin::StreamIn(istream &s) m_PortClamp.push_back(clamp); } + for (int n=0; ndeactivate) PlugDesc->deactivate(PlugInstHandle); PlugDesc->cleanup(PlugInstHandle); + PlugDesc = NULL; + } + + m_PluginIndex = 0; + m_InputPortCount = 0; + m_Gain = 1.0f; + m_Amped = false; + strncpy(m_Name, "None\0", 5); + strncpy(m_Maker, "None\0", 5); + + for(vector::iterator i=m_LADSPABufVec.begin(); + i!=m_LADSPABufVec.end(); i++) + { + if (*i) delete[] (*i); } + m_LADSPABufVec.clear(); + + RemoveAllInputs(); + RemoveAllOutputs(); + + m_PluginInfo.NumInputs = 0; + m_PluginInfo.NumOutputs = 0; + m_PluginInfo.PortTips.clear(); + + m_PortID.clear(); + m_PortMin.clear(); + m_PortMax.clear(); + m_PortClamp.clear(); + m_PortDefault.clear(); +} + +bool LADSPAPlugin::UpdatePlugin(unsigned long UniqueID, bool ResetPortSettings) +{ + ClearPlugin(); PlugDesc = m_LADSPAInfo.GetDescriptorByID(UniqueID, true); @@ -447,7 +560,6 @@ bool LADSPAPlugin::UpdatePlugin(unsigned long UniqueID, bool PortClampReset) } // Find number of input and output ports - m_PluginInfo.NumInputs = m_PluginInfo.NumOutputs = 0; for (unsigned long i = 0; i < PlugDesc->PortCount; i++) { if (LADSPA_IS_PORT_INPUT(PlugDesc->PortDescriptors[i])) { m_PluginInfo.NumInputs++; @@ -459,13 +571,6 @@ bool LADSPAPlugin::UpdatePlugin(unsigned long UniqueID, bool PortClampReset) ///////////////////////////////// // LADSPA Buffers - for(vector::iterator i=m_LADSPABufVec.begin(); - i!=m_LADSPABufVec.end(); i++) - { - if (*i) delete[] (*i); - } - m_LADSPABufVec.clear(); - unsigned long c=0; for (unsigned int n=0; nPortCount; n++) { @@ -498,19 +603,13 @@ bool LADSPAPlugin::UpdatePlugin(unsigned long UniqueID, bool PortClampReset) ///////////////////////////////// // SSM Buffers - // Clear i/o buffers - RemoveAllInputs(); - RemoveAllOutputs(); - - // Reallocate the i/o buffers required + // Allocate the i/o buffers required for (int n=0; nPortCount; i++) @@ -538,12 +637,8 @@ bool LADSPAPlugin::UpdatePlugin(unsigned long UniqueID, bool PortClampReset) UpdatePluginInfoWithHost(); - if (PortClampReset) + if (ResetPortSettings) { - m_PortMin.clear(); - m_PortMax.clear(); - m_PortClamp.clear(); - for (int n=0; nPortRangeHints[Port].LowerBound; } else if (LADSPA_IS_HINT_DEFAULT_MAXIMUM(HintDesc) && LADSPA_IS_HINT_BOUNDED_ABOVE(HintDesc)) { - Default=PlugDesc->PortRangeHints[Port].LowerBound; + Default=PlugDesc->PortRangeHints[Port].UpperBound; } else if (LADSPA_IS_HINT_BOUNDED_BELOW(HintDesc) && LADSPA_IS_HINT_BOUNDED_ABOVE(HintDesc)) { // These hints require both upper and lower bounds @@ -604,7 +699,26 @@ bool LADSPAPlugin::UpdatePlugin(unsigned long UniqueID, bool PortClampReset) } if (LADSPA_IS_HINT_LOGARITHMIC(HintDesc)) { - Default = exp(log(min) * lp + log(max) * up); + if (min==0.0f || max==0.0f) { + // Zero at either end means zero no matter + // where hint is at, since: + // log(n->0) -> Infinity + Default = 0.0f; + } else { + // Catch negatives + bool neg_min = min < 0.0f ? true : false; + bool neg_max = max < 0.0f ? true : false; + + if (!neg_min && !neg_max) { + Default = exp(log(min) * lp + log(max) * up); + } else if (neg_min && neg_max) { + Default = -exp(log(-min) * lp + log(-max) * up); + } else { + // Logarithmic range has asymptote + // so just use linear scale + Default = min * lp + max * up; + } + } } else { Default = min * lp + max * up; } @@ -638,6 +752,7 @@ bool LADSPAPlugin::UpdatePlugin(unsigned long UniqueID, bool PortClampReset) char *lbl_start; m_UniqueID = PlugDesc->UniqueID; + m_PluginIndex = m_LADSPAInfo.GetPluginListEntryByID(m_UniqueID) + 1; m_InputPortCount = m_PluginInfo.NumInputs; lbl_length = strlen(PlugDesc->Name); @@ -667,6 +782,8 @@ bool LADSPAPlugin::UpdatePlugin(unsigned long UniqueID, bool PortClampReset) return true; } +// Oops. Clean up. + ClearPlugin(); cerr << "Error loading LADSPA Plugin.\n"; return false; diff --git a/SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.h b/SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.h index 80e5ae7..445c3d7 100644 --- a/SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.h +++ b/SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.h @@ -67,17 +67,17 @@ public: return settings; } - enum GUICommands{NONE,SETPORTSETTINGS,SELECTPLUGIN}; + enum GUICommands{NONE,SETPORTSETTINGS,SELECTPLUGIN,CLEARPLUGIN}; private: void UpdatePortRange(void); - bool UpdatePlugin(unsigned long UniqueID, bool PortClampReset=true); + void ClearPlugin(void); + bool UpdatePlugin(unsigned long UniqueID, bool ResetPortSettings=true); void SetPortSettings(void); void LoadPluginList(void); - void * PlugHandle; const LADSPA_Descriptor * PlugDesc; vector m_LADSPABufVec; diff --git a/SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.C b/SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.C index 42ba9ad..17004d2 100644 --- a/SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.C +++ b/SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.C @@ -57,7 +57,7 @@ SpiralPluginGUI(w,h,o,ch) } // Set up widgets - m_Browser = new Fl_Choice(60,20,420,20,"Plugin:"); + m_Browser = new Fl_Choice(60,20,420,25,"Plugin:"); m_Browser->callback((Fl_Callback *)cb_Select); m_Browser->add("(None)"); @@ -66,20 +66,21 @@ SpiralPluginGUI(w,h,o,ch) { m_Browser->add(i->Name.c_str()); } + m_Browser->value(0); - m_Name = new Fl_Box(10,45,480,20,"None"); + m_Name = new Fl_Box(10,50,480,20,"None"); m_Name->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); m_Name->labelcolor(GUI_COLOUR); m_Name->labelsize(10); add(m_Name); - m_Maker = new Fl_Box(10,65,480,20,"None"); + m_Maker = new Fl_Box(10,70,480,20,"None"); m_Maker->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); m_Maker->labelcolor(GUI_COLOUR); m_Maker->labelsize(10); add(m_Maker); - m_InputScroll = new Fl_Scroll(10,105,480,150," Value Min Max Clamp? Default Port Name"); + m_InputScroll = new Fl_Scroll(10,110,480,150," Value Min Max Clamp? Default Port Name"); m_InputScroll->labelsize(12); m_InputScroll->align(FL_ALIGN_TOP_LEFT); m_InputScroll->type(Fl_Scroll::VERTICAL); @@ -171,7 +172,7 @@ void LADSPAPluginGUI::ClearPortInfo() m_InputScroll->remove(m_InputPack); delete m_InputPack; - m_InputPack = new Fl_Pack(x()+5,y()+110,460,20,""); + m_InputPack = new Fl_Pack(x()+5,y()+115,460,20,""); m_InputScroll->add(m_InputPack); m_PortOutput.clear(); @@ -233,8 +234,6 @@ void LADSPAPluginGUI::AddPortInfo(const char *Info) NewGroup->redraw(); m_InputPack->redraw(); m_InputScroll->redraw(); - - redraw(); } void LADSPAPluginGUI::UpdateValues(SpiralPlugin *o) @@ -259,9 +258,12 @@ void LADSPAPluginGUI::UpdateValues(SpiralPlugin *o) void LADSPAPluginGUI::Update(void) { + m_GUICH->GetData("GetPluginIndex", &(m_InData.PluginIndex)); m_GUICH->GetData("GetInputPortCount", &(m_InData.InputPortCount)); m_GUICH->GetData("GetInputPortValues", m_InData.InputPortValues); - + + m_Browser->value(m_InData.PluginIndex); + for (unsigned long n=0; n < m_InData.InputPortCount; n++) { UpdatePortDisplay(n, m_InData.InputPortValues[n]); } @@ -278,8 +280,14 @@ void LADSPAPluginGUI::cb_Gain(Fl_Knob* o, void* v) inline void LADSPAPluginGUI::cb_Select_i(Fl_Choice* o) { - m_GUICH->Set("SetPluginIndex",o->value()-1); - m_GUICH->SetCommand(LADSPAPlugin::SELECTPLUGIN); + if (o->value() == 0) { + // "(None)" selected + m_GUICH->SetCommand(LADSPAPlugin::CLEARPLUGIN); + } else { + // Plugin selected + m_GUICH->Set("SetPluginIndex",o->value()); + m_GUICH->SetCommand(LADSPAPlugin::SELECTPLUGIN); + } // Wait until next update for plugin to be loaded etc. m_GUICH->Wait(); @@ -300,10 +308,12 @@ inline void LADSPAPluginGUI::cb_Select_i(Fl_Choice* o) for (unsigned long n = 0; n < m_InData.InputPortCount; n++) { AddPortInfo((const char *)(m_InData.InputPortNames + n * 256)); SetPortSettings(n, m_InData.InputPortSettings[n].Min, - m_InData.InputPortSettings[n].Max, - m_InData.InputPortSettings[n].Clamp, - m_InData.InputPortSettings[n].Default); + m_InData.InputPortSettings[n].Max, + m_InData.InputPortSettings[n].Clamp, + m_InData.InputPortSettings[n].Default); } + + redraw(); } void LADSPAPluginGUI::cb_Select(Fl_Choice* o) { diff --git a/SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.h b/SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.h index 3fa7757..5a09ff4 100644 --- a/SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.h +++ b/SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.h @@ -100,6 +100,7 @@ private: struct InChannelData { + unsigned long PluginIndex; float Gain; char Name[256]; char Maker[256];