Browse Source

Added liblrdf support (Plugin classification) and SHM for sharing plugin database

master
waxfrenzy 22 years ago
parent
commit
106bbb7ed7
6 changed files with 940 additions and 601 deletions
  1. +610
    -413
      SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.C
  2. +145
    -102
      SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.h
  3. +93
    -9
      SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.C
  4. +13
    -4
      SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.h
  5. +64
    -59
      SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.C
  6. +15
    -14
      SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.h

+ 610
- 413
SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.C
File diff suppressed because it is too large
View File


+ 145
- 102
SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.h View File

@@ -1,28 +1,31 @@
/*
LADSPAInfo.h - Header file for LADSPA Plugin info class
Copyright (C) 2002 Mike Rawes
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
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
*/
//
// LADSPAInfo.h - Header file for LADSPA Plugin info class
//
// Copyleft (C) 2002 Mike Rawes <myk@waxfrenzy.org>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// 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
//

#ifndef __ladspa_info_h__
#define __ladspa_info_h__

#include <config.h>

#include <string>
#include <vector>
#include <list>
#include <map>
#include <ladspa.h>

@@ -33,124 +36,164 @@ public:
// Also examine supplied path list
// For all paths, add basic plugin information for later lookup,
// instantiation and so on.
LADSPAInfo(bool override, const char *path_list);
LADSPAInfo(bool override = false, const char *path_list = "");

// Unload all loaded plugins and clean up
~LADSPAInfo();
~LADSPAInfo();

// ************************************************************************
// Loading/Unloading plugin libraries
//
// At first, no library dlls are loaded.
//
// Each library has an associated reference count, which is initially 0.
// As descriptors are requested, using GetDescriptorByID, this count
// is incremented. The library dll is loaded on the first request.
// At descriptors are discarded, the count is decremented, and when this
// reaches 0, the library is unloaded.
// A plugin library may have more than one plugin descriptor. The
// descriptor is used to instantiate, activate, execute plugin instances.
// Administration of plugin instances are outwith the scope of this class,
// instead, descriptors are requested using GetDecriptorByID, and disposed
// of using DiscardDescriptorByID.
//
// Each library keeps a reference count of descriptors requested. A library
// is loaded when a descriptor is requested for the first time, and remains
// loaded until the number of discards matches the number of requests.

// Rescan all paths in $LADSPA_PATH, as per constructor.
// This will also unload all libraries, and make any descriptors that
// have not been discarded with DiscardDescriptorByID invalid.
void RescanPlugins(void);
void RescanPlugins(void);

// Unload all dlopened libraries. This will make any descriptors that
// have not been discarded with DiscardDescriptorByID invalid.
void UnloadAllLibraries(void);
void UnloadAllLibraries(void);

// Get descriptor of plugin with given ID. This increments the descriptor
// count for the corresponding library.
const LADSPA_Descriptor *GetDescriptorByID(unsigned long unique_id);
const LADSPA_Descriptor *GetDescriptorByID(unsigned long unique_id);

// Notify that a descriptor corresponding to the given ID has been
// discarded. This decrements the descriptor count for the corresponding
// library.
void DiscardDescriptorByID(unsigned long unique_id);

// Get unique ID of plugin identified by given library filename and label.
unsigned long GetIDFromFilenameAndLabel(std::string filename,
std::string label);
void DiscardDescriptorByID(unsigned long unique_id);

struct PluginEntry
{
unsigned long UniqueID;
std::string Name;
};
// ************************************************************************
// SSM Specific options

// Get a list of plugins ordered by name (duplicate names are
// appended with a (number)
const std::vector<PluginEntry> GetPluginList(void);
// Get unique ID of plugin identified by given library filename and label.
// This is for backwards compatibility with older versions of SSM where the
// path and label of the plugin was stored in the configuration - current
// versions store the Unique ID
unsigned long GetIDFromFilenameAndLabel(std::string filename,
std::string label);

// Struct for plugin information returned by queries
struct PluginEntry
{
unsigned int Depth;
unsigned long UniqueID;
std::string Name;

bool operator<(const PluginEntry& pe)
{
return (Name<pe.Name);
}
};

// Get ordered list of plugin names and IDs for plugin menu
const std::vector<PluginEntry> GetMenuList(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);
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; }

void PrintInfo(void);
unsigned long GetMaxInputPortCount(void) { return m_MaxInputPortCount; }

private:
void CleanUp(void);
void ScanPathList(const char *path_list,
void (LADSPAInfo::*ExamineFunc)(const std::string,
const std::string));
void ExaminePluginLibrary(const std::string path,
const std::string basename);
// See LADSPAInfo.C for comments on these functions
void DescendGroup(std::string prefix,
const std::string group,
unsigned int depth);
std::list<std::string> GetSubGroups(const std::string group);

void CleanUp(void);
void ScanPathList(const char *path_list,
void (LADSPAInfo::*ExamineFunc)(const std::string,
const std::string));
void ExaminePluginLibrary(const std::string path,
const std::string basename);

bool CheckPlugin(const LADSPA_Descriptor *desc);
LADSPA_Descriptor_Function GetDescriptorFunctionForLibrary(unsigned long library_index);
#ifdef HAVE_LIBLRDF
void ExamineRDFFile(const std::string path,
const std::string basename);
void ExamineRDFFile(const std::string path,
const std::string basename);
void MetadataRDFDescend(const char *uri,
unsigned long parent);
#endif

bool CheckPlugin(const LADSPA_Descriptor *desc);
LADSPA_Descriptor_Function GetDescriptorFunctionForLibrary(unsigned long library_index);

struct LibraryInfo
{
unsigned long PathIndex; // Index of path in m_Paths
std::string Basename; // Filename
unsigned long RefCount; // Count of descriptors requested from library
void *Handle; // DLL Handle, NULL
};

struct PluginInfo
{
unsigned long LibraryIndex; // Index of library in m_Libraries
unsigned long Index; // Plugin index in library
const LADSPA_Descriptor *Descriptor; // Descriptor, NULL
};

typedef std::map<unsigned long,
unsigned long,
std::less<unsigned long> > IDMap;

typedef std::map<std::string,
unsigned long,
std::less<std::string> > StringMap;

// For sorting vectors of PluginEntries
struct PluginEntrySortAsc
{
bool operator()(const PluginEntry &begin, const PluginEntry &end)
{
return begin.Name < end.Name;
}
};

bool m_LADSPAPathOverride;
char *m_ExtraPaths;

std::vector<std::string> m_Paths;
std::vector<LibraryInfo> m_Libraries;
std::vector<PluginInfo> m_Plugins;

IDMap m_IDLookup;
StringMap m_FilenameLookup;

std::vector<PluginEntry> m_OrderedPluginList;

unsigned long m_MaxInputPortCount;
// For cached library information
struct LibraryInfo
{
unsigned long PathIndex; // Index of path in m_Paths
std::string Basename; // Filename
unsigned long RefCount; // Count of descriptors requested
void *Handle; // DLL Handle, NULL
};

// For cached plugin information
struct PluginInfo
{
unsigned long LibraryIndex; // Index of library in m_Libraries
unsigned long Index; // Plugin index in library
unsigned long UniqueID; // Unique ID
std::string Label; // Plugin label
std::string Name; // Plugin Name
const LADSPA_Descriptor *Descriptor; // Descriptor, NULL
};

// For cached RDF uri information
struct RDFURIInfo
{
std::string URI; // Full URI for use with lrdf
std::string Label; // Label
std::vector<unsigned long> Parents; // Index of parents in m_RDFURIs
std::vector<unsigned long> Children; // Indices of children in m_RDFURIs
std::vector<unsigned long> Plugins; // Indices of plugins in m_Plugins
};

// Lookup maps
typedef std::map<unsigned long,
unsigned long,
std::less<unsigned long> > IDMap;

typedef std::map<std::string,
unsigned long,
std::less<std::string> > StringMap;

bool m_LADSPAPathOverride;
char *m_ExtraPaths;

// LADSPA Plugin information database
std::vector<std::string> m_Paths;
std::vector<LibraryInfo> m_Libraries;
std::vector<PluginInfo> m_Plugins;

// Plugin lookup maps
IDMap m_IDLookup;

// RDF URI database
std::vector<RDFURIInfo> m_RDFURIs;

// RDF URI lookup map
StringMap m_RDFURILookup;

// RDF Label lookup map
StringMap m_RDFLabelLookup;

// SSM specific data
std::vector<PluginEntry> m_SSMMenuList;
StringMap m_FilenameLookup;
unsigned long m_MaxInputPortCount;
};

#endif // __ladspa_info_h__

+ 93
- 9
SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.C View File

@@ -1,5 +1,7 @@
/* SpiralSound
/* LADSPAPlugin.C
* Copyleft (C) 2001 David Griffiths <dave@pawfal.org>
* LADSPA Plugin by Nicolas Noble <nicolas@nobis-crew.org>
* Modified by Mike Rawes <myk@waxfrenzy.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -20,6 +22,14 @@
#include <cstring>
#include <cmath>

#ifdef HAVE_POSIX_SHM
// All this, just for SHM
#include <unistd.h> // For ftruncate
#include <fcntl.h> // For O_CREAT, O_RDONLY etc
#include <sys/types.h> // shm_*
#include <sys/mman.h> // shm_*
#endif

#include "SpiralIcon.xpm"
#include "LADSPAPlugin.h"
#include "LADSPAPluginGUI.h"
@@ -53,7 +63,65 @@ string SpiralPlugin_GetGroupName()

LADSPAPlugin::LADSPAPlugin()
{
#ifdef HAVE_POSIX_SHM
// Share the LADSPA Database via SHM
// We keep two things: A reference counter, and a pointer to the
// database. We can get away with just a pointer as all instances
// are in the same address space (process + thread)

int shm_rc_fd;
int shm_db_fd;

shm_rc_fd = shm_open(m_SHMRefCountPath, O_RDWR, 0644);
if (shm_rc_fd > 0) {
// Got an existing refcount
m_SHMRefCount = (unsigned long *)mmap(0, sizeof(unsigned long), PROT_READ | PROT_WRITE, MAP_SHARED,
shm_rc_fd, 0);

(*m_SHMRefCount)++;

shm_db_fd = shm_open(m_SHMLDBPath, O_RDONLY, 0644);
if (shm_db_fd > 0) {
// Got LADSPA Database
m_SHMLDB = (LADSPAInfo **)mmap(0, sizeof(LADSPAInfo *), PROT_READ, MAP_SHARED,
shm_db_fd, 0);

m_LADSPAInfo = *m_SHMLDB;
} else {
std::cerr << "LADSPAPlugin: ERROR: Could not open SHM file '" << m_SHMLDBPath << std::cerr;
}
} else {
// Need to create a new SHM file for ref counter
shm_rc_fd = shm_open(m_SHMRefCountPath, O_CREAT | O_RDWR, 0644);
if (shm_rc_fd > 0) {
ftruncate(shm_rc_fd, sizeof(unsigned long));
m_SHMRefCount = (unsigned long *)mmap(0, sizeof(unsigned long), PROT_READ | PROT_WRITE, MAP_SHARED,
shm_rc_fd, 0);

// Initilise to 1 (this instance)
*m_SHMRefCount = 1;

shm_db_fd = shm_open(m_SHMLDBPath, O_CREAT | O_RDWR, 0644);
if (shm_db_fd > 0) {
// Create LADSPA Plugin Database
m_LADSPAInfo = new LADSPAInfo(false, "");

ftruncate(shm_db_fd, sizeof(LADSPAInfo *));
m_SHMLDB = (LADSPAInfo **)mmap(0, sizeof(LADSPAInfo *), PROT_READ | PROT_WRITE, MAP_SHARED,
shm_db_fd, 0);

*m_SHMLDB = m_LADSPAInfo;
} else {
std::cerr << "LADSPAPlugin: ERROR: Could not create SHM file '" << m_SHMLDBPath << "'" << std::endl;
}
} else {
std::cerr << "LADSPAPlugin: ERROR: Could not create SHM file '" << m_SHMRefCountPath << "'" << std::endl;
}
}
#else
// No POSIX SHM, just create a new database
m_LADSPAInfo = new LADSPAInfo(false, "");
#endif

m_PlugDesc = NULL;

@@ -71,7 +139,7 @@ LADSPAPlugin::LADSPAPlugin()
m_MaxInputPortCount = m_LADSPAInfo->GetMaxInputPortCount();

// For receiving from GUI
m_AudioCH->RegisterData("SetPluginIndex", ChannelHandler::INPUT,&(m_InData.PluginIndex), sizeof(m_InData.PluginIndex));
m_AudioCH->RegisterData("SetUniqueID", ChannelHandler::INPUT,&(m_InData.UniqueID), sizeof(m_InData.UniqueID));
m_AudioCH->RegisterData("SetTabIndex", ChannelHandler::INPUT,&(m_InData.TabIndex), sizeof(m_InData.TabIndex));
m_AudioCH->RegisterData("SetUpdateInputs", ChannelHandler::INPUT,&(m_InData.UpdateInputs),sizeof(m_InData.UpdateInputs));
m_AudioCH->RegisterData("SetInputPortIndex", ChannelHandler::INPUT, &(m_InData.InputPortIndex), sizeof(m_InData.InputPortIndex));
@@ -93,13 +161,14 @@ LADSPAPlugin::LADSPAPlugin()

if (m_OutData.InputPortNames &&
m_OutData.InputPortDefaults &&
m_OutData.InputPortSettings) {
m_OutData.InputPortSettings &&
m_OutData.InputPortValues) {
m_AudioCH->RegisterData("GetInputPortNames", ChannelHandler::OUTPUT, m_OutData.InputPortNames, 256 * m_MaxInputPortCount);
m_AudioCH->RegisterData("GetInputPortSettings", ChannelHandler::OUTPUT, m_OutData.InputPortSettings, sizeof(PortSettings) * m_MaxInputPortCount);
m_AudioCH->RegisterData("GetInputPortValues", ChannelHandler::OUTPUT, m_OutData.InputPortValues, sizeof(PortValues) * m_MaxInputPortCount);
m_AudioCH->RegisterData("GetInputPortDefaults", ChannelHandler::OUTPUT, m_OutData.InputPortDefaults, sizeof(float) * m_MaxInputPortCount);
} else {
cerr<<"Memory allocation error"<<endl;
cerr<<"LADSPA Plugin: Memory allocation error"<<endl;
}
}

@@ -114,7 +183,25 @@ LADSPAPlugin::~LADSPAPlugin()
if (m_OutData.InputPortValues) free(m_OutData.InputPortValues);
if (m_OutData.InputPortDefaults) free(m_OutData.InputPortDefaults);

#ifdef HAVE_POSIX_SHM
// Clean up SHM things
(*m_SHMRefCount)--;
if ((*m_SHMRefCount) == 0) {
// Last instance, so unmap and unlink
munmap(m_SHMRefCount, sizeof(unsigned long));
shm_unlink(m_SHMRefCountPath);
munmap(m_SHMLDB, sizeof(LADSPAInfo *));
shm_unlink(m_SHMLDBPath);
// Delete the database itself
delete m_LADSPAInfo;
} else {
// Other instances still out there, so just unmap
munmap(m_SHMRefCount, sizeof(unsigned long));
munmap(m_SHMLDB, sizeof(LADSPAInfo *));
}
#else
delete m_LADSPAInfo;
#endif
}

PluginInfo &LADSPAPlugin::Initialise(const HostInfo *Host)
@@ -128,7 +215,7 @@ PluginInfo &LADSPAPlugin::Initialise(const HostInfo *Host)
SpiralGUIType *LADSPAPlugin::CreateGUI()
{
return new LADSPAPluginGUI(m_PluginInfo.Width, m_PluginInfo.Height,
this, m_AudioCH, m_HostInfo, m_LADSPAInfo->GetPluginList());
this, m_AudioCH, m_HostInfo, m_LADSPAInfo->GetMenuList());
}

void LADSPAPlugin::Execute()
@@ -205,8 +292,7 @@ void LADSPAPlugin::ExecuteCommands()
break;
case (SELECTPLUGIN):
{
vector<LADSPAInfo::PluginEntry> pe = m_LADSPAInfo->GetPluginList();
UpdatePlugin(pe[m_InData.PluginIndex - 1].UniqueID);
UpdatePlugin(m_InData.UniqueID);
}
break;
case (CLEARPLUGIN):
@@ -857,7 +943,6 @@ bool LADSPAPlugin::SelectPlugin(unsigned long UniqueID)
UpdatePluginInfoWithHost();

m_UniqueID = m_PlugDesc->UniqueID;
m_PluginIndex = m_LADSPAInfo->GetPluginListEntryByID(m_UniqueID) + 1;
m_InputPortCount = m_PluginInfo.NumInputs;

int lbl_length;
@@ -891,7 +976,6 @@ void LADSPAPlugin::ClearPlugin(void)
m_TabIndex = 1;
m_UpdateInputs = true;
m_UniqueID = 0;
m_PluginIndex = 0;
m_InputPortCount = 0;
strncpy(m_Name, "None\0", 5);
strncpy(m_Maker, "None\0", 5);


+ 13
- 4
SpiralSound/Plugins/LADSPAPlugin/LADSPAPlugin.h View File

@@ -1,5 +1,7 @@
/* SpiralSound
/* LADSPAPlugin.h
* Copyleft (C) 2001 David Griffiths <dave@pawfal.org>
* LADSPA Plugin by Nicolas Noble <nicolas@nobis-crew.org>
* Modified by Mike Rawes <myk@waxfrenzy.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -40,7 +42,7 @@ struct PortValues
class LADSPAPlugin : public SpiralPlugin
{
public:
LADSPAPlugin();
LADSPAPlugin();
virtual ~LADSPAPlugin();

virtual PluginInfo &Initialise(const HostInfo *Host);
@@ -50,7 +52,7 @@ public:
virtual void StreamOut(ostream &s);
virtual void StreamIn(istream &s);

unsigned long GetPluginIndex() { return m_PluginIndex; }
unsigned long GetUniqueID() { return m_UniqueID; }
const char *GetName() { return (const char *)m_Name; }
const char *GetMaker() { return (const char *)m_Maker; }
int GetTabIndex() { return m_TabIndex; }
@@ -130,7 +132,7 @@ private:
// Data received from GUI
struct InputChannelData
{
unsigned long PluginIndex;
unsigned long UniqueID;
int TabIndex;
bool UpdateInputs;
unsigned long InputPortIndex;
@@ -142,6 +144,13 @@ private:

OutputChannelData m_OutData;
InputChannelData m_InData;

// SHM stuff - for sharing the LADSPA Plugin database
static const char * const m_SHMRefCountPath = "/SpiralSynthModular-LADSPAPlugin-RefCount";
static const char * const m_SHMLDBPath = "/SpiralSynthModular-LADSPAPlugin-Database";

unsigned long *m_SHMRefCount;
LADSPAInfo **m_SHMLDB;
};

#endif // __ladspa_plugin_h__

+ 64
- 59
SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.C View File

@@ -1,6 +1,7 @@
/* SpiralPlugin
/* LADSPAPluginGUI.C
* Copyleft (C) 2000 David Griffiths <dave@pawfal.org>
* LADSPA Plugin by Nicolas Noble <nicolas@nobis-crew.org>
* Modified by Mike Rawes <myk@waxfrenzy.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -37,8 +38,8 @@ LADSPAPluginGUI::LADSPAPluginGUI(int w, int h,
const vector<LADSPAInfo::PluginEntry> &PVec) :
SpiralPluginGUI(w,h,o,ch)
{
m_GUIColour = (Fl_Color)Info->GUI_COLOUR;
m_PluginList = PVec;
m_GUIColour = (Fl_Color)Info->GUI_COLOUR;
m_PluginList = PVec;

int Width=20;
int Height=100;
@@ -54,7 +55,7 @@ SpiralPluginGUI(w,h,o,ch)

if (!(m_InputPortNames && m_InputPortSettings &&
m_InputPortValues && m_InputPortDefaults)) {
cerr<<"Memory allocation error\n"<<endl;
cerr<<"LADSPA Plugin (GUI): Memory allocation error\n"<<endl;
}

// Set up widgets
@@ -76,7 +77,7 @@ SpiralPluginGUI(w,h,o,ch)
add(m_Tab);

m_ControlGroup = new Fl_Group (5, 80, 490, 230, "Control");
m_ControlGroup->box (FL_PLASTIC_UP_BOX);
m_ControlGroup->box (FL_PLASTIC_UP_BOX);
m_ControlGroup->labelsize(12);

m_ControlScroll = new Fl_Scroll (10, 85, 480, 220, "");
@@ -88,7 +89,7 @@ SpiralPluginGUI(w,h,o,ch)
m_ControlScroll->add(m_ControlPack);

m_SetupGroup = new Fl_Group (5, 80, 490, 230, "Setup");
m_SetupGroup->box (FL_PLASTIC_UP_BOX);
m_SetupGroup->box (FL_PLASTIC_UP_BOX);
m_SetupGroup->labelsize(12);

m_Browser = new Fl_Choice(50,85,440,22,"Plugin:");
@@ -97,37 +98,32 @@ SpiralPluginGUI(w,h,o,ch)
m_Browser->callback((Fl_Callback *)cb_Select);

m_Browser->add("(None)");
m_PluginIDLookup.push_back(0);

for (vector<LADSPAInfo::PluginEntry>::iterator i=m_PluginList.begin();
// The plugin list is already formatted for addition to our drop-down,
// so just add all items as they are
unsigned long size = m_Browser->size();
int depth = 1;

for (vector<LADSPAInfo::PluginEntry>::iterator i=m_PluginList.begin();
i!=m_PluginList.end(); i++)
{
unsigned long len = i->Name.length();
unsigned long esc_count = 0;
const char *tmp = i->Name.c_str();
char *dest;
m_Browser->add(i->Name.c_str());

for (unsigned long c = 0; c < len; c++) {
if (tmp[c] == '/') esc_count++;
}
unsigned int dsize = m_Browser->size() - size;
int ddepth = i->Depth - depth;

dest = (char *)malloc(len + 1 + esc_count);

if (dest) {
unsigned long d = 0;
for (unsigned long c = 0; c < len; c++, d++) {
if (tmp[c] == '/' || tmp[c] == '|') {
dest[d] = '\\';
d++;
dest[d] = tmp[c];
} else {
dest[d] = tmp[c];
}
}
dest[len + esc_count] = '\0';
m_Browser->add(dest);
free(dest);
size = m_Browser->size();
depth = i->Depth;

// Add blanks to ID Lookup vector to account for sub-menus
for (unsigned long j = 1; j < (dsize - ddepth); j++) {
m_PluginIDLookup.push_back(0);
}
}
// Add to ID Lookup vector (this maps Menu Items to Unique IDs)
m_PluginIDLookup.push_back(i->UniqueID);
}

m_Browser->value(0);

m_SetupGroup->add(m_Browser);
@@ -143,29 +139,29 @@ SpiralPluginGUI(w,h,o,ch)

m_SetupGroup->add(m_InputScroll);

m_ValueLabel = new Fl_Box(15,115,60,15,"Value");
m_ValueLabel = new Fl_Box(15,115,60,15,"Value");
m_ValueLabel->labelsize(12);
m_SetupGroup->add(m_ValueLabel);
m_SetupGroup->add(m_ValueLabel);

m_DefaultLabel = new Fl_Box(77,115,60,15,"Default");
m_DefaultLabel = new Fl_Box(77,115,60,15,"Default");
m_DefaultLabel->labelsize(12);
m_SetupGroup->add(m_DefaultLabel);
m_SetupGroup->add(m_DefaultLabel);

m_MinLabel = new Fl_Box(139,115,60,15,"Min");
m_MinLabel = new Fl_Box(139,115,60,15,"Min");
m_MinLabel->labelsize(12);
m_SetupGroup->add(m_MinLabel);
m_SetupGroup->add(m_MinLabel);

m_MaxLabel = new Fl_Box(201,115,60,15,"Max");
m_MaxLabel = new Fl_Box(201,115,60,15,"Max");
m_MaxLabel->labelsize(12);
m_SetupGroup->add(m_MaxLabel);
m_SetupGroup->add(m_MaxLabel);

m_ClampLabel = new Fl_Box(280,115,10,15,"Clamp?");
m_ClampLabel = new Fl_Box(280,115,10,15,"Clamp?");
m_ClampLabel->labelsize(12);
m_SetupGroup->add(m_ClampLabel);
m_SetupGroup->add(m_ClampLabel);

m_PortLabel = new Fl_Box(325,115,60,15,"Port Name");
m_PortLabel = new Fl_Box(325,115,60,15,"Port Name");
m_PortLabel->labelsize(12);
m_SetupGroup->add(m_PortLabel);
m_SetupGroup->add(m_PortLabel);

m_UpdateInputs = new Fl_LED_Button (10, 282, 25, 25, "Update input values?");
m_UpdateInputs->labelsize(12);
@@ -190,6 +186,9 @@ LADSPAPluginGUI::~LADSPAPluginGUI(void)
if (m_InputPortSettings) free(m_InputPortSettings);
if (m_InputPortValues) free(m_InputPortValues);
if (m_InputPortDefaults) free(m_InputPortDefaults);

m_PluginIDLookup.clear();

Fl::check();
}

@@ -243,7 +242,7 @@ void LADSPAPluginGUI::UpdateDefaultAdjustControls(void)
void LADSPAPluginGUI::UpdateValues(SpiralPlugin *o)
{
LADSPAPlugin* Plugin = (LADSPAPlugin*)o;
SetPluginIndex(Plugin->GetPluginIndex());
SetUniqueID(Plugin->GetUniqueID());
SetName(Plugin->GetName());
SetMaker(Plugin->GetMaker());
SetTabIndex(Plugin->GetTabIndex());
@@ -336,10 +335,17 @@ void LADSPAPluginGUI::SetUpdateInputs(bool state)
m_UpdateInputs->value(m_UpdateInputState);
}

void LADSPAPluginGUI::SetPluginIndex(unsigned long n)
void LADSPAPluginGUI::SetUniqueID(unsigned long n)
{
m_PluginIndex = n;
m_Browser->value(m_PluginIndex);
m_UniqueID = n;

vector<unsigned long>::iterator i = std::find(m_PluginIDLookup.begin(), m_PluginIDLookup.end(), m_UniqueID);

if (i != m_PluginIDLookup.end()) {
m_Browser->value(i - m_PluginIDLookup.begin());
} else {
m_Browser->value(0);
}
}

void LADSPAPluginGUI::SetName(const char *s)
@@ -529,7 +535,6 @@ void LADSPAPluginGUI::Update(void)

void LADSPAPluginGUI::ClearPlugin(void)
{
m_PluginIndex = 0;
m_InputPortCount = 0;
m_PortIndex = 0;

@@ -573,22 +578,22 @@ void LADSPAPluginGUI::SelectPlugin(void)
m_GUICH->GetData("GetInputPortSettings", m_InputPortSettings);
m_GUICH->GetData("GetInputPortDefaults", m_InputPortDefaults);

SetName((const char *)m_Name);
SetName((const char *)m_Name);
SetMaker((const char *)m_Maker);

for (unsigned long p = 0; p < m_InputPortCount; p++) {
AddPortInfo((const char *)(m_InputPortNames + p * 256));
SetPortSettings(p, m_InputPortSettings[p].Min,
m_InputPortSettings[p].Max,
m_InputPortSettings[p].Clamp,
m_InputPortDefaults[p]);
m_InputPortSettings[p].Max,
m_InputPortSettings[p].Clamp,
m_InputPortDefaults[p]);

SetDefaultAdjust(p);
}

UpdateDefaultAdjustControls();
m_PortIndex = m_InputPortCount;
redraw();
}

@@ -612,15 +617,15 @@ inline void LADSPAPluginGUI::cb_Select_i(Fl_Choice* o)
{
ClearPlugin();

m_PluginIndex = o->value();
unsigned long m_UniqueID = m_PluginIDLookup[o->value()];

if (m_PluginIndex != 0) {
// Plugin selected
m_GUICH->SetData("SetPluginIndex",&m_PluginIndex);
if (m_UniqueID != 0) {
// Plugin selected
m_GUICH->SetData("SetUniqueID",&m_UniqueID);
m_GUICH->SetCommand(LADSPAPlugin::SELECTPLUGIN);
m_GUICH->Wait();
m_GUICH->Wait();
}
SelectPlugin();
SelectPlugin();

// redraw();
}


+ 15
- 14
SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.h View File

@@ -1,5 +1,7 @@
/* SpiralPlugin
/* LADSPAPluginGUI.h
* Copyleft (C) 2000 David Griffiths <dave@pawfal.org>
* LADSPA Plugin by Nicolas Noble <nicolas@nobis-crew.org>
* Modified by Mike Rawes <myk@waxfrenzy.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -63,7 +65,7 @@ private:
void AddPortInfo(const char *Info);
void SetTabIndex(int index);
void SetUpdateInputs(bool state);
void SetPluginIndex(unsigned long n);
void SetUniqueID(unsigned long n);
void SetName(const char *s);
void SetMaker(const char *s);
void SetPortSettings(unsigned long n, float min, float max, bool clamp, float defolt);
@@ -72,8 +74,8 @@ private:
void ClearPlugin(void);
void SelectPlugin(void);

Fl_Color m_GUIColour;
Fl_Box *m_NameLabel;
Fl_Color m_GUIColour;
Fl_Box *m_NameLabel;
Fl_Box *m_MakerLabel;
Fl_Tabs *m_Tab;
Fl_Group *m_ControlGroup;
@@ -82,12 +84,12 @@ private:
Fl_Group *m_SetupGroup;
Fl_Choice *m_Browser;

Fl_Box *m_ValueLabel;
Fl_Box *m_DefaultLabel;
Fl_Box *m_MinLabel;
Fl_Box *m_MaxLabel;
Fl_Box *m_ClampLabel;
Fl_Box *m_PortLabel;
Fl_Box *m_ValueLabel;
Fl_Box *m_DefaultLabel;
Fl_Box *m_MinLabel;
Fl_Box *m_MaxLabel;
Fl_Box *m_ClampLabel;
Fl_Box *m_PortLabel;

Fl_Scroll *m_InputScroll;
Fl_Pack *m_InputPack;
@@ -101,6 +103,7 @@ private:
std::vector<char *> m_PortDefaultAdjustLabels;

std::vector<LADSPAInfo::PluginEntry> m_PluginList;
std::vector<unsigned long> m_PluginIDLookup;

unsigned long m_PortIndex;
float m_Default;
@@ -108,7 +111,7 @@ private:
float m_Max;
bool m_Clamp;

unsigned long m_PluginIndex;
unsigned long m_UniqueID;
int m_TabIndex;
bool m_UpdateInputState;
char m_Name[256];
@@ -120,7 +123,7 @@ private:
PortValues *m_InputPortValues;
float *m_InputPortDefaults;

inline void cb_TabChange_i(Fl_Tabs *o);
inline void cb_TabChange_i(Fl_Tabs *o);
static void cb_TabChange(Fl_Tabs *o);
inline void cb_Select_i(Fl_Choice* o);
static void cb_Select(Fl_Choice* o);
@@ -138,6 +141,4 @@ private:
static void cb_DefaultAdjust(Fl_Knob *o);
};



#endif // __ladspa_plugin_gui_h__

Loading…
Cancel
Save