+
/*
- Copyright (C) 2008 Paul Davis
- Author: Dave Robillard
+ Copyright (C) 2008-2011 Paul Davis
+ Author: David 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
#define __ardour_lv2_plugin_h__
#include <set>
-#include <vector>
#include <string>
-#include <dlfcn.h>
+#include <vector>
+#include <dlfcn.h>
#include "pbd/stateful.h"
#include <jack/types.h>
-#include <slv2/slv2.h>
+
#include "ardour/plugin.h"
#include "ardour/uri_map.h"
namespace ARDOUR {
+
class AudioEngine;
class Session;
-struct LV2World;
class LV2Plugin : public ARDOUR::Plugin
{
public:
- LV2Plugin (ARDOUR::AudioEngine&, ARDOUR::Session&, ARDOUR::LV2World&, SLV2Plugin plugin, nframes_t sample_rate);
+ LV2Plugin (ARDOUR::AudioEngine& engine,
+ ARDOUR::Session& session,
+ void* c_plugin,
+ framecnt_t sample_rate);
LV2Plugin (const LV2Plugin &);
~LV2Plugin ();
- /* Plugin interface */
-
- std::string unique_id() const;
- const char* label() const { return slv2_value_as_string(_name); }
- const char* name() const { return slv2_value_as_string(_name); }
- const char* maker() const { return _author ? slv2_value_as_string(_author) : "Unknown"; }
- uint32_t parameter_count() const { return slv2_plugin_get_num_ports(_plugin); }
- float default_value (uint32_t port);
- nframes_t signal_latency() const;
- void set_parameter (uint32_t port, float val);
- float get_parameter (uint32_t port) const;
- int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
- uint32_t nth_parameter (uint32_t port, bool& ok) const;
+ std::string unique_id () const;
+ const char* uri () const;
+ const char* label () const;
+ const char* name () const;
+ const char* maker () const;
- const void* extension_data(const char* uri) { return _instance->lv2_descriptor->extension_data(uri); }
+ uint32_t num_ports () const;
+ uint32_t parameter_count () const;
+ float default_value (uint32_t port);
+ framecnt_t signal_latency () const;
+ void set_parameter (uint32_t port, float val);
+ float get_parameter (uint32_t port) const;
+ int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
+ uint32_t nth_parameter (uint32_t port, bool& ok) const;
- SLV2Plugin slv2_plugin() { return _plugin; }
- SLV2UI slv2_ui() { return _ui; }
- bool is_external_ui() const;
- SLV2Port slv2_port(uint32_t i) { return slv2_plugin_get_port_by_index(_plugin, i); }
+ const void* extension_data (const char* uri) const;
- const char* port_symbol(uint32_t port);
+ void* c_plugin();
+ void* c_ui();
+ void* c_ui_type();
- const LV2_Feature* const* features() { return _features; }
+ bool is_external_ui () const;
- std::set<Evoral::Parameter> automatable() const;
+ const char* port_symbol (uint32_t port) const;
- void activate () {
- if (!_was_activated) {
- slv2_instance_activate(_instance);
- _was_activated = true;
- }
- }
+ const LV2_Feature* const* features () { return _features; }
- void deactivate () {
- if (_was_activated) {
- slv2_instance_deactivate(_instance);
- _was_activated = false;
- }
- }
+ std::set<Evoral::Parameter> automatable () const;
- void cleanup () {
- activate();
- deactivate();
- slv2_instance_free(_instance);
- _instance = NULL;
- }
+ void activate ();
+ void deactivate ();
+ void cleanup ();
- int set_block_size (nframes_t /*nframes*/) { return 0; }
+ int set_block_size (pframes_t /*nframes*/) { return 0; }
int connect_and_run (BufferSet& bufs,
- ChanMapping in, ChanMapping out,
- nframes_t nframes, nframes_t offset);
+ ChanMapping in, ChanMapping out,
+ pframes_t nframes, framecnt_t offset);
std::string describe_parameter (Evoral::Parameter);
- std::string state_node_name() const { return "lv2"; }
- void print_parameter (uint32_t, char*, uint32_t len) const;
+ std::string state_node_name () const { return "lv2"; }
+
+ void print_parameter (uint32_t param,
+ char* buf,
+ uint32_t len) const;
+
+ bool parameter_is_audio (uint32_t) const;
+ bool parameter_is_control (uint32_t) const;
+ bool parameter_is_midi (uint32_t) const;
+ bool parameter_is_input (uint32_t) const;
+ bool parameter_is_output (uint32_t) const;
+ bool parameter_is_toggled (uint32_t) const;
- bool parameter_is_audio(uint32_t) const;
- bool parameter_is_control(uint32_t) const;
- bool parameter_is_midi(uint32_t) const;
- bool parameter_is_input(uint32_t) const;
- bool parameter_is_output(uint32_t) const;
- bool parameter_is_toggled(uint32_t) const;
+ boost::shared_ptr<Plugin::ScalePoints>
+ get_scale_points(uint32_t port_index) const;
- static uint32_t midi_event_type() { return _midi_event_type; }
+ static uint32_t midi_event_type () { return _midi_event_type; }
- XMLNode& get_state();
- int set_state(const XMLNode& node, int version);
- bool save_preset(std::string uri);
- bool load_preset(const std::string& uri);
- virtual std::vector<Plugin::PresetRecord> get_presets();
+ void set_insert_info(const PluginInsert* insert);
- bool has_editor() const;
+ int set_state (const XMLNode& node, int version);
+ bool save_preset (std::string uri);
+ void remove_preset (std::string uri);
+ bool load_preset (PresetRecord);
+ std::string current_preset () const;
+
+ bool has_editor () const;
private:
- void* _module;
- LV2World& _world;
- LV2_Feature** _features;
- SLV2Plugin _plugin;
- SLV2UI _ui;
- SLV2Value _name;
- SLV2Value _author;
- SLV2Instance _instance;
- nframes_t _sample_rate;
- float* _control_data;
- float* _shadow_data;
- float* _defaults;
- float* _latency_control_port;
- bool _was_activated;
- std::vector<bool> _port_is_input;
+ struct Impl;
+ Impl* _impl;
+ void* _module;
+ LV2_Feature** _features;
+ framecnt_t _sample_rate;
+ float* _control_data;
+ float* _shadow_data;
+ float* _defaults;
+ float* _latency_control_port;
+ bool _was_activated;
+ bool _supports_persist;
+ std::vector<bool> _port_is_input;
+
std::map<std::string,uint32_t> _port_indices;
- typedef struct { const void* (*extension_data)(const char* uri); } LV2_DataAccess;
+ PBD::ID _insert_id;
+
+ typedef struct {
+ const void* (*extension_data) (const char* uri);
+ } LV2_DataAccess;
+
LV2_DataAccess _data_access_extension_data;
- LV2_Feature _data_access_feature;
- LV2_Feature _instance_access_feature;
+ LV2_Feature _data_access_feature;
+ LV2_Feature _instance_access_feature;
+ LV2_Feature _path_support_feature;
+ LV2_Feature _new_file_support_feature;
+ LV2_Feature _persist_feature;
static URIMap _uri_map;
static uint32_t _midi_event_type;
- void init (LV2World& world, SLV2Plugin plugin, nframes_t rate);
- void run (nframes_t nsamples);
- void latency_compute_run ();
-};
-
+ static int lv2_persist_store_callback (void* host_data,
+ uint32_t key,
+ const void* value,
+ size_t size,
+ uint32_t type,
+ uint32_t flags);
+ static const void* lv2_persist_retrieve_callback (void* host_data,
+ uint32_t key,
+ size_t* size,
+ uint32_t* type,
+ uint32_t* flags);
+ static char* lv2_files_abstract_path (void* host_data,
+ const char* absolute_path);
+ static char* lv2_files_absolute_path (void* host_data,
+ const char* abstract_path);
+ static char* lv2_files_new_file_path (void* host_data,
+ const char* relative_path);
+
+ void init (void* c_plugin, framecnt_t rate);
+ void run (pframes_t nsamples);
-/** The SLV2World, and various cached (as symbols, fast) URIs.
- *
- * This object represents everything ardour 'knows' about LV2
- * (ie understood extensions/features/etc)
- */
-struct LV2World {
- LV2World();
- ~LV2World();
-
- SLV2World world;
- SLV2Value input_class; ///< Input port
- SLV2Value output_class; ///< Output port
- SLV2Value audio_class; ///< Audio port
- SLV2Value control_class; ///< Control port
- SLV2Value event_class; ///< Event port
- SLV2Value midi_class; ///< MIDI event
- SLV2Value in_place_broken;
- SLV2Value integer;
- SLV2Value toggled;
- SLV2Value srate;
- SLV2Value gtk_gui;
- SLV2Value external_gui;
- SLV2Value logarithmic;
+ void latency_compute_run ();
+ std::string do_save_preset (std::string);
+ void do_remove_preset (std::string);
+ void find_presets ();
+ void add_state (XMLNode *) const;
};
class LV2PluginInfo : public PluginInfo {
public:
- LV2PluginInfo (void* slv2_world, void* slv2_plugin);;
- ~LV2PluginInfo ();;
- static PluginInfoList* discover (void* slv2_world);
+ LV2PluginInfo (void* c_plugin);
+ ~LV2PluginInfo ();
+
+ static PluginInfoList* discover ();
PluginPtr load (Session& session);
- void* _lv2_world;
- void* _slv2_plugin;
+ void* _c_plugin;
};
typedef boost::shared_ptr<LV2PluginInfo> LV2PluginInfoPtr;