Guitarix
gx_pluginloader.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2011 Hermann Meyer, James Warden, Andreas Degert, Pete Shorthose
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  */
18 
19 // utility class
20 // FIXME should be moved somewhere else
21 struct stringcomp {
22  inline bool operator() (const char* lhs, const char* rhs) const {
23  return strcmp(lhs, rhs) < 0;
24  }
25 };
26 
27 namespace gx_engine {
28 
29 class EngineControl;
30 
31 /****************************************************************
32  ** class Plugin
33  ** Defines audio processing module and variables for
34  ** user interface
35 */
36 
37 enum { // additional flags for PluginDef (used internally)
38  PGNI_DYN_POSITION = 0x10000, // plugin is part of dynamically ordered rack
39  PGNI_NOT_OWN = 0x20000, // not owned by PluginList
40  PGNI_UI_REG = 0x40000, // Plugin registered in user interface
41  PGNI_IS_LV2 = 0x80000, // Plugin is in LV2 format
42  PGNI_IS_LADSPA = 0x100000, // Plugin is in LADSPA format
43 };
44 
45 class Plugin {
46 private:
47  PluginDef *pdef;
48  BoolParameter *p_box_visible; // In Rack: UI Interface Box visible
49  BoolParameter *p_plug_visible; // In Box: UI Interface Box visible
50  BoolParameter *p_on_off; // Audio Processing
51  IntParameter *p_position; // Position in Rack / Audio Processing Chain
52  IntParameter *p_effect_post_pre; // pre/post amp position (post = 0)
53  int pos_tmp;
54 public:
55  PluginDef *get_pdef() { return pdef; }
56  void set_pdef(PluginDef *p) { pdef = p; }
57  enum { POST_WEIGHT = 2000 };
58  Plugin(PluginDef *pl=0);
59  Plugin(gx_system::JsonParser& jp, ParamMap& pmap);
61  bool get_box_visible() const { return p_box_visible && p_box_visible->get_value(); }
62  bool get_plug_visible() const { return p_plug_visible && p_plug_visible->get_value(); }
63  bool get_on_off() const { return p_on_off->get_value(); }
64  int get_position() const { return p_position->get_value(); }
65  int get_effect_post_pre() const { return p_effect_post_pre->get_value(); }
66  void set_box_visible(bool v) const { if (p_box_visible) p_box_visible->set(v); }
67  void set_plug_visible(bool v) const { if (p_plug_visible) p_plug_visible->set(v); }
68  void set_on_off(bool v) const { p_on_off->set(v); }
69  void set_position(int v) const { p_position->set(v); }
70  void set_effect_post_pre(int v) const { p_effect_post_pre->set(v); }
71  const std::string& id_box_visible() const { return p_box_visible->id(); }
72  const std::string& id_plug_visible() const { return p_plug_visible->id(); }
73  const std::string& id_on_off() const { return p_on_off->id(); }
74  const std::string& id_position() const { return p_position->id(); }
75  const std::string& id_effect_post_pre() const { return p_effect_post_pre->id(); }
76  inline int position_weight() { return get_effect_post_pre() ? get_position() : get_position() + POST_WEIGHT; }
77  void register_vars(ParamMap& param, EngineControl& seq);
78  void copy_position(const Plugin& plugin);
79  friend class PluginListBase;
80  friend class PluginList;
81  friend void printlist(const char *title, const list<Plugin*>& modules, bool header);
82 };
83 
84 /****************************************************************
85  ** class UiBuilderBase
86  */
87 
88 class UiBuilderBase: public UiBuilder {
89 public:
90  virtual bool load(Plugin *p) = 0;
91 };
92 
93 /****************************************************************
94  ** class ParamRegImpl
95  */
96 
97 class ParamRegImpl: public ParamReg {
98 private:
99  static ParamMap *pmap;
100  static float *registerVar_(const char* id, const char* name, const char* tp,
101  const char* tooltip, float* var, float val,
102  float low, float up, float step);
103  static void registerBoolVar_(const char* id, const char* name, const char* tp,
104  const char* tooltip, bool* var, bool val);
105  static void registerNonMidiVar_(const char * id, bool*var, bool preset, bool nosave);
106  static void registerNonMidiFloatVar_(const char * id, float *var, bool preset, bool nosave,
107  float val, float low, float up, float step);
108  static float *registerNonMidiSharedVar_(const char * id, float *var, bool preset, bool nosave,
109  float val, float low, float up, float step);
110  static void registerEnumVar_(const char *id, const char* name, const char* tp,
111  const char* tooltip, const value_pair* values, float *var, float val,
112  float low, float up, float step);
113  static float *registerSharedEnumVar_(const char *id, const char* name, const char* tp,
114  const char* tooltip, const value_pair* values, float *var, float val,
115  float low, float up, float step);
116  static void registerIEnumVar_(const char *id, const char* name, const char* tp,
117  const char* tooltip, const value_pair* values, int *var, int val);
118 public:
119  ParamRegImpl(ParamMap* pm);
120 };
121 
122 /****************************************************************
123  ** class PluginList
124  ** container of plugins for all processing chains
125  */
126 
127 enum PluginPos { // where to add a plugin (per processing chain)
130  PLUGIN_POS_END // keep last one
131 };
132 
133 typedef PluginDef *(*plugindef_creator)();
134 
135 class PluginListBase {
136 public:
137  typedef pair<const std::string, Plugin*> map_pair;
138  typedef map<const std::string, Plugin*> pluginmap;
139 protected:
142  PLUGIN_POS_COUNT // keep last one
143  };
144  pluginmap pmap;
145  sigc::signal<void,const char*,bool> insert_remove;
146 public:
147  PluginListBase();
148  ~PluginListBase();
149  void cleanup();
150  Plugin *find_plugin(const std::string& id) const;
151  Plugin *lookup_plugin(const std::string& id) const;
155  pluginmap::iterator begin() { return pmap.begin(); }
156  pluginmap::iterator end() { return pmap.end(); }
157  int insert_plugin(Plugin *pvars);
158  void update_plugin(Plugin *pvars);
159  void delete_module(Plugin *pl);
160 };
161 
162 class PluginList: public PluginListBase {
163  EngineControl& seq;
164  int plugin_pos[PLUGIN_POS_COUNT];
165  int add_module(Plugin *pl, PluginPos pos, int flags);
166 public:
168  ~PluginList();
169  void set_samplerate(int samplerate); // call set_samplerate of all plugins
170  int load_from_path(const string& path, PluginPos pos = PLUGIN_POS_RACK);
171  int load_library(const string& path, PluginPos pos = PLUGIN_POS_RACK);
172  int add(Plugin *pl, PluginPos pos, int flags);
173  Plugin *add(PluginDef *p, PluginPos pos = PLUGIN_POS_RACK, int flags=0);
174  int add(PluginDef **p, PluginPos pos = PLUGIN_POS_RACK, int flags=0);
175  int add(plugindef_creator *p, PluginPos pos = PLUGIN_POS_RACK, int flags=0);
176  int check_version(PluginDef *p);
177  void registerGroup(PluginDef *pd, ParameterGroups& groups);
178  void registerParameter(Plugin *pl, ParamMap& param, ParamRegImpl& preg);
179  void registerPlugin(Plugin *pl, ParamMap& param, ParameterGroups& groups);
180  void unregisterGroup(PluginDef *pd, ParameterGroups& groups);
181  void unregisterParameter(Plugin *pl, ParamMap& param);
182  void rescueParameter(Plugin *pl, ParamMap& param);
183  void unregisterPlugin(Plugin *pl, ParamMap& param, ParameterGroups& groups);
185  void ordered_mono_list(list<Plugin*>& mono, int mode);
186  void ordered_stereo_list(list<Plugin*>& stereo, int mode);
187  void ordered_list(list<Plugin*>& l, bool stereo, int flagmask, int flagvalue);
188  sigc::signal<void,const char*,bool>& signal_insert_remove() { return insert_remove; }
189 #ifndef NDEBUG
190  void printlist(bool ordered = true);
191 #endif
192 };
193 
194 #ifndef NDEBUG
195 void printlist(const char *title, const list<Plugin*>& modules, bool header=true);
196 #else
197 inline void printlist(const char *, const list<Plugin*>&, bool=true) {}
198 #endif
199 
200 } // !namespace gx_engine
gx_engine::PluginList::registerAllPlugins
void registerAllPlugins(ParamMap &param, ParameterGroups &groups)
Definition: gx_pluginloader.cpp:690
gx_engine::Plugin::get_box_visible
bool get_box_visible() const
Definition: gx_pluginloader.h:60
gx_engine::Plugin::set_plug_visible
void set_plug_visible(bool v) const
Definition: gx_pluginloader.h:66
gx_engine::PluginListBase::begin
pluginmap::iterator begin()
Definition: gx_pluginloader.h:151
gx_engine::PluginListBase::PLUGIN_POS_COUNT
Definition: gx_pluginloader.h:138
gx_engine::plugindef_creator
PluginDef *(* plugindef_creator)()
Definition: gx_pluginloader.h:129
gx_engine::Plugin::set_box_visible
void set_box_visible(bool v) const
Definition: gx_pluginloader.h:65
gx_engine::ParamRegImpl
Definition: gx_pluginloader.h:94
stringcomp
Definition: gx_pluginloader.h:21
gx_engine::PluginListBase::PluginPosInternal
PluginPosInternal
Definition: gx_pluginloader.h:136
value_pair
Definition: gx_plugin.h:117
gx_engine::UiBuilderBase
Definition: gx_pluginloader.h:86
gx_engine::PluginListBase::~PluginListBase
~PluginListBase()
Definition: gx_pluginloader.cpp:373
gx_engine::PluginListBase
Definition: gx_pluginloader.h:131
gx_engine::PGNI_IS_LADSPA
Definition: gx_pluginloader.h:44
gx_engine::Plugin::id_plug_visible
const std::string & id_plug_visible() const
Definition: gx_pluginloader.h:71
gx_engine::Plugin::id_position
const std::string & id_position() const
Definition: gx_pluginloader.h:73
gx_engine::PLUGIN_POS_END
Definition: gx_pluginloader.h:128
gx_engine::PluginList::unregisterPlugin
void unregisterPlugin(Plugin *pl, ParamMap &param, ParameterGroups &groups)
Definition: gx_pluginloader.cpp:684
gx_engine::PluginListBase::end
pluginmap::iterator end()
Definition: gx_pluginloader.h:152
gx_engine::PluginList::registerParameter
void registerParameter(Plugin *pl, ParamMap &param, ParamRegImpl &preg)
Definition: gx_pluginloader.cpp:646
gx_engine::PluginListBase::PluginListBase
PluginListBase()
Definition: gx_pluginloader.cpp:358
gx_engine::ParameterV< int >::set
bool set(int val) const
Definition: gx_paramtable.cpp:1388
gx_engine::PGNI_DYN_POSITION
Definition: gx_pluginloader.h:40
gx_engine::PluginList::~PluginList
~PluginList()
Definition: gx_pluginloader.cpp:385
gx_engine::ParameterV< bool >
Definition: gx_parameter.h:349
gx_engine::PluginListBase::append_rack
void append_rack(UiBuilderBase &ui)
Definition: gx_pluginloader.cpp:700
gx_engine::PluginPos
PluginPos
Definition: gx_pluginloader.h:123
gx_engine::Plugin::register_vars
void register_vars(ParamMap &param, EngineControl &seq)
Definition: gx_pluginloader.cpp:307
gx_engine::PluginListBase::PLUGIN_POS_RACK_STEREO
Definition: gx_pluginloader.h:137
gx_engine::Plugin::set_pdef
void set_pdef(PluginDef *p)
Definition: gx_pluginloader.h:55
gx_engine::Plugin::get_plug_visible
bool get_plug_visible() const
Definition: gx_pluginloader.h:61
gx_engine::PluginListBase::update_plugin
void update_plugin(Plugin *pvars)
Definition: gx_pluginloader.cpp:507
gx_engine::PluginList::load_from_path
int load_from_path(const string &path, PluginPos pos=PLUGIN_POS_RACK)
Definition: gx_pluginloader.cpp:442
gx_engine::PLUGIN_POS_START
Definition: gx_pluginloader.h:126
PluginDef
Definition: gx_plugin.h:183
gx_engine::PluginList::load_library
int load_library(const string &path, PluginPos pos=PLUGIN_POS_RACK)
Definition: gx_pluginloader.cpp:406
gx_engine::PluginList::ordered_list
void ordered_list(list< Plugin * > &l, bool stereo, int flagmask, int flagvalue)
Definition: gx_pluginloader.cpp:740
gx_engine::Plugin::set_position
void set_position(int v) const
Definition: gx_pluginloader.h:68
gx_engine::PluginListBase::pluginmap
map< const std::string, Plugin * > pluginmap
Definition: gx_pluginloader.h:134
gx_engine::Plugin::POST_WEIGHT
Definition: gx_pluginloader.h:56
stringcomp::operator()
bool operator()(const char *lhs, const char *rhs) const
Definition: gx_pluginloader.h:22
gx_engine::ParameterV< bool >::get_value
bool get_value() const
Definition: gx_parameter.h:362
gx_engine::PluginListBase::insert_remove
sigc::signal< void, const char *, bool > insert_remove
Definition: gx_pluginloader.h:141
gx_engine::PluginList::PluginList
PluginList(EngineControl &seq)
Definition: gx_pluginloader.cpp:377
gx_engine::PluginListBase::cleanup
void cleanup()
Definition: gx_pluginloader.cpp:360
gx_engine::Plugin::id_on_off
const std::string & id_on_off() const
Definition: gx_pluginloader.h:72
gx_engine::PluginList::unregisterParameter
void unregisterParameter(Plugin *pl, ParamMap &param)
Definition: gx_pluginloader.cpp:655
gx_engine::ParameterV< int >
Definition: gx_parameter.h:293
gx_engine::PGNI_IS_LV2
Definition: gx_pluginloader.h:43
gx_engine::PluginListBase::find_plugin
Plugin * find_plugin(const std::string &id) const
Definition: gx_pluginloader.cpp:388
gx_engine::PluginList::unregisterGroup
void unregisterGroup(PluginDef *pd, ParameterGroups &groups)
Definition: gx_pluginloader.cpp:614
gx_engine::Plugin::copy_position
void copy_position(const Plugin &plugin)
Definition: gx_pluginloader.cpp:349
gx_engine
Definition: gx_convolver.h:33
gx_engine::Plugin::set_on_off
void set_on_off(bool v) const
Definition: gx_pluginloader.h:67
gx_engine::PluginListBase::delete_module
void delete_module(Plugin *pl)
Definition: gx_pluginloader.cpp:477
gx_engine::PluginListBase::insert_plugin
int insert_plugin(Plugin *pvars)
Definition: gx_pluginloader.cpp:494
gx_engine::Plugin::get_pdef
PluginDef * get_pdef()
Definition: gx_pluginloader.h:54
gx_system::JsonWriter
Definition: gx_json.h:54
gx_system::JsonParser
Definition: gx_json.h:111
gx_engine::Plugin::get_position
int get_position() const
Definition: gx_pluginloader.h:63
gx_engine::PluginList::set_samplerate
void set_samplerate(int samplerate)
Definition: gx_pluginloader.cpp:774
gx_engine::PluginList
Definition: gx_pluginloader.h:158
gx_engine::PluginList::registerPlugin
void registerPlugin(Plugin *pl, ParamMap &param, ParameterGroups &groups)
Definition: gx_pluginloader.cpp:678
gx_engine::Plugin::get_on_off
bool get_on_off() const
Definition: gx_pluginloader.h:62
gx_engine::Plugin::set_effect_post_pre
void set_effect_post_pre(int v) const
Definition: gx_pluginloader.h:69
gx_engine::PGNI_UI_REG
Definition: gx_pluginloader.h:42
gx_engine::PluginListBase::pmap
pluginmap pmap
Definition: gx_pluginloader.h:140
gx_engine::Plugin::writeJSON
void writeJSON(gx_system::JsonWriter &jw)
Definition: gx_pluginloader.cpp:279
gx_engine::PluginListBase::readJSON
void readJSON(gx_system::JsonParser &jp, ParamMap &pmap)
Definition: gx_pluginloader.cpp:764
gx_engine::Plugin::Plugin
Plugin(PluginDef *pl=0)
Definition: gx_pluginloader.cpp:192
gx_engine::ParamRegImpl::ParamRegImpl
ParamRegImpl(ParamMap *pm)
Definition: gx_pluginloader.cpp:31
gx_engine::ParameterV< bool >::set
bool set(bool val) const
Definition: gx_paramtable.cpp:1617
gx_engine::EngineControl
Definition: gx_modulesequencer.h:233
gx_engine::PluginListBase::map_pair
pair< const std::string, Plugin * > map_pair
Definition: gx_pluginloader.h:133
gx_engine::Plugin::position_weight
int position_weight()
Definition: gx_pluginloader.h:75
gx_engine::ParameterGroups
Definition: gx_parameter.h:46
gx_engine::ParameterV< int >::get_value
int get_value() const
Definition: gx_parameter.h:306
gx_engine::ParamMap
Definition: gx_parameter.h:512
ParamReg
Definition: gx_plugin.h:122
gx_engine::Parameter::id
const string & id() const
Definition: gx_parameter.h:171
gx_engine::PluginList::printlist
void printlist(bool ordered=true)
Definition: gx_pluginloader.cpp:784
gx_engine::PluginList::signal_insert_remove
sigc::signal< void, const char *, bool > & signal_insert_remove()
Definition: gx_pluginloader.h:184
gx_engine::printlist
void printlist(const char *title, const list< Plugin * > &modules, bool header=true)
UiBuilder
Definition: gx_plugin.h:63
gx_engine::PluginList::rescueParameter
void rescueParameter(Plugin *pl, ParamMap &param)
Definition: gx_pluginloader.cpp:634
gx_engine::PLUGIN_POS_RACK
Definition: gx_pluginloader.h:127
gx_engine::PluginList::add
int add(Plugin *pl, PluginPos pos, int flags)
Definition: gx_pluginloader.cpp:547
gx_engine::Plugin::printlist
friend void printlist(const char *title, const list< Plugin * > &modules, bool header)
gx_engine::PluginList::check_version
int check_version(PluginDef *p)
Definition: gx_pluginloader.cpp:465
gx_engine::Plugin
Definition: gx_pluginloader.h:44
gx_engine::PluginList::ordered_stereo_list
void ordered_stereo_list(list< Plugin * > &stereo, int mode)
Definition: gx_pluginloader.cpp:728
gx_engine::UiBuilderBase::load
virtual bool load(Plugin *p)=0
gx_engine::PluginListBase::writeJSON
void writeJSON(gx_system::JsonWriter &jw)
Definition: gx_pluginloader.cpp:756
gx_engine::PGNI_NOT_OWN
Definition: gx_pluginloader.h:41
gx_engine::PluginList::ordered_mono_list
void ordered_mono_list(list< Plugin * > &mono, int mode)
Definition: gx_pluginloader.cpp:710
gx_engine::Plugin::id_box_visible
const std::string & id_box_visible() const
Definition: gx_pluginloader.h:70
gx_engine::PluginListBase::lookup_plugin
Plugin * lookup_plugin(const std::string &id) const
Definition: gx_pluginloader.cpp:396
gx_engine::Plugin::id_effect_post_pre
const std::string & id_effect_post_pre() const
Definition: gx_pluginloader.h:74
gx_engine::Plugin::get_effect_post_pre
int get_effect_post_pre() const
Definition: gx_pluginloader.h:64
gx_engine::PluginList::registerGroup
void registerGroup(PluginDef *pd, ParameterGroups &groups)
Definition: gx_pluginloader.cpp:594