@@ -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__ | #ifndef __ladspa_info_h__ | ||||
#define __ladspa_info_h__ | #define __ladspa_info_h__ | ||||
#include <config.h> | |||||
#include <string> | #include <string> | ||||
#include <vector> | #include <vector> | ||||
#include <list> | |||||
#include <map> | #include <map> | ||||
#include <ladspa.h> | #include <ladspa.h> | ||||
@@ -33,124 +36,164 @@ public: | |||||
// Also examine supplied path list | // Also examine supplied path list | ||||
// For all paths, add basic plugin information for later lookup, | // For all paths, add basic plugin information for later lookup, | ||||
// instantiation and so on. | // 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 | // Unload all loaded plugins and clean up | ||||
~LADSPAInfo(); | |||||
~LADSPAInfo(); | |||||
// ************************************************************************ | // ************************************************************************ | ||||
// Loading/Unloading plugin libraries | // Loading/Unloading plugin libraries | ||||
// | // | ||||
// At first, no library dlls are loaded. | // 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. | // Rescan all paths in $LADSPA_PATH, as per constructor. | ||||
// This will also unload all libraries, and make any descriptors that | // This will also unload all libraries, and make any descriptors that | ||||
// have not been discarded with DiscardDescriptorByID invalid. | // have not been discarded with DiscardDescriptorByID invalid. | ||||
void RescanPlugins(void); | |||||
void RescanPlugins(void); | |||||
// Unload all dlopened libraries. This will make any descriptors that | // Unload all dlopened libraries. This will make any descriptors that | ||||
// have not been discarded with DiscardDescriptorByID invalid. | // have not been discarded with DiscardDescriptorByID invalid. | ||||
void UnloadAllLibraries(void); | |||||
void UnloadAllLibraries(void); | |||||
// Get descriptor of plugin with given ID. This increments the descriptor | // Get descriptor of plugin with given ID. This increments the descriptor | ||||
// count for the corresponding library. | // 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 | // Notify that a descriptor corresponding to the given ID has been | ||||
// discarded. This decrements the descriptor count for the corresponding | // discarded. This decrements the descriptor count for the corresponding | ||||
// library. | // 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 | // Get the index in the above list for given Unique ID | ||||
// If not found, this returns the size of the above list | // 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 | // Get the number of input ports for the plugin with the most | ||||
// input ports | // input ports | ||||
unsigned long GetMaxInputPortCount(void) { return m_MaxInputPortCount; } | |||||
void PrintInfo(void); | |||||
unsigned long GetMaxInputPortCount(void) { return m_MaxInputPortCount; } | |||||
private: | 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 | #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 | #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__ | #endif // __ladspa_info_h__ |
@@ -1,5 +1,7 @@ | |||||
/* SpiralSound | |||||
/* LADSPAPlugin.C | |||||
* Copyleft (C) 2001 David Griffiths <dave@pawfal.org> | * 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 | * 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 | * it under the terms of the GNU General Public License as published by | ||||
@@ -20,6 +22,14 @@ | |||||
#include <cstring> | #include <cstring> | ||||
#include <cmath> | #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 "SpiralIcon.xpm" | ||||
#include "LADSPAPlugin.h" | #include "LADSPAPlugin.h" | ||||
#include "LADSPAPluginGUI.h" | #include "LADSPAPluginGUI.h" | ||||
@@ -53,7 +63,65 @@ string SpiralPlugin_GetGroupName() | |||||
LADSPAPlugin::LADSPAPlugin() | 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, ""); | m_LADSPAInfo = new LADSPAInfo(false, ""); | ||||
#endif | |||||
m_PlugDesc = NULL; | m_PlugDesc = NULL; | ||||
@@ -71,7 +139,7 @@ LADSPAPlugin::LADSPAPlugin() | |||||
m_MaxInputPortCount = m_LADSPAInfo->GetMaxInputPortCount(); | m_MaxInputPortCount = m_LADSPAInfo->GetMaxInputPortCount(); | ||||
// For receiving from GUI | // 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("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("SetUpdateInputs", ChannelHandler::INPUT,&(m_InData.UpdateInputs),sizeof(m_InData.UpdateInputs)); | ||||
m_AudioCH->RegisterData("SetInputPortIndex", ChannelHandler::INPUT, &(m_InData.InputPortIndex), sizeof(m_InData.InputPortIndex)); | m_AudioCH->RegisterData("SetInputPortIndex", ChannelHandler::INPUT, &(m_InData.InputPortIndex), sizeof(m_InData.InputPortIndex)); | ||||
@@ -93,13 +161,14 @@ LADSPAPlugin::LADSPAPlugin() | |||||
if (m_OutData.InputPortNames && | if (m_OutData.InputPortNames && | ||||
m_OutData.InputPortDefaults && | 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("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("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("GetInputPortValues", ChannelHandler::OUTPUT, m_OutData.InputPortValues, sizeof(PortValues) * m_MaxInputPortCount); | ||||
m_AudioCH->RegisterData("GetInputPortDefaults", ChannelHandler::OUTPUT, m_OutData.InputPortDefaults, sizeof(float) * m_MaxInputPortCount); | m_AudioCH->RegisterData("GetInputPortDefaults", ChannelHandler::OUTPUT, m_OutData.InputPortDefaults, sizeof(float) * m_MaxInputPortCount); | ||||
} else { | } 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.InputPortValues) free(m_OutData.InputPortValues); | ||||
if (m_OutData.InputPortDefaults) free(m_OutData.InputPortDefaults); | 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; | delete m_LADSPAInfo; | ||||
#endif | |||||
} | } | ||||
PluginInfo &LADSPAPlugin::Initialise(const HostInfo *Host) | PluginInfo &LADSPAPlugin::Initialise(const HostInfo *Host) | ||||
@@ -128,7 +215,7 @@ PluginInfo &LADSPAPlugin::Initialise(const HostInfo *Host) | |||||
SpiralGUIType *LADSPAPlugin::CreateGUI() | SpiralGUIType *LADSPAPlugin::CreateGUI() | ||||
{ | { | ||||
return new LADSPAPluginGUI(m_PluginInfo.Width, m_PluginInfo.Height, | 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() | void LADSPAPlugin::Execute() | ||||
@@ -205,8 +292,7 @@ void LADSPAPlugin::ExecuteCommands() | |||||
break; | break; | ||||
case (SELECTPLUGIN): | case (SELECTPLUGIN): | ||||
{ | { | ||||
vector<LADSPAInfo::PluginEntry> pe = m_LADSPAInfo->GetPluginList(); | |||||
UpdatePlugin(pe[m_InData.PluginIndex - 1].UniqueID); | |||||
UpdatePlugin(m_InData.UniqueID); | |||||
} | } | ||||
break; | break; | ||||
case (CLEARPLUGIN): | case (CLEARPLUGIN): | ||||
@@ -857,7 +943,6 @@ bool LADSPAPlugin::SelectPlugin(unsigned long UniqueID) | |||||
UpdatePluginInfoWithHost(); | UpdatePluginInfoWithHost(); | ||||
m_UniqueID = m_PlugDesc->UniqueID; | m_UniqueID = m_PlugDesc->UniqueID; | ||||
m_PluginIndex = m_LADSPAInfo->GetPluginListEntryByID(m_UniqueID) + 1; | |||||
m_InputPortCount = m_PluginInfo.NumInputs; | m_InputPortCount = m_PluginInfo.NumInputs; | ||||
int lbl_length; | int lbl_length; | ||||
@@ -891,7 +976,6 @@ void LADSPAPlugin::ClearPlugin(void) | |||||
m_TabIndex = 1; | m_TabIndex = 1; | ||||
m_UpdateInputs = true; | m_UpdateInputs = true; | ||||
m_UniqueID = 0; | m_UniqueID = 0; | ||||
m_PluginIndex = 0; | |||||
m_InputPortCount = 0; | m_InputPortCount = 0; | ||||
strncpy(m_Name, "None\0", 5); | strncpy(m_Name, "None\0", 5); | ||||
strncpy(m_Maker, "None\0", 5); | strncpy(m_Maker, "None\0", 5); | ||||
@@ -1,5 +1,7 @@ | |||||
/* SpiralSound | |||||
/* LADSPAPlugin.h | |||||
* Copyleft (C) 2001 David Griffiths <dave@pawfal.org> | * 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 | * 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 | * it under the terms of the GNU General Public License as published by | ||||
@@ -40,7 +42,7 @@ struct PortValues | |||||
class LADSPAPlugin : public SpiralPlugin | class LADSPAPlugin : public SpiralPlugin | ||||
{ | { | ||||
public: | public: | ||||
LADSPAPlugin(); | |||||
LADSPAPlugin(); | |||||
virtual ~LADSPAPlugin(); | virtual ~LADSPAPlugin(); | ||||
virtual PluginInfo &Initialise(const HostInfo *Host); | virtual PluginInfo &Initialise(const HostInfo *Host); | ||||
@@ -50,7 +52,7 @@ public: | |||||
virtual void StreamOut(ostream &s); | virtual void StreamOut(ostream &s); | ||||
virtual void StreamIn(istream &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 *GetName() { return (const char *)m_Name; } | ||||
const char *GetMaker() { return (const char *)m_Maker; } | const char *GetMaker() { return (const char *)m_Maker; } | ||||
int GetTabIndex() { return m_TabIndex; } | int GetTabIndex() { return m_TabIndex; } | ||||
@@ -130,7 +132,7 @@ private: | |||||
// Data received from GUI | // Data received from GUI | ||||
struct InputChannelData | struct InputChannelData | ||||
{ | { | ||||
unsigned long PluginIndex; | |||||
unsigned long UniqueID; | |||||
int TabIndex; | int TabIndex; | ||||
bool UpdateInputs; | bool UpdateInputs; | ||||
unsigned long InputPortIndex; | unsigned long InputPortIndex; | ||||
@@ -142,6 +144,13 @@ private: | |||||
OutputChannelData m_OutData; | OutputChannelData m_OutData; | ||||
InputChannelData m_InData; | 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__ | #endif // __ladspa_plugin_h__ |
@@ -1,6 +1,7 @@ | |||||
/* SpiralPlugin | |||||
/* LADSPAPluginGUI.C | |||||
* Copyleft (C) 2000 David Griffiths <dave@pawfal.org> | * Copyleft (C) 2000 David Griffiths <dave@pawfal.org> | ||||
* LADSPA Plugin by Nicolas Noble <nicolas@nobis-crew.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 | * 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 | * 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) : | const vector<LADSPAInfo::PluginEntry> &PVec) : | ||||
SpiralPluginGUI(w,h,o,ch) | 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 Width=20; | ||||
int Height=100; | int Height=100; | ||||
@@ -54,7 +55,7 @@ SpiralPluginGUI(w,h,o,ch) | |||||
if (!(m_InputPortNames && m_InputPortSettings && | if (!(m_InputPortNames && m_InputPortSettings && | ||||
m_InputPortValues && m_InputPortDefaults)) { | m_InputPortValues && m_InputPortDefaults)) { | ||||
cerr<<"Memory allocation error\n"<<endl; | |||||
cerr<<"LADSPA Plugin (GUI): Memory allocation error\n"<<endl; | |||||
} | } | ||||
// Set up widgets | // Set up widgets | ||||
@@ -76,7 +77,7 @@ SpiralPluginGUI(w,h,o,ch) | |||||
add(m_Tab); | add(m_Tab); | ||||
m_ControlGroup = new Fl_Group (5, 80, 490, 230, "Control"); | 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_ControlGroup->labelsize(12); | ||||
m_ControlScroll = new Fl_Scroll (10, 85, 480, 220, ""); | m_ControlScroll = new Fl_Scroll (10, 85, 480, 220, ""); | ||||
@@ -88,7 +89,7 @@ SpiralPluginGUI(w,h,o,ch) | |||||
m_ControlScroll->add(m_ControlPack); | m_ControlScroll->add(m_ControlPack); | ||||
m_SetupGroup = new Fl_Group (5, 80, 490, 230, "Setup"); | 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_SetupGroup->labelsize(12); | ||||
m_Browser = new Fl_Choice(50,85,440,22,"Plugin:"); | 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->callback((Fl_Callback *)cb_Select); | ||||
m_Browser->add("(None)"); | 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++) | 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_Browser->value(0); | ||||
m_SetupGroup->add(m_Browser); | m_SetupGroup->add(m_Browser); | ||||
@@ -143,29 +139,29 @@ SpiralPluginGUI(w,h,o,ch) | |||||
m_SetupGroup->add(m_InputScroll); | 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_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_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_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_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_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_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 = new Fl_LED_Button (10, 282, 25, 25, "Update input values?"); | ||||
m_UpdateInputs->labelsize(12); | m_UpdateInputs->labelsize(12); | ||||
@@ -190,6 +186,9 @@ LADSPAPluginGUI::~LADSPAPluginGUI(void) | |||||
if (m_InputPortSettings) free(m_InputPortSettings); | if (m_InputPortSettings) free(m_InputPortSettings); | ||||
if (m_InputPortValues) free(m_InputPortValues); | if (m_InputPortValues) free(m_InputPortValues); | ||||
if (m_InputPortDefaults) free(m_InputPortDefaults); | if (m_InputPortDefaults) free(m_InputPortDefaults); | ||||
m_PluginIDLookup.clear(); | |||||
Fl::check(); | Fl::check(); | ||||
} | } | ||||
@@ -243,7 +242,7 @@ void LADSPAPluginGUI::UpdateDefaultAdjustControls(void) | |||||
void LADSPAPluginGUI::UpdateValues(SpiralPlugin *o) | void LADSPAPluginGUI::UpdateValues(SpiralPlugin *o) | ||||
{ | { | ||||
LADSPAPlugin* Plugin = (LADSPAPlugin*)o; | LADSPAPlugin* Plugin = (LADSPAPlugin*)o; | ||||
SetPluginIndex(Plugin->GetPluginIndex()); | |||||
SetUniqueID(Plugin->GetUniqueID()); | |||||
SetName(Plugin->GetName()); | SetName(Plugin->GetName()); | ||||
SetMaker(Plugin->GetMaker()); | SetMaker(Plugin->GetMaker()); | ||||
SetTabIndex(Plugin->GetTabIndex()); | SetTabIndex(Plugin->GetTabIndex()); | ||||
@@ -336,10 +335,17 @@ void LADSPAPluginGUI::SetUpdateInputs(bool state) | |||||
m_UpdateInputs->value(m_UpdateInputState); | 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) | void LADSPAPluginGUI::SetName(const char *s) | ||||
@@ -529,7 +535,6 @@ void LADSPAPluginGUI::Update(void) | |||||
void LADSPAPluginGUI::ClearPlugin(void) | void LADSPAPluginGUI::ClearPlugin(void) | ||||
{ | { | ||||
m_PluginIndex = 0; | |||||
m_InputPortCount = 0; | m_InputPortCount = 0; | ||||
m_PortIndex = 0; | m_PortIndex = 0; | ||||
@@ -573,22 +578,22 @@ void LADSPAPluginGUI::SelectPlugin(void) | |||||
m_GUICH->GetData("GetInputPortSettings", m_InputPortSettings); | m_GUICH->GetData("GetInputPortSettings", m_InputPortSettings); | ||||
m_GUICH->GetData("GetInputPortDefaults", m_InputPortDefaults); | m_GUICH->GetData("GetInputPortDefaults", m_InputPortDefaults); | ||||
SetName((const char *)m_Name); | |||||
SetName((const char *)m_Name); | |||||
SetMaker((const char *)m_Maker); | SetMaker((const char *)m_Maker); | ||||
for (unsigned long p = 0; p < m_InputPortCount; p++) { | for (unsigned long p = 0; p < m_InputPortCount; p++) { | ||||
AddPortInfo((const char *)(m_InputPortNames + p * 256)); | AddPortInfo((const char *)(m_InputPortNames + p * 256)); | ||||
SetPortSettings(p, m_InputPortSettings[p].Min, | 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); | SetDefaultAdjust(p); | ||||
} | } | ||||
UpdateDefaultAdjustControls(); | UpdateDefaultAdjustControls(); | ||||
m_PortIndex = m_InputPortCount; | m_PortIndex = m_InputPortCount; | ||||
redraw(); | redraw(); | ||||
} | } | ||||
@@ -612,15 +617,15 @@ inline void LADSPAPluginGUI::cb_Select_i(Fl_Choice* o) | |||||
{ | { | ||||
ClearPlugin(); | 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->SetCommand(LADSPAPlugin::SELECTPLUGIN); | ||||
m_GUICH->Wait(); | |||||
m_GUICH->Wait(); | |||||
} | } | ||||
SelectPlugin(); | |||||
SelectPlugin(); | |||||
// redraw(); | // redraw(); | ||||
} | } | ||||
@@ -1,5 +1,7 @@ | |||||
/* SpiralPlugin | |||||
/* LADSPAPluginGUI.h | |||||
* Copyleft (C) 2000 David Griffiths <dave@pawfal.org> | * 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 | * 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 | * it under the terms of the GNU General Public License as published by | ||||
@@ -63,7 +65,7 @@ private: | |||||
void AddPortInfo(const char *Info); | void AddPortInfo(const char *Info); | ||||
void SetTabIndex(int index); | void SetTabIndex(int index); | ||||
void SetUpdateInputs(bool state); | void SetUpdateInputs(bool state); | ||||
void SetPluginIndex(unsigned long n); | |||||
void SetUniqueID(unsigned long n); | |||||
void SetName(const char *s); | void SetName(const char *s); | ||||
void SetMaker(const char *s); | void SetMaker(const char *s); | ||||
void SetPortSettings(unsigned long n, float min, float max, bool clamp, float defolt); | void SetPortSettings(unsigned long n, float min, float max, bool clamp, float defolt); | ||||
@@ -72,8 +74,8 @@ private: | |||||
void ClearPlugin(void); | void ClearPlugin(void); | ||||
void SelectPlugin(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_Box *m_MakerLabel; | ||||
Fl_Tabs *m_Tab; | Fl_Tabs *m_Tab; | ||||
Fl_Group *m_ControlGroup; | Fl_Group *m_ControlGroup; | ||||
@@ -82,12 +84,12 @@ private: | |||||
Fl_Group *m_SetupGroup; | Fl_Group *m_SetupGroup; | ||||
Fl_Choice *m_Browser; | 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_Scroll *m_InputScroll; | ||||
Fl_Pack *m_InputPack; | Fl_Pack *m_InputPack; | ||||
@@ -101,6 +103,7 @@ private: | |||||
std::vector<char *> m_PortDefaultAdjustLabels; | std::vector<char *> m_PortDefaultAdjustLabels; | ||||
std::vector<LADSPAInfo::PluginEntry> m_PluginList; | std::vector<LADSPAInfo::PluginEntry> m_PluginList; | ||||
std::vector<unsigned long> m_PluginIDLookup; | |||||
unsigned long m_PortIndex; | unsigned long m_PortIndex; | ||||
float m_Default; | float m_Default; | ||||
@@ -108,7 +111,7 @@ private: | |||||
float m_Max; | float m_Max; | ||||
bool m_Clamp; | bool m_Clamp; | ||||
unsigned long m_PluginIndex; | |||||
unsigned long m_UniqueID; | |||||
int m_TabIndex; | int m_TabIndex; | ||||
bool m_UpdateInputState; | bool m_UpdateInputState; | ||||
char m_Name[256]; | char m_Name[256]; | ||||
@@ -120,7 +123,7 @@ private: | |||||
PortValues *m_InputPortValues; | PortValues *m_InputPortValues; | ||||
float *m_InputPortDefaults; | 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); | static void cb_TabChange(Fl_Tabs *o); | ||||
inline void cb_Select_i(Fl_Choice* o); | inline void cb_Select_i(Fl_Choice* o); | ||||
static void cb_Select(Fl_Choice* o); | static void cb_Select(Fl_Choice* o); | ||||
@@ -138,6 +141,4 @@ private: | |||||
static void cb_DefaultAdjust(Fl_Knob *o); | static void cb_DefaultAdjust(Fl_Knob *o); | ||||
}; | }; | ||||
#endif // __ladspa_plugin_gui_h__ | #endif // __ladspa_plugin_gui_h__ |