template<class Derived, class Ext1 = End, class Ext2 = End, class Ext3 = End, class Ext4 = End, class Ext5 = End, class Ext6 = End, class Ext7 = End, class Ext8 = End, class Ext9 = End>
class LV2::Plugin< Derived, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7, Ext8, Ext9 >
This is a template base class for LV2 plugins. It has default implementations for all functions, so you only have to implement the functions that you need (for example run()). All subclasses must have a constructor whose signature matches the one in the example code below, otherwise it will not work with the register_class() function. The host will use this double
parameter to pass the sample rate that the plugin should run at when it creates a new instance of the plugin.
This is a template so that simulated dynamic binding can be used for the callbacks. This is not all that useful for simple plugins but it may come in handy when using mixins and it doesn't add any additional vtable lookup and function call costs, like real dynamic binding would.
#include <cstring>
#include <lv2plugin.hpp>
public:
TestLV2(
double) : LV2::
Plugin<TestLV2>(2) { }
void run(uint32_t sample_count) {
std::memcpy(
p(1),
p(0), sample_count *
sizeof(
float));
}
};
static unsigned _ = TestLV2::register_class("http://ll-plugins.sf.net/plugins/TestLV2");
Definition lv2plugin.hpp:137
void run(uint32_t sample_count)
Definition lv2plugin.hpp:193
T *& p(uint32_t port)
Definition lv2plugin.hpp:257
Plugin(uint32_t ports)
Definition lv2plugin.hpp:146
If the above code is compiled and linked with -llv2_plugin
into a shared module, it could form the shared object part of a fully functional (but not very useful) LV2 plugin with one audio input port and one audio output port that just copies the input to the output.
You can extend your plugin classes, for example adding support for LV2 extensions, by passing mixin classes as template parameters to Plugin (second template parameter and onwards).
If you want to write a synth plugin you should probably inherit the Synth class instead of this one.
template<class Derived, class Ext1 = End, class Ext2 = End, class Ext3 = End, class Ext4 = End, class Ext5 = End, class Ext6 = End, class Ext7 = End, class Ext8 = End, class Ext9 = End>
void LV2::Plugin< Derived, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7, Ext8, Ext9 >::connect_port |
( |
uint32_t | port, |
|
|
void * | data_location ) |
|
inline |
Connects the ports. You shouldn't have to override this, just use p() to access the port buffers.
If you do override this function, remember that if you want your plugin to be realtime safe this function may not block, allocate memory or otherwise take a long time to return.
- Parameters
-
port | The index of the port to connect. |
data_location | The buffer to connect it to. |
template<class Derived, class Ext1 = End, class Ext2 = End, class Ext3 = End, class Ext4 = End, class Ext5 = End, class Ext6 = End, class Ext7 = End, class Ext8 = End, class Ext9 = End>
unsigned LV2::Plugin< Derived, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7, Ext8, Ext9 >::register_class |
( |
const std::string & | uri | ) |
|
|
inlinestatic |
Use this function to register your plugin class so that the host can find it. You need to do this when the shared library is loaded by the host. One portable way of doing that is to put the function call in the initialiser for a global variable, like this:
unsigned _ = MyPluginClass::register_class("http://my.plugin.class");
The return value is not important, it's just there so you can use that trick.
template<class Derived, class Ext1 = End, class Ext2 = End, class Ext3 = End, class Ext4 = End, class Ext5 = End, class Ext6 = End, class Ext7 = End, class Ext8 = End, class Ext9 = End>
void LV2::Plugin< Derived, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7, Ext8, Ext9 >::run |
( |
uint32_t | sample_count | ) |
|
|
inline |
This is the process callback which should fill all output port buffers. You most likely want to override it - the default implementation does nothing.
Remember that if you want your plugin to be realtime safe, this function may not block, allocate memory or take more than O(sample_count) time to execute.
- Parameters
-
sample_count | The number of audio frames to process/generate in this call. |