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/error.h>
#include <pbd/pathscanner.h>
#include <pbd/xml++.h>
+#include <pbd/stacktrace.h>
#include <ardour/ardour.h>
#include <ardour/session.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::make_nth_control (uint32_t n, const XMLNode& node)
+{
+ if (controls[n]) {
+ /* already constructed */
+ return;
+ }
+
+ Plugin::ParameterDescriptor desc;
+
+ get_parameter_descriptor (n, desc);
+
+ controls[n] = new PortControllable (node, *this, n,
+ desc.lower, desc.upper, desc.toggled, desc.logarithmic);
+}
+
Controllable *
-Plugin::get_nth_control (uint32_t n)
+Plugin::get_nth_control (uint32_t n, bool do_not_create)
{
if (n >= parameter_count()) {
return 0;
}
- if (controls[n] == 0) {
+ if (controls[n] == 0 && !do_not_create) {
Plugin::ParameterDescriptor desc;
-
- get_parameter_descriptor (n, desc);
- controls[n] = new PortControllable (*this, n, desc.lower, desc.upper, desc.toggled, desc.logarithmic);
+ get_parameter_descriptor (n, desc);
+
+ controls[n] = new PortControllable (describe_parameter (n), *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)
+Plugin::PortControllable::PortControllable (string name, Plugin& p, uint32_t port_id,
+ float low, float up, bool t, bool loga)
+ : Controllable (name), plugin (p), absolute_port (port_id)
+{
+ toggled = t;
+ logarithmic = loga;
+ lower = low;
+ upper = up;
+ range = upper - lower;
+}
+
+Plugin::PortControllable::PortControllable (const XMLNode& node, Plugin& p, uint32_t port_id,
+ float low, float up, bool t, bool loga)
+ : Controllable (node), plugin (p), absolute_port (port_id)
{
toggled = t;
logarithmic = loga;
Plugin::get_presets()
{
vector<string> labels;
- lrdf_uris* set_uris = lrdf_get_setting_uris(unique_id());
+ 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 presets.
+ XXX sub-problem: implement it.
+ */
+
+ if (!isdigit (unique[0])) {
+ return labels;
+ }
+
+ id = atol (unique.c_str());
+
+ 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 (g_mkdir_with_parents (path.c_str(), 0775)) {
}
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);
}
}
+
+#ifdef VST_SUPPORT
+ /* hmm, we didn't find it. could be because in older versions of Ardour.
+ we used to store the name of a VST plugin, not its unique ID. so try
+ again.
+ */
+
+ for (i = plugs.begin(); i != plugs.end(); ++i) {
+ if (identifier == (*i)->name){
+ return (*i)->load (session);
+ }
+ }
+#endif
return PluginPtr ((Plugin*) 0);
}
+int32_t
+Plugin::can_support_input_configuration (int32_t in)
+{
+ /* LADSPA & VST should not get here because they do not
+ return negative i/o counts.
+ */
+ return -1;
+}
+
+int32_t
+Plugin::compute_output_streams (int32_t nplugins)
+{
+ /* LADSPA & VST should not get here because they do not
+ return negative i/o counts.
+ */
+ return -1;
+}
+
+uint32_t
+Plugin::output_streams () const
+{
+ /* LADSPA & VST should not get here because they do not
+ return negative i/o counts.
+ */
+ return 0;
+}
+
+uint32_t
+Plugin::input_streams () const
+{
+ /* LADSPA & VST should not get here because they do not
+ return negative i/o counts.
+ */
+ return 0;
+}
+