diff options
author | David Robillard <d@drobilla.net> | 2015-02-18 16:46:31 -0500 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2015-02-18 16:46:31 -0500 |
commit | 7506393c934bed3f5481af592d8276d5a651aa74 (patch) | |
tree | 452c106fd21e25e303721eea9d0cfb47ee8d167b | |
parent | 9b4b2b68f50db95da7d63a62a8ebee90be58da58 (diff) | |
download | lv2-7506393c934bed3f5481af592d8276d5a651aa74.tar.xz |
Revert "Add preliminary C++ work."
This reverts commit 9b4b2b68f50db95da7d63a62a8ebee90be58da58.
-rw-r--r-- | lv2/lv2plug.in/ns/lv2core/Plugin.hpp | 256 | ||||
-rw-r--r-- | plugins/eg-amppp.lv2/README.txt | 3 | ||||
-rw-r--r-- | plugins/eg-amppp.lv2/amppp.cpp | 78 | ||||
-rw-r--r-- | plugins/eg-amppp.lv2/amppp.ttl | 49 | ||||
-rw-r--r-- | plugins/eg-amppp.lv2/manifest.ttl.in | 7 | ||||
l--------- | plugins/eg-amppp.lv2/waf | 1 | ||||
-rw-r--r-- | plugins/eg-amppp.lv2/wscript | 66 | ||||
-rw-r--r-- | plugins/wscript | 11 | ||||
-rw-r--r-- | wscript | 9 |
9 files changed, 2 insertions, 478 deletions
diff --git a/lv2/lv2plug.in/ns/lv2core/Plugin.hpp b/lv2/lv2plug.in/ns/lv2core/Plugin.hpp deleted file mode 100644 index 763b4ff..0000000 --- a/lv2/lv2plug.in/ns/lv2core/Plugin.hpp +++ /dev/null @@ -1,256 +0,0 @@ -/* - Copyright 2015 David Robillard <http://drobilla.net> - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -#ifndef LV2_PLUGIN_HPP -#define LV2_PLUGIN_HPP - -#include "lv2/lv2plug.in/ns/lv2core/lv2.h" - -namespace lv2 { - -/** - C++ wrapper for an LV2 plugin. - - This interface is a convenience for plugin authors only, and is not an ABI - used by hosts. Plugin authors should inherit from this interface, and use - the resulting class as the template parameter to lv2::set_descriptor() to - initialise a descriptor for the plugin. - - This class is a stateless interface and imposes no restrictions or overhead - compared to a plugin implemented using the underlying C interface. Note - that this is not a virtual class, so calling methods from a Plugin* base - pointer will not work. Instead, anything that must dispatch on Plugin - methods takes a template parameter for static dispatch. -*/ -class Plugin -{ -public: - /** - Instantiate the plugin. - - Note that instance initialisation should generally occur in activate() - rather than here. If a host calls instantiate(), it MUST call cleanup() - at some point in the future. - - @param sample_rate Sample rate, in Hz, for the new plugin instance. - - @param bundle_path Path to the LV2 bundle which contains this plugin - binary. It MUST include the trailing directory separator (e.g. '/') so - that simply appending a filename will yield the path to that file in the - bundle. - - @param features A NULL terminated array of LV2_Feature structs which - represent the features the host supports. Plugins may refuse to - instantiate if required features are not found here. However, hosts MUST - NOT use this as a discovery mechanism: instead, use the RDF data to - determine which features are required and do not attempt to instantiate - unsupported plugins at all. This parameter MUST NOT be NULL, i.e. a host - that supports no features MUST pass a single element array containing - NULL. - - @return A handle for the new plugin instance, or NULL if instantiation - has failed. - */ - Plugin(double sample_rate, - const char* bundle_path, - const LV2_Feature*const* features) - {} - - /** - Connect a port on a plugin instance to a memory location. - - Plugin writers should be aware that the host may elect to use the same - buffer for more than one port and even use the same buffer for both - input and output (see lv2:inPlaceBroken in lv2.ttl). - - If the plugin has the feature lv2:hardRTCapable then there are various - things that the plugin MUST NOT do within the connect_port() function; - see lv2core.ttl for details. - - connect_port() MUST be called at least once for each port before run() - is called, unless that port is lv2:connectionOptional. The plugin must - pay careful attention to the block size passed to run() since the block - allocated may only just be large enough to contain the data, and is not - guaranteed to remain constant between run() calls. - - connect_port() may be called more than once for a plugin instance to - allow the host to change the buffers that the plugin is reading or - writing. These calls may be made before or after activate() or - deactivate() calls. - - @param port Index of the port to connect. The host MUST NOT try to - connect a port index that is not defined in the plugin's RDF data. If - it does, the plugin's behaviour is undefined (a crash is likely). - - @param data_location Pointer to data of the type defined by the port - type in the plugin's RDF data (e.g. an array of float for an - lv2:AudioPort). This pointer must be stored by the plugin instance and - used to read/write data when run() is called. Data present at the time - of the connect_port() call MUST NOT be considered meaningful. - */ - void connect_port(uint32_t port, void* data_location) {} - - /** - Initialise a plugin instance and activate it for use. - - This is separated from instantiate() to aid real-time support and so - that hosts can reinitialise a plugin instance by calling deactivate() - and then activate(). In this case the plugin instance MUST reset all - state information dependent on the history of the plugin instance except - for any data locations provided by connect_port(). If there is nothing - for activate() to do then this field may be NULL. - - When present, hosts MUST call this function once before run() is called - for the first time. This call SHOULD be made as close to the run() call - as possible and indicates to real-time plugins that they are now live, - however plugins MUST NOT rely on a prompt call to run() after - activate(). - - The host MUST NOT call activate() again until deactivate() has been - called first. If a host calls activate(), it MUST call deactivate() at - some point in the future. Note that connect_port() may be called before - or after activate(). - */ - void activate() {} - - /** - Run a plugin instance for a block. - - Note that if an activate() function exists then it must be called before - run(). If deactivate() is called for a plugin instance then run() may - not be called until activate() has been called again. - - If the plugin has the feature lv2:hardRTCapable then there are various - things that the plugin MUST NOT do within the run() function (see - lv2core.ttl for details). - - As a special case, when `sample_count` is 0, the plugin should update - any output ports that represent a single instant in time (e.g. control - ports, but not audio ports). This is particularly useful for latent - plugins, which should update their latency output port so hosts can - pre-roll plugins to compute latency. Plugins MUST NOT crash when - `sample_count` is 0. - - @param sample_count The block size (in samples) for which the plugin - instance must run. - */ - void run(uint32_t sample_count) {} - - /** - Deactivate a plugin instance (counterpart to activate()). - - Hosts MUST deactivate all activated instances after they have been run() - for the last time. This call SHOULD be made as close to the last run() - call as possible and indicates to real-time plugins that they are no - longer live, however plugins MUST NOT rely on prompt deactivation. If - there is nothing for deactivate() to do then this field may be NULL - - Deactivation is not similar to pausing since the plugin instance will be - reinitialised by activate(). However, deactivate() itself MUST NOT fully - reset plugin state. For example, the host may deactivate a plugin, then - store its state (using some extension to do so). - - Hosts MUST NOT call deactivate() unless activate() was previously - called. Note that connect_port() may be called before or after - deactivate(). - */ - void deactivate() {} - - /** - Return additional plugin data defined by some extenion. - - A typical use of this facility is to return a struct containing function - pointers to extend the LV2_Descriptor API. - - The actual type and meaning of the returned object MUST be specified - precisely by the extension. This function MUST return NULL for any - unsupported URI. If a plugin does not support any extension data, this - field may be NULL. - - The host is never responsible for freeing the returned value. - */ - static const void* extension_data(const char* uri) { return NULL; } -}; - -template<typename Plugin> -static LV2_Handle s_instantiate(const LV2_Descriptor* descriptor, - double sample_rate, - const char* bundle_path, - const LV2_Feature* const* features) { - Plugin* t = new Plugin(sample_rate, bundle_path, features); - if (!t) { - delete t; - return nullptr; - } - - return reinterpret_cast<LV2_Handle>(t); -} - -template<typename Plugin> -static void s_connect_port(LV2_Handle instance, uint32_t port, void* buf) -{ - reinterpret_cast<Plugin*>(instance)->connect_port(port, buf); -} - -template<typename Plugin> -static void s_activate(LV2_Handle instance) -{ - reinterpret_cast<Plugin*>(instance)->activate(); -} - -template<typename Plugin> -static void s_run(LV2_Handle instance, uint32_t sample_count) -{ - reinterpret_cast<Plugin*>(instance)->run(sample_count); -} - -template<typename Plugin> -static void s_deactivate(LV2_Handle instance) -{ - reinterpret_cast<Plugin*>(instance)->deactivate(); -} - -template<typename Plugin> -static void s_cleanup(LV2_Handle instance) -{ - delete reinterpret_cast<Plugin*>(instance); -} - -/** - Get an LV2_Descriptor for a plugin class. - - @code - static const LV2_Descriptor a = lv2::descriptor<Amp>("http://example.org/amp"); - @endcode -*/ -template<typename Plugin> -static LV2_Descriptor -descriptor(const char* uri) -{ - const LV2_Descriptor desc = { uri, - &s_instantiate<Plugin>, - &s_connect_port<Plugin>, - &s_activate<Plugin>, - &s_run<Plugin>, - &s_deactivate<Plugin>, - &s_cleanup<Plugin>, - &Plugin::extension_data }; - return desc; -} - -} /* namespace lv2 */ - -#endif /* LV2_PLUGIN_HPP */ diff --git a/plugins/eg-amppp.lv2/README.txt b/plugins/eg-amppp.lv2/README.txt deleted file mode 100644 index a5cb36c..0000000 --- a/plugins/eg-amppp.lv2/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -== Simple C++ Amplifier == - -This is a version of the simple amplifier example, but written in C++. diff --git a/plugins/eg-amppp.lv2/amppp.cpp b/plugins/eg-amppp.lv2/amppp.cpp deleted file mode 100644 index ac939c0..0000000 --- a/plugins/eg-amppp.lv2/amppp.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* - Copyright 2015 David Robillard <d@drobilla.net> - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -#include <math.h> -#include <stdlib.h> - -#include "lv2/lv2plug.in/ns/lv2core/Plugin.hpp" - -class Amppp : public lv2::Plugin { -public: - Amppp(double rate, - const char* bundle_path, - const LV2_Feature* const* features) - : Plugin(rate, bundle_path, features) - {} - - typedef enum { - AMP_GAIN = 0, - AMP_INPUT = 1, - AMP_OUTPUT = 2 - } PortIndex; - - void connect_port(uint32_t port, void* data) { - switch ((PortIndex)port) { - case AMP_GAIN: - m_ports.gain = (const float*)data; - break; - case AMP_INPUT: - m_ports.input = (const float*)data; - break; - case AMP_OUTPUT: - m_ports.output = (float*)data; - break; - } - } - - #define DB_CO(g) ((g) > -90.0f ? powf(10.0f, (g) * 0.05f) : 0.0f) - - void run(uint32_t n_samples) { - const float coef = DB_CO(*m_ports.gain); - for (uint32_t pos = 0; pos < n_samples; pos++) { - m_ports.output[pos] = m_ports.input[pos] * coef; - } - } - -private: - typedef struct { - const float* gain; - const float* input; - float* output; - } Ports; - - Ports m_ports; -}; - -static const LV2_Descriptor descriptor = lv2::descriptor<Amppp>("http://lv2plug.in/plugins/eg-amppp"); - -LV2_SYMBOL_EXPORT const LV2_Descriptor* -lv2_descriptor(uint32_t index) -{ - switch (index) { - case 0: return &descriptor; - default: return NULL; - } -} diff --git a/plugins/eg-amppp.lv2/amppp.ttl b/plugins/eg-amppp.lv2/amppp.ttl deleted file mode 100644 index 1d90459..0000000 --- a/plugins/eg-amppp.lv2/amppp.ttl +++ /dev/null @@ -1,49 +0,0 @@ -@prefix doap: <http://usefulinc.com/ns/doap#> . -@prefix lv2: <http://lv2plug.in/ns/lv2core#> . -@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . -@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . -@prefix units: <http://lv2plug.in/ns/extensions/units#> . - -<http://lv2plug.in/plugins/eg-amppp> - a lv2:Plugin , - lv2:AmplifierPlugin ; - lv2:project <http://lv2plug.in/ns/lv2> ; - doap:name "Simple C++ Amplifier" ; - doap:license <http://opensource.org/licenses/isc> ; - lv2:optionalFeature lv2:hardRTCapable ; - lv2:port [ - a lv2:InputPort , - lv2:ControlPort ; - lv2:index 0 ; - lv2:symbol "gain" ; - lv2:name "Gain" ; - lv2:default 0.0 ; - lv2:minimum -90.0 ; - lv2:maximum 24.0 ; - units:unit units:db ; - lv2:scalePoint [ - rdfs:label "+5" ; - rdf:value 5.0 - ] , [ - rdfs:label "0" ; - rdf:value 0.0 - ] , [ - rdfs:label "-5" ; - rdf:value -5.0 - ] , [ - rdfs:label "-10" ; - rdf:value -10.0 - ] - ] , [ - a lv2:AudioPort , - lv2:InputPort ; - lv2:index 1 ; - lv2:symbol "in" ; - lv2:name "In" - ] , [ - a lv2:AudioPort , - lv2:OutputPort ; - lv2:index 2 ; - lv2:symbol "out" ; - lv2:name "Out" - ] . diff --git a/plugins/eg-amppp.lv2/manifest.ttl.in b/plugins/eg-amppp.lv2/manifest.ttl.in deleted file mode 100644 index 4985490..0000000 --- a/plugins/eg-amppp.lv2/manifest.ttl.in +++ /dev/null @@ -1,7 +0,0 @@ -@prefix lv2: <http://lv2plug.in/ns/lv2core#> . -@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . - -<http://lv2plug.in/plugins/eg-amppp> - a lv2:Plugin ; - lv2:binary <amppp@LIB_EXT@> ; - rdfs:seeAlso <amppp.ttl> . diff --git a/plugins/eg-amppp.lv2/waf b/plugins/eg-amppp.lv2/waf deleted file mode 120000 index 59a1ac9..0000000 --- a/plugins/eg-amppp.lv2/waf +++ /dev/null @@ -1 +0,0 @@ -../../waf
\ No newline at end of file diff --git a/plugins/eg-amppp.lv2/wscript b/plugins/eg-amppp.lv2/wscript deleted file mode 100644 index 27b1039..0000000 --- a/plugins/eg-amppp.lv2/wscript +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python -from waflib.extras import autowaf as autowaf -import re - -# Variables for 'waf dist' -APPNAME = 'eg-amppp.lv2' -VERSION = '1.0.0' - -# Mandatory variables -top = '.' -out = 'build' - -def options(opt): - opt.load('compiler_cxx') - autowaf.set_options(opt) - -def configure(conf): - conf.load('compiler_cxx') - autowaf.configure(conf) - autowaf.set_c99_mode(conf) - autowaf.display_header('Amppp Configuration') - - if not autowaf.is_child(): - autowaf.check_pkg(conf, 'lv2', uselib_store='LV2') - - conf.check(features='cxx cxxshlib', lib='m', uselib_store='M', mandatory=False) - - autowaf.display_msg(conf, 'LV2 bundle directory', conf.env.LV2DIR) - print('') - -def build(bld): - bundle = 'eg-amppp.lv2' - - # Make a pattern for shared objects without the 'lib' prefix - module_pat = re.sub('^lib', '', bld.env.cshlib_PATTERN) - module_ext = module_pat[module_pat.rfind('.'):] - - # Build manifest.ttl by substitution (for portable lib extension) - bld(features = 'subst', - source = 'manifest.ttl.in', - target = '%s/%s' % (bundle, 'manifest.ttl'), - install_path = '${LV2DIR}/%s' % bundle, - LIB_EXT = module_ext) - - # Copy other data files to build bundle (build/eg-amppp.lv2) - for i in ['amppp.ttl']: - bld(features = 'subst', - is_copy = True, - source = i, - target = '%s/%s' % (bundle, i), - install_path = '${LV2DIR}/%s' % bundle) - - # Use LV2 headers from parent directory if building as a sub-project - includes = None - if autowaf.is_child: - includes = '../..' - - # Build plugin library - obj = bld(features = 'cxx cxxshlib', - source = 'amppp.cpp', - name = 'amppp', - target = '%s/amppp' % bundle, - install_path = '${LV2DIR}/%s' % bundle, - uselib = 'M LV2', - includes = includes) - obj.env.cxxshlib_PATTERN = module_pat diff --git a/plugins/wscript b/plugins/wscript index 28e5e02..f099183 100644 --- a/plugins/wscript +++ b/plugins/wscript @@ -15,7 +15,7 @@ def bld_book_src(task): filenames += [i.abspath()] literasc.gen(open(task.outputs[0].abspath(), 'w'), filenames) - + def build(bld): files = [bld.path.find_node('README.txt')] for i in ['eg-amp.lv2', @@ -29,14 +29,6 @@ def build(bld): files += bld.path.ant_glob('%s/*.ttl' % i) files += bld.path.ant_glob('%s/*.c' % i) - if bld.env.BUILD_CXX: - for i in ['eg-amppp.lv2']: - print i - files += bld.path.ant_glob('%s/*.txt' % i) - files += bld.path.ant_glob('%s/manifest.ttl*' % i) - files += bld.path.ant_glob('%s/*.ttl' % i) - files += bld.path.ant_glob('%s/*.cpp' % i) - # Compile book sources into book.txt asciidoc source bld(rule = bld_book_src, source = files, @@ -49,3 +41,4 @@ def build(bld): stylesdir, pygments_style), source = 'book.txt', target = 'book.html') + @@ -23,7 +23,6 @@ out = 'build' def options(opt): opt.load('compiler_c') - opt.load('compiler_cxx') opt.load('lv2') autowaf.set_options(opt) opt.add_option('--test', action='store_true', dest='build_tests', @@ -32,8 +31,6 @@ def options(opt): help='Build documentation for web hosting') opt.add_option('--no-plugins', action='store_true', dest='no_plugins', help='Do not build example plugins') - opt.add_option('--no-cxx', action='store_true', dest='no_cxx', - help='Do not build C++ plugins') opt.add_option('--copy-headers', action='store_true', dest='copy_headers', help='Copy headers instead of linking to bundle') opt.recurse('lv2/lv2plug.in/ns/lv2core') @@ -46,17 +43,11 @@ def configure(conf): Options.options.build_tests = False Options.options.no_plugins = True - if not Options.options.no_plugins and not Options.options.no_cxx: - conf.load('compiler_cxx') - conf.env.BUILD_CXX = True - if Options.options.online_docs: Options.options.docs = True autowaf.configure(conf) autowaf.set_c99_mode(conf) - if conf.env.BUILD_CXX: - conf.env.append_value('CXXFLAGS', ['-std=c++0x']) if Options.options.ultra_strict: conf.env.append_value('CFLAGS', ['-Wconversion']) |