Sort various things to reduce merge hell. No functional changes.
[ardour.git] / libs / ardour / plugin.cc
index 6763e7f5084efa6819d1f962bfbca4fade1d5948..95629f256150efd36801eeb4a0f690177dbe673a 100644 (file)
@@ -15,7 +15,6 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #include <vector>
 
 #include <pbd/compose.h>
 #include <pbd/error.h>
-#include <pbd/pathscanner.h>
 #include <pbd/xml++.h>
 
 #include <ardour/ardour.h>
 #include <ardour/session.h>
 #include <ardour/audioengine.h>
 #include <ardour/plugin.h>
+#include <ardour/ladspa_plugin.h>
+#include <ardour/plugin_manager.h>
+
+#ifdef HAVE_AUDIOUNITS
+#include <ardour/audio_unit.h>
+#endif
+
+#ifdef HAVE_SLV2
+#include <ardour/lv2_plugin.h>
+#endif
 
 #include <pbd/stl_delete.h>
 
@@ -58,108 +66,29 @@ Plugin::Plugin (const Plugin& other)
 {
 }
 
-void
-Plugin::setup_controls ()
-{
-       uint32_t port_cnt = parameter_count();
-
-       /* set up a vector of null pointers for the controls.
-          we'll fill this in on an as-needed basis.
-       */
-
-       for (uint32_t i = 0; i < port_cnt; ++i) {
-               controls.push_back (0);
-       }
-}
-
 Plugin::~Plugin ()
 {
-       for (vector<PortControllable*>::iterator i = controls.begin(); i != controls.end(); ++i) {
-               if (*i) {
-                       delete *i;
-               }
-       }
-}
-
-Controllable *
-Plugin::get_nth_control (uint32_t n)
-{
-       if (n >= parameter_count()) {
-               return 0;
-       }
-
-       if (controls[n] == 0) {
-
-               Plugin::ParameterDescriptor desc;
-
-               get_parameter_descriptor (n, desc);
-               
-               controls[n] = new PortControllable (*this, n, desc.lower, desc.upper, desc.toggled, desc.logarithmic);
-       } 
-
-       return controls[n];
 }
 
-Plugin::PortControllable::PortControllable (Plugin& p, uint32_t port_id, float low, float up, bool t, bool loga)
-       : plugin (p), absolute_port (port_id)
+vector<string>
+Plugin::get_presets()
 {
-       toggled = t;
-       logarithmic = loga;
-       lower = low;
-       upper = up;
-       range = upper - lower;
-}
+       vector<string> labels;
+       uint32_t id;
+       std::string unique (unique_id());
 
-void
-Plugin::PortControllable::set_value (float value)
-{
-       if (toggled) {
-               if (value > 0.5) {
-                       value = 1.0;
-               } else {
-                       value = 0.0;
-               }
-       } else {
-
-               if (!logarithmic) {
-                       value = lower + (range * value);
-               } else {
-                       float _lower = 0.0f;
-                       if (lower > 0.0f) {
-                               _lower = log(lower);
-                       }
+       /* XXX problem: AU plugins don't have numeric ID's. 
+          Solution: they have a different method of providing presets.
+          XXX sub-problem: implement it.
+       */
 
-                       value = exp(_lower + log(range) * value);
-               }
+       if (!isdigit (unique[0])) {
+               return labels;
        }
 
-       plugin.set_parameter (absolute_port, value);
-}
+       id = atol (unique.c_str());
 
-float
-Plugin::PortControllable::get_value (void) const
-{
-       float val = plugin.get_parameter (absolute_port);
-
-       if (toggled) {
-               
-               return val;
-               
-       } else {
-               
-               if (logarithmic) {
-                       val = log(val);
-               }
-               
-               return ((val - lower) / range);
-       }
-}      
-
-vector<string>
-Plugin::get_presets()
-{
-       vector<string> labels;
-       lrdf_uris* set_uris = lrdf_get_setting_uris(unique_id());
+       lrdf_uris* set_uris = lrdf_get_setting_uris(id);
 
        if (set_uris) {
                for (uint32_t i = 0; i < (uint32_t) set_uris->count; ++i) {
@@ -201,6 +130,20 @@ Plugin::save_preset (string name, string domain)
 {
        lrdf_portvalue portvalues[parameter_count()];
        lrdf_defaults defaults;
+       uint32_t id;
+       std::string unique (unique_id());
+
+       /* XXX problem: AU plugins don't have numeric ID's. 
+          Solution: they have a different method of providing/saving presets.
+          XXX sub-problem: implement it.
+       */
+
+       if (!isdigit (unique[0])) {
+               return false;
+       }
+
+       id = atol (unique.c_str());
+
        defaults.count = parameter_count();
        defaults.items = portvalues;
 
@@ -219,16 +162,16 @@ Plugin::save_preset (string name, string domain)
        
        string source(string_compose("file:%1/.%2/rdf/ardour-presets.n3", envvar, domain));
 
-       free(lrdf_add_preset(source.c_str(), name.c_str(), unique_id(), &defaults));
+       free(lrdf_add_preset(source.c_str(), name.c_str(), id,  &defaults));
 
        string path = string_compose("%1/.%2", envvar, domain);
-       if (mkdir(path.c_str(), 0775) && errno != EEXIST) {
+       if (g_mkdir_with_parents (path.c_str(), 0775)) {
                warning << string_compose(_("Could not create %1.  Preset not saved. (%2)"), path, strerror(errno)) << endmsg;
                return false;
        }
        
        path += "/rdf";
-       if (mkdir(path.c_str(), 0775) && errno != EEXIST) {
+       if (g_mkdir_with_parents (path.c_str(), 0775)) {
                warning << string_compose(_("Could not create %1.  Preset not saved. (%2)"), path, strerror(errno)) << endmsg;
                return false;
        }
@@ -240,3 +183,48 @@ Plugin::save_preset (string name, string domain)
 
        return true;
 }
+
+PluginPtr
+ARDOUR::find_plugin(Session& session, string identifier, PluginType type)
+{
+       PluginManager *mgr = PluginManager::the_manager();
+       PluginInfoList plugs;
+
+       switch (type) {
+       case ARDOUR::LADSPA:
+               plugs = mgr->ladspa_plugin_info();
+               break;
+       
+#ifdef HAVE_SLV2
+       case ARDOUR::LV2:
+               plugs = mgr->lv2_plugin_info();
+               break;
+#endif
+
+#ifdef VST_SUPPORT
+       case ARDOUR::VST:
+               plugs = mgr->vst_plugin_info();
+               break;
+#endif
+
+#ifdef HAVE_AUDIOUNITS
+       case ARDOUR::AudioUnit:
+               plugs = mgr->au_plugin_info();
+               break;
+#endif
+
+       default:
+               return PluginPtr ((Plugin *) 0);
+       }
+
+       PluginInfoList::iterator i;
+
+       for (i = plugs.begin(); i != plugs.end(); ++i) {
+               if (identifier == (*i)->unique_id){
+                       return (*i)->load (session);
+               }
+       }
+       
+       return PluginPtr ((Plugin*) 0);
+}
+