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/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>
#include "i18n.h"
{
}
-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) {
{
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;
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;
}
}
PluginPtr
-ARDOUR::find_plugin(Session& session, string name, long unique_id, PluginType type)
+ARDOUR::find_plugin(Session& session, string identifier, PluginType type)
{
PluginManager *mgr = PluginManager::the_manager();
PluginInfoList plugs;
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();
- unique_id = 0; // VST plugins don't have a unique id.
break;
#endif
#ifdef HAVE_AUDIOUNITS
case ARDOUR::AudioUnit:
- plugs = AUPluginInfo::discover ();
- unique_id = 0; // Neither do AU.
+ plugs = mgr->au_plugin_info();
break;
#endif
}
PluginInfoList::iterator i;
+
for (i = plugs.begin(); i != plugs.end(); ++i) {
- if ((name == "" || (*i)->name == name) &&
- (unique_id == 0 || (*i)->unique_id == unique_id)) {
- return (*i)->load (session);
+ if (identifier == (*i)->unique_id){
+ return (*i)->load (session);
}
}