X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fplugin.h;h=f9831afcad3e06060577e6346dd6be5d1dfeb028;hb=22b07e0233a29d9633ffa825a79503befaf2e16e;hp=a69b87efbdf14da59ddce9cbc0aea969bc2be207;hpb=8c9749e42faf7808034ed8b7afce4a2fe6dc6f33;p=ardour.git diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h index a69b87efbd..f9831afcad 100644 --- a/libs/ardour/ardour/plugin.h +++ b/libs/ardour/ardour/plugin.h @@ -26,15 +26,16 @@ #include "pbd/statefuldestructible.h" #include "pbd/controllable.h" -#include +#include "ardour/buffer_set.h" #include "ardour/chan_count.h" #include "ardour/chan_mapping.h" #include "ardour/cycles.h" #include "ardour/latent.h" -#include "ardour/plugin_insert.h" #include "ardour/libardour_visibility.h" -#include "ardour/types.h" #include "ardour/midi_state_tracker.h" +#include "ardour/parameter_descriptor.h" +#include "ardour/types.h" +#include "ardour/variant.h" #include #include @@ -45,7 +46,7 @@ namespace ARDOUR { class AudioEngine; class Session; class BufferSet; - +class PluginInsert; class Plugin; typedef boost::shared_ptr PluginPtr; @@ -66,7 +67,7 @@ class LIBARDOUR_API PluginInfo { std::string unique_id; virtual PluginPtr load (Session& session) = 0; - virtual bool is_instrument() const; + virtual bool is_instrument() const; /* NOTE: this block of virtual methods looks like the interface to a Processor, but Plugin does not inherit from Processor. @@ -95,46 +96,10 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent Plugin (const Plugin&); virtual ~Plugin (); - struct ParameterDescriptor { - - ParameterDescriptor () - : integer_step(false) - , toggled (false) - , logarithmic (false) - , sr_dependent (false) - , lower (0) - , upper (0) - , step (0) - , smallstep (0) - , largestep (0) - , min_unbound (0) - , max_unbound (0) - , enumeration (false) - , midinote(false) - {} - - /* essentially a union of LADSPA, VST and LV2 info */ - - bool integer_step; - bool toggled; - bool logarithmic; - bool sr_dependent; - std::string label; - float lower; ///< if this is a frequency, it will be in Hz (not a fraction of the sample rate) - float upper; ///< if this is a frequency, it will be in Hz (not a fraction of the sample rate) - float step; - float smallstep; - float largestep; - bool min_unbound; - bool max_unbound; - bool enumeration; - bool midinote; ///< only used if integer_step is also true - }; - XMLNode& get_state (); virtual int set_state (const XMLNode &, int version); - virtual void set_insert_info (const PluginInsert*) {} + virtual void set_insert_id (PBD::ID id) {} virtual std::string unique_id() const = 0; virtual const char * label() const = 0; @@ -168,8 +133,6 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent virtual bool parameter_is_input(uint32_t) const = 0; virtual bool parameter_is_output(uint32_t) const = 0; - typedef std::map ScalePoints; - virtual boost::shared_ptr get_scale_points(uint32_t /*port_index*/) const { return boost::shared_ptr(); } @@ -181,11 +144,11 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent struct PresetRecord { PresetRecord () : number (-1), user (true) {} PresetRecord (const std::string& u, const std::string& l, int n = -1, bool s = true) : uri (u), label (l), number (n), user (s) {} - + bool operator!= (PresetRecord const & a) const { return number != a.number || uri != a.uri || label != a.label; } - + std::string uri; std::string label; int number; // if <0, invalid @@ -203,25 +166,25 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent std::vector get_presets (); - /** @return true if this plugin will respond to MIDI program + /** @return true if this plugin will respond to MIDI program * change messages by changing presets. * * This is hard to return a correct value for because most plugin APIs * do not specify plugin behaviour. However, if you want to force - * the display of plugin built-in preset names rather than MIDI program - * numbers, return true. If you want a generic description, return + * the display of plugin built-in preset names rather than MIDI program + * numbers, return true. If you want a generic description, return * false. - */ - virtual bool presets_are_MIDI_programs() const { return false; } + */ + virtual bool presets_are_MIDI_programs() const { return false; } - /** @return true if this plugin is General MIDI compliant, false + /** @return true if this plugin is General MIDI compliant, false * otherwise. * * It is important to note that it is is almost impossible for a host * (e.g. Ardour) to determine this for just about any plugin API * known as of June 2012 */ - virtual bool current_preset_uses_general_midi() const { return false; } + virtual bool current_preset_uses_general_midi() const { return false; } /** @return Last preset to be requested; the settings may have * been changed since; find out with parameter_changed_since_last_preset. @@ -268,13 +231,47 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent void set_cycles (uint32_t c) { _cycles = c; } cycles_t cycles() const { return _cycles; } - PBD::Signal1 StartTouch; - PBD::Signal1 EndTouch; + typedef std::map PropertyDescriptors; + + /** Get a descrption of all properties supported by this plugin. + * + * Properties are distinct from parameters in that they are potentially + * dynamic, referred to by key, and do not correspond 1:1 with ports. + * + * For LV2 plugins, properties are implemented by sending/receiving set/get + * messages to/from the plugin via event ports. + */ + virtual const PropertyDescriptors& get_supported_properties() const { + static const PropertyDescriptors nothing; + return nothing; + } + + virtual const ParameterDescriptor& get_property_descriptor(uint32_t id) const { + static const ParameterDescriptor nothing; + return nothing; + } + + /** Set a property from the UI. + * + * This is not UI-specific, but may only be used by one thread. If the + * Ardour UI is present, that is the UI thread, but otherwise, any thread + * except the audio thread may call this function as long as it is not + * called concurrently. + */ + virtual void set_property(uint32_t key, const Variant& value) {} + + /** Emit PropertyChanged for all current property values. */ + virtual void announce_property_values() {} + + /** Emitted when a property is changed in the plugin. */ + PBD::Signal2 PropertyChanged; + + PBD::Signal1 StartTouch; + PBD::Signal1 EndTouch; protected: friend class PluginInsert; - friend struct PluginInsert::PluginControl; virtual void set_parameter (uint32_t which, float val);