summaryrefslogtreecommitdiff
path: root/libs/ardour/lv2_plugin.cc
diff options
context:
space:
mode:
authorDoug McLain <doug@nostar.net>2008-06-02 05:02:28 +0000
committerDoug McLain <doug@nostar.net>2008-06-02 05:02:28 +0000
commit9c0d7d72d70082a54f823cd44c0ccda5da64bb6f (patch)
tree96ec400b83b8c1c06852b1936f684b5fbcd47a79 /libs/ardour/lv2_plugin.cc
parent2f3f697bb8e185eb43c2c50b4eefc2bcb937f269 (diff)
remove empty sigc++2 directory
git-svn-id: svn://localhost/ardour2/branches/3.0@3432 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/lv2_plugin.cc')
-rw-r--r--libs/ardour/lv2_plugin.cc625
1 files changed, 0 insertions, 625 deletions
diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc
deleted file mode 100644
index 4553458831..0000000000
--- a/libs/ardour/lv2_plugin.cc
+++ /dev/null
@@ -1,625 +0,0 @@
-/*
- Copyright (C) 2008 Paul Davis
- Author: Dave Robillard
-
- 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include <vector>
-#include <string>
-
-#include <cstdlib>
-#include <cmath>
-
-#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/lv2_plugin.h>
-
-#include <pbd/stl_delete.h>
-
-#include "i18n.h"
-#include <locale.h>
-
-using namespace std;
-using namespace ARDOUR;
-using namespace PBD;
-
-LV2Plugin::LV2Plugin (AudioEngine& e, Session& session, LV2World& world, SLV2Plugin plugin, nframes_t rate)
- : Plugin (e, session)
- , _world(world)
-{
- init (world, plugin, rate);
-}
-
-LV2Plugin::LV2Plugin (const LV2Plugin &other)
- : Plugin (other)
- , _world(other._world)
-{
- init (other._world, other._plugin, other._sample_rate);
-
- for (uint32_t i = 0; i < parameter_count(); ++i) {
- _control_data[i] = other._shadow_data[i];
- _shadow_data[i] = other._shadow_data[i];
- }
-}
-
-void
-LV2Plugin::init (LV2World& world, SLV2Plugin plugin, nframes_t rate)
-{
- _world = world;
- _plugin = plugin;
- _control_data = 0;
- _shadow_data = 0;
- _latency_control_port = 0;
- _was_activated = false;
-
- _instance = slv2_plugin_instantiate(plugin, rate, NULL);
- _name = slv2_plugin_get_name(plugin);
- assert(_name);
- _author = slv2_plugin_get_author_name(plugin);
-
- if (_instance == 0) {
- error << _("LV2: Failed to instantiate plugin ") << slv2_plugin_get_uri(plugin) << endl;
- throw failed_constructor();
- }
-
- if (slv2_plugin_has_feature(plugin, world.in_place_broken)) {
- error << string_compose(_("LV2: \"%1\" cannot be used, since it cannot do inplace processing"),
- slv2_value_as_string(_name));
- slv2_value_free(_name);
- slv2_value_free(_author);
- throw failed_constructor();
- }
-
- _sample_rate = rate;
-
- const uint32_t num_ports = slv2_plugin_get_num_ports(plugin);
-
- _control_data = new float[num_ports];
- _shadow_data = new float[num_ports];
- _defaults = new float[num_ports];
-
- const bool latent = slv2_plugin_has_latency(plugin);
- uint32_t latency_port = (latent ? slv2_plugin_get_latency_port_index(plugin) : 0);
-
- for (uint32_t i = 0; i < num_ports; ++i) {
- if (parameter_is_control(i)) {
- SLV2Port port = slv2_plugin_get_port_by_index(plugin, i);
- SLV2Value def;
- slv2_port_get_range(plugin, port, &def, NULL, NULL);
- _defaults[i] = def ? slv2_value_as_float(def) : 0.0f;
- slv2_value_free(def);
-
- slv2_instance_connect_port (_instance, i, &_control_data[i]);
-
- if (latent && i == latency_port) {
- _latency_control_port = &_control_data[i];
- *_latency_control_port = 0;
- }
-
- if (parameter_is_input(i)) {
- _shadow_data[i] = default_value (i);
- }
- } else {
- _defaults[i] = 0.0f;
- }
- }
-
- latency_compute_run ();
-}
-
-LV2Plugin::~LV2Plugin ()
-{
- deactivate ();
- cleanup ();
-
- GoingAway (); /* EMIT SIGNAL */
-
- slv2_instance_free(_instance);
- slv2_value_free(_name);
- slv2_value_free(_author);
-
- if (_control_data) {
- delete [] _control_data;
- }
-
- if (_shadow_data) {
- delete [] _shadow_data;
- }
-}
-
-string
-LV2Plugin::unique_id() const
-{
- return slv2_value_as_uri(slv2_plugin_get_uri(_plugin));
-}
-
-
-float
-LV2Plugin::default_value (uint32_t port)
-{
- return _defaults[port];
-}
-
-void
-LV2Plugin::set_parameter (uint32_t which, float val)
-{
- if (which < slv2_plugin_get_num_ports(_plugin)) {
- _shadow_data[which] = val;
-#if 0
- ParameterChanged (which, val); /* EMIT SIGNAL */
-
- if (which < parameter_count() && controls[which]) {
- controls[which]->Changed ();
- }
-#endif
-
- } else {
- warning << string_compose (_("Illegal parameter number used with plugin \"%1\"."
- "This is a bug in either Ardour or the LV2 plugin (%2)"),
- name(), unique_id()) << endmsg;
- }
-}
-
-float
-LV2Plugin::get_parameter (uint32_t which) const
-{
- if (parameter_is_input(which)) {
- return (float) _shadow_data[which];
- } else {
- return (float) _control_data[which];
- }
- return 0.0f;
-}
-
-uint32_t
-LV2Plugin::nth_parameter (uint32_t n, bool& ok) const
-{
- uint32_t x, c;
-
- ok = false;
-
- for (c = 0, x = 0; x < slv2_plugin_get_num_ports(_plugin); ++x) {
- if (parameter_is_control (x)) {
- if (c++ == n) {
- ok = true;
- return x;
- }
- }
- }
-
- return 0;
-}
-
-XMLNode&
-LV2Plugin::get_state()
-{
- XMLNode *root = new XMLNode(state_node_name());
- XMLNode *child;
- char buf[16];
- LocaleGuard lg (X_("POSIX"));
-
- for (uint32_t i = 0; i < parameter_count(); ++i){
-
- if (parameter_is_input(i) && parameter_is_control(i)) {
- child = new XMLNode("port");
- snprintf(buf, sizeof(buf), "%u", i);
- child->add_property("number", string(buf));
- snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
- child->add_property("value", string(buf));
- root->add_child_nocopy (*child);
-
- /*if (i < controls.size() && controls[i]) {
- root->add_child_nocopy (controls[i]->get_state());
- }*/
- }
- }
-
- return *root;
-}
-
-bool
-LV2Plugin::save_preset (string name)
-{
- return Plugin::save_preset (name, "lv2");
-}
-
-int
-LV2Plugin::set_state(const XMLNode& node)
-{
- XMLNodeList nodes;
- XMLProperty *prop;
- XMLNodeConstIterator iter;
- XMLNode *child;
- const char *port;
- const char *data;
- uint32_t port_id;
- LocaleGuard lg (X_("POSIX"));
-
- if (node.name() != state_node_name()) {
- error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
- return -1;
- }
-
- nodes = node.children ("port");
-
- for(iter = nodes.begin(); iter != nodes.end(); ++iter){
-
- child = *iter;
-
- if ((prop = child->property("number")) != 0) {
- port = prop->value().c_str();
- } else {
- warning << _("LV2: no lv2 port number") << endmsg;
- continue;
- }
-
- if ((prop = child->property("value")) != 0) {
- data = prop->value().c_str();
- } else {
- warning << _("LV2: no lv2 port data") << endmsg;
- continue;
- }
-
- sscanf (port, "%" PRIu32, &port_id);
- set_parameter (port_id, atof(data));
- }
-
- latency_compute_run ();
-
- return 0;
-}
-
-int
-LV2Plugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor& desc) const
-{
- SLV2Port port = slv2_plugin_get_port_by_index(_plugin, which);
-
- SLV2Value def, min, max;
- slv2_port_get_range(_plugin, port, &def, &min, &max);
-
- desc.integer_step = slv2_port_has_property(_plugin, port, _world.integer);
- desc.toggled = slv2_port_has_property(_plugin, port, _world.toggled);
- desc.logarithmic = false; // TODO (LV2 extension)
- desc.sr_dependent = slv2_port_has_property(_plugin, port, _world.srate);
- desc.label = slv2_value_as_string(slv2_port_get_name(_plugin, port));
- desc.lower = min ? slv2_value_as_float(min) : 0.0f;
- desc.upper = max ? slv2_value_as_float(max) : 1.0f;
- desc.min_unbound = false; // TODO (LV2 extension)
- desc.max_unbound = false; // TODO (LV2 extension)
-
- if (desc.integer_step) {
- desc.step = 1.0;
- desc.smallstep = 0.1;
- desc.largestep = 10.0;
- } else {
- const float delta = desc.upper - desc.lower;
- desc.step = delta / 1000.0f;
- desc.smallstep = delta / 10000.0f;
- desc.largestep = delta/10.0f;
- }
-
- slv2_value_free(def);
- slv2_value_free(min);
- slv2_value_free(max);
-
- return 0;
-}
-
-
-string
-LV2Plugin::describe_parameter (Parameter which)
-{
- if (which.type() == PluginAutomation && which.id() < parameter_count()) {
- SLV2Value name = slv2_port_get_name(_plugin,
- slv2_plugin_get_port_by_index(_plugin, which));
- string ret(slv2_value_as_string(name));
- slv2_value_free(name);
- return ret;
- } else {
- return "??";
- }
-}
-
-nframes_t
-LV2Plugin::signal_latency () const
-{
- if (_latency_control_port) {
- return (nframes_t) floor (*_latency_control_port);
- } else {
- return 0;
- }
-}
-
-set<Parameter>
-LV2Plugin::automatable () const
-{
- set<Parameter> ret;
-
- for (uint32_t i = 0; i < parameter_count(); ++i){
- if (parameter_is_input(i) && parameter_is_control(i)) {
- ret.insert (ret.end(), Parameter(PluginAutomation, i));
- }
- }
-
- return ret;
-}
-
-int
-LV2Plugin::connect_and_run (BufferSet& bufs, uint32_t& in_index, uint32_t& out_index, nframes_t nframes, nframes_t offset)
-{
- uint32_t port_index;
- cycles_t then, now;
-
- port_index = 0;
-
- then = get_cycles ();
-
- const uint32_t nbufs = bufs.count().n_audio();
-
- while (port_index < parameter_count()) {
- if (parameter_is_audio(port_index)) {
- if (parameter_is_input(port_index)) {
- const size_t index = min(in_index, nbufs - 1);
- slv2_instance_connect_port(_instance, port_index,
- bufs.get_audio(index).data(nframes, offset));
- in_index++;
- } else if (parameter_is_output(port_index)) {
- const size_t index = min(out_index,nbufs - 1);
- slv2_instance_connect_port(_instance, port_index,
- bufs.get_audio(index).data(nframes, offset));
- out_index++;
- }
- } else if (parameter_is_midi(port_index)) {
- // FIXME: Switch MIDI buffer format to LV2 event buffer
- if (parameter_is_input(port_index)) {
- //const size_t index = min(in_index, nbufs - 1);
- //slv2_instance_connect_port(_instance, port_index,
- // bufs.get_midi(index).data(nframes, offset));
- // FIXME: hope it's connection optional...
- slv2_instance_connect_port(_instance, port_index, NULL);
- in_index++;
- } else if (parameter_is_output(port_index)) {
- //const size_t index = min(out_index,nbufs - 1);
- //slv2_instance_connect_port(_instance, port_index,
- // bufs.get_midi(index).data(nframes, offset));
- // FIXME: hope it's connection optional...
- slv2_instance_connect_port(_instance, port_index, NULL);
- out_index++;
- }
- }
- port_index++;
- }
-
- run (nframes);
- now = get_cycles ();
- set_cycles ((uint32_t) (now - then));
-
- return 0;
-}
-
-bool
-LV2Plugin::parameter_is_control (uint32_t param) const
-{
- SLV2Port port = slv2_plugin_get_port_by_index(_plugin, param);
- return slv2_port_is_a(_plugin, port, _world.control_class);
-}
-
-bool
-LV2Plugin::parameter_is_audio (uint32_t param) const
-{
- SLV2Port port = slv2_plugin_get_port_by_index(_plugin, param);
- return slv2_port_is_a(_plugin, port, _world.audio_class);
-}
-
-bool
-LV2Plugin::parameter_is_midi (uint32_t param) const
-{
- SLV2Port port = slv2_plugin_get_port_by_index(_plugin, param);
- return slv2_port_is_a(_plugin, port, _world.event_class)
- && slv2_port_supports_event(_plugin, port, _world.midi_class);
-}
-
-bool
-LV2Plugin::parameter_is_output (uint32_t param) const
-{
- SLV2Port port = slv2_plugin_get_port_by_index(_plugin, param);
- return slv2_port_is_a(_plugin, port, _world.output_class);
-}
-
-bool
-LV2Plugin::parameter_is_input (uint32_t param) const
-{
- SLV2Port port = slv2_plugin_get_port_by_index(_plugin, param);
- return slv2_port_is_a(_plugin, port, _world.input_class);
-}
-
-void
-LV2Plugin::print_parameter (uint32_t param, char *buf, uint32_t len) const
-{
- if (buf && len) {
- if (param < parameter_count()) {
- snprintf (buf, len, "%.3f", get_parameter (param));
- } else {
- strcat (buf, "0");
- }
- }
-}
-
-void
-LV2Plugin::run (nframes_t nframes)
-{
- for (uint32_t i = 0; i < parameter_count(); ++i) {
- if (parameter_is_control(i) && parameter_is_input(i)) {
- _control_data[i] = _shadow_data[i];
- }
- }
-
- slv2_instance_run(_instance, nframes);
-}
-
-void
-LV2Plugin::latency_compute_run ()
-{
- if (!_latency_control_port) {
- return;
- }
-
- /* we need to run the plugin so that it can set its latency
- parameter.
- */
-
- activate ();
-
- uint32_t port_index = 0;
- uint32_t in_index = 0;
- uint32_t out_index = 0;
- const nframes_t bufsize = 1024;
- float buffer[bufsize];
-
- memset(buffer,0,sizeof(float)*bufsize);
-
- /* Note that we've already required that plugins
- be able to handle in-place processing.
- */
-
- port_index = 0;
-
- while (port_index < parameter_count()) {
- if (parameter_is_audio (port_index)) {
- if (parameter_is_input (port_index)) {
- slv2_instance_connect_port (_instance, port_index, buffer);
- in_index++;
- } else if (parameter_is_output (port_index)) {
- slv2_instance_connect_port (_instance, port_index, buffer);
- out_index++;
- }
- }
- port_index++;
- }
-
- run (bufsize);
- deactivate ();
-}
-
-LV2World::LV2World()
- : world(slv2_world_new())
-{
- slv2_world_load_all(world);
- input_class = slv2_value_new_uri(world, SLV2_PORT_CLASS_INPUT);
- output_class = slv2_value_new_uri(world, SLV2_PORT_CLASS_OUTPUT);
- control_class = slv2_value_new_uri(world, SLV2_PORT_CLASS_CONTROL);
- audio_class = slv2_value_new_uri(world, SLV2_PORT_CLASS_AUDIO);
- event_class = slv2_value_new_uri(world, SLV2_PORT_CLASS_EVENT);
- midi_class = slv2_value_new_uri(world, SLV2_EVENT_CLASS_MIDI);
- in_place_broken = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "inPlaceBroken");
- integer = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "integer");
- toggled = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "toggled");
- srate = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "sampleRate");
-}
-
-LV2World::~LV2World()
-{
- slv2_value_free(input_class);
- slv2_value_free(output_class);
- slv2_value_free(control_class);
- slv2_value_free(audio_class);
- slv2_value_free(event_class);
- slv2_value_free(midi_class);
- slv2_value_free(in_place_broken);
-}
-
-LV2PluginInfo::LV2PluginInfo (void* lv2_world, void* slv2_plugin)
- : _lv2_world(lv2_world)
- , _slv2_plugin(slv2_plugin)
-{
-}
-
-LV2PluginInfo::~LV2PluginInfo()
-{
-}
-
-PluginPtr
-LV2PluginInfo::load (Session& session)
-{
- try {
- PluginPtr plugin;
-
- plugin.reset (new LV2Plugin (session.engine(), session,
- *(LV2World*)_lv2_world, (SLV2Plugin)_slv2_plugin, session.frame_rate()));
-
- plugin->set_info(PluginInfoPtr(new LV2PluginInfo(*this)));
- return plugin;
- }
-
- catch (failed_constructor &err) {
- return PluginPtr ((Plugin*) 0);
- }
-
- return PluginPtr();
-}
-
-PluginInfoList
-LV2PluginInfo::discover (void* lv2_world)
-{
- PluginInfoList plugs;
-
- LV2World* world = (LV2World*)lv2_world;
- SLV2Plugins plugins = slv2_world_get_all_plugins(world->world);
-
- for (unsigned i=0; i < slv2_plugins_size(plugins); ++i) {
- SLV2Plugin p = slv2_plugins_get_at(plugins, i);
- LV2PluginInfoPtr info (new LV2PluginInfo(lv2_world, p));
-
- SLV2Value name = slv2_plugin_get_name(p);
- info->name = string(slv2_value_as_string(name));
- slv2_value_free(name);
-
- SLV2PluginClass pclass = slv2_plugin_get_class(p);
- SLV2Value label = slv2_plugin_class_get_label(pclass);
- info->category = slv2_value_as_string(label);
-
- SLV2Value author_name = slv2_plugin_get_author_name(p);
- info->creator = author_name ? string(slv2_value_as_string(author_name)) : "Unknown";
- slv2_value_free(author_name);
-
- info->path = "/NOPATH"; // Meaningless for LV2
-
- info->n_inputs.set_audio(slv2_plugin_get_num_ports_of_class(p,
- world->input_class, world->audio_class, NULL));
- info->n_inputs.set_midi(slv2_plugin_get_num_ports_of_class(p,
- world->input_class, world->event_class, NULL));
-
- info->n_outputs.set_audio(slv2_plugin_get_num_ports_of_class(p,
- world->output_class, world->audio_class, NULL));
- info->n_outputs.set_midi(slv2_plugin_get_num_ports_of_class(p,
- world->output_class, world->event_class, NULL));
-
- info->unique_id = slv2_value_as_uri(slv2_plugin_get_uri(p));
- info->index = 0; // Meaningless for LV2
-
- plugs.push_back (info);
- }
-
- return plugs;
-}
-