| @@ -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; | ||||
| } | } | ||||
| @@ -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 | ||||
| @@ -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); | |||||
| } | |||||
| @@ -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 | |||||
| }; | }; | ||||