2 Copyright (C) 2008 Paul Davis
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #ifndef __ardour_lv2_plugin_h__
22 #define __ardour_lv2_plugin_h__
29 #include <sigc++/signal.h>
31 #include <pbd/stateful.h>
33 #include <jack/types.h>
34 #include <slv2/slv2.h>
35 #include <ardour/plugin.h>
42 class LV2Plugin
: public ARDOUR::Plugin
45 LV2Plugin (ARDOUR::AudioEngine
&, ARDOUR::Session
&, ARDOUR::LV2World
&, SLV2Plugin plugin
, nframes_t sample_rate
);
46 LV2Plugin (const LV2Plugin
&);
49 /* Plugin interface */
51 std::string
unique_id() const;
52 const char* label() const { return slv2_value_as_string(_name
); }
53 const char* name() const { return slv2_value_as_string(_name
); }
54 const char* maker() const { return _author
? slv2_value_as_string(_author
) : "Unknown"; }
55 uint32_t parameter_count() const { return slv2_plugin_get_num_ports(_plugin
); }
56 float default_value (uint32_t port
);
57 nframes_t
latency() const;
58 void set_parameter (uint32_t port
, float val
);
59 float get_parameter (uint32_t port
) const;
60 int get_parameter_descriptor (uint32_t which
, ParameterDescriptor
&) const;
61 uint32_t nth_parameter (uint32_t port
, bool& ok
) const;
63 const void* extension_data(const char* uri
) { return _instance
->lv2_descriptor
->extension_data(uri
); }
65 SLV2Plugin
slv2_plugin() { return _plugin
; }
66 SLV2UI
slv2_ui() { return _ui
; }
67 bool is_external_ui() const;
68 SLV2Port
slv2_port(uint32_t i
) { return slv2_plugin_get_port_by_index(_plugin
, i
); }
70 const char* port_symbol(uint32_t port
);
72 const LV2_Feature
* const* features() { return _features
; }
74 std::set
<uint32_t> automatable() const;
77 if (!_was_activated
) {
78 slv2_instance_activate(_instance
);
79 _was_activated
= true;
85 slv2_instance_deactivate(_instance
);
86 _was_activated
= false;
93 slv2_instance_free(_instance
);
97 int set_block_size (nframes_t nframes
) { return 0; }
99 int connect_and_run (std::vector
<Sample
*>& bufs
, uint32_t maxbuf
, int32_t& in
, int32_t& out
, nframes_t nframes
, nframes_t offset
);
100 std::string
describe_parameter (uint32_t);
101 std::string
state_node_name() const { return "lv2"; }
102 void print_parameter (uint32_t, char*, uint32_t len
) const;
104 bool parameter_is_audio(uint32_t) const;
105 bool parameter_is_control(uint32_t) const;
106 bool parameter_is_input(uint32_t) const;
107 bool parameter_is_output(uint32_t) const;
108 bool parameter_is_toggled(uint32_t) const;
110 XMLNode
& get_state();
111 int set_state(const XMLNode
& node
);
112 bool save_preset(std::string name
);
114 bool has_editor() const;
119 LV2_Feature
** _features
;
124 SLV2Instance _instance
;
125 nframes_t _sample_rate
;
126 float* _control_data
;
129 float* _latency_control_port
;
131 vector
<bool> _port_is_input
;
133 typedef struct { const void* (*extension_data
)(const char* uri
); } LV2_DataAccess
;
134 LV2_DataAccess _data_access_extension_data
;
135 LV2_Feature _data_access_feature
;
136 LV2_Feature _instance_access_feature
;
138 void init (LV2World
& world
, SLV2Plugin plugin
, nframes_t rate
);
139 void run (nframes_t nsamples
);
140 void latency_compute_run ();
144 /** The SLV2World, and various cached (as symbols, fast) URIs.
146 * This object represents everything ardour 'knows' about LV2
147 * (ie understood extensions/features/etc)
154 SLV2Value input_class
;
155 SLV2Value output_class
;
156 SLV2Value audio_class
;
157 SLV2Value control_class
;
158 SLV2Value in_place_broken
;
163 SLV2Value external_gui
;
164 SLV2Value logarithmic
;
168 class LV2PluginInfo
: public PluginInfo
{
170 LV2PluginInfo (void* slv2_world
, void* slv2_plugin
);;
172 static PluginInfoList
discover (void* slv2_world
);
174 PluginPtr
load (Session
& session
);
180 typedef boost::shared_ptr
<LV2PluginInfo
> LV2PluginInfoPtr
;
182 } // namespace ARDOUR
184 #endif /* __ardour_lv2_plugin_h__ */