X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fplugin.h;h=fcd7d6d19b81c77f6d59fe07d7973e9840734349;hb=0938a42440cc82ce8d0cb064840c258c863714ab;hp=828e532c6a54a7b129a38a3ea76e5b4b80e3392d;hpb=40c162d6096f9bb338b602fb7845234133285411;p=ardour.git diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h index 828e532c6a..fcd7d6d19b 100644 --- a/libs/ardour/ardour/plugin.h +++ b/libs/ardour/ardour/plugin.h @@ -33,6 +33,7 @@ #include "ardour/latent.h" #include "ardour/plugin_insert.h" #include "ardour/types.h" +#include "ardour/midi_state_tracker.h" #include #include @@ -89,8 +90,8 @@ class Plugin : public PBD::StatefulDestructible, public Latent bool logarithmic; bool sr_dependent; std::string label; - float lower; - float upper; + 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; @@ -98,6 +99,11 @@ class Plugin : public PBD::StatefulDestructible, public Latent bool max_unbound; }; + XMLNode& get_state (); + virtual int set_state (const XMLNode &, int version); + + virtual void set_insert_info (const PluginInsert*) {} + virtual std::string unique_id() const = 0; virtual const char * label() const = 0; virtual const char * name() const = 0; @@ -110,13 +116,13 @@ class Plugin : public PBD::StatefulDestructible, public Latent virtual uint32_t nth_parameter (uint32_t which, bool& ok) const = 0; virtual void activate () = 0; virtual void deactivate () = 0; - virtual void flush () { deactivate(); activate(); } + virtual void flush () { deactivate(); activate(); } virtual int set_block_size (pframes_t nframes) = 0; virtual int connect_and_run (BufferSet& bufs, - ChanMapping in, ChanMapping out, - pframes_t nframes, framecnt_t offset) = 0; + ChanMapping in, ChanMapping out, + pframes_t nframes, framecnt_t offset); virtual std::set automatable() const = 0; virtual std::string describe_parameter (Evoral::Parameter) = 0; @@ -128,33 +134,63 @@ class Plugin : public PBD::StatefulDestructible, public Latent virtual bool parameter_is_input(uint32_t) const = 0; virtual bool parameter_is_output(uint32_t) const = 0; - bool save_preset (std::string); - void remove_preset (std::string); - virtual bool load_preset (const std::string& uri) = 0; + typedef std::map ScalePoints; + + virtual boost::shared_ptr get_scale_points(uint32_t /*port_index*/) const { + return boost::shared_ptr(); + } + + void realtime_handle_transport_stopped (); struct PresetRecord { - PresetRecord (const std::string& u, const std::string& l) : uri(u), label(l) {} + PresetRecord () : user (true) {} + PresetRecord (const std::string& u, const std::string& l, bool s = true) : uri (u), label (l), user (s) {} + + bool operator!= (PresetRecord const & a) const { + return uri != a.uri || label != a.label; + } + std::string uri; std::string label; + bool user; }; + PresetRecord save_preset (std::string); + void remove_preset (std::string); + + virtual bool load_preset (PresetRecord); + const PresetRecord * preset_by_label (const std::string &); const PresetRecord * preset_by_uri (const std::string &); - /** Return this plugin's presets; should add them to _presets */ - virtual std::vector get_presets () = 0; - virtual std::string current_preset () const { return std::string(); } + std::vector get_presets (); + + /** @return Last preset to be requested; the settings may have + * been changed since; find out with parameter_changed_since_last_preset. + */ + PresetRecord last_preset () const { + return _last_preset; + } + + bool parameter_changed_since_last_preset () const { + return _parameter_changed_since_last_preset; + } + + virtual int first_user_preset_index () const { + return 0; + } /** Emitted when a preset is added or removed, respectively */ PBD::Signal0 PresetAdded; PBD::Signal0 PresetRemoved; - - /* XXX: no-one listens to this */ - static PBD::Signal0 PresetFileExists; - virtual bool has_editor() const = 0; + /** Emitted when a preset has been loaded */ + PBD::Signal0 PresetLoaded; + + virtual bool has_editor () const = 0; - PBD::Signal2 ParameterChanged; + /** Emitted when any parameter changes */ + PBD::Signal2 ParameterChanged; /* NOTE: this block of virtual methods looks like the interface to a Processor, but Plugin does not inherit from Processor. @@ -188,11 +224,11 @@ class Plugin : public PBD::StatefulDestructible, public Latent cycles_t cycles() const { return _cycles; } protected: - + friend class PluginInsert; friend struct PluginInsert::PluginControl; - virtual void set_parameter (uint32_t which, float val) = 0; + virtual void set_parameter (uint32_t which, float val); /** Do the actual saving of the current plugin settings to a preset of the provided name. * Should return a URI on success, or an empty string on failure. @@ -206,6 +242,21 @@ protected: PluginInfoPtr _info; uint32_t _cycles; std::map _presets; + +private: + + /** Fill _presets with our presets */ + virtual void find_presets () = 0; + + /** Add state to an existing XMLNode */ + virtual void add_state (XMLNode *) const = 0; + + bool _have_presets; + MidiStateTracker _tracker; + BufferSet _pending_stop_events; + bool _have_pending_stop_events; + PresetRecord _last_preset; + bool _parameter_changed_since_last_preset; }; PluginPtr find_plugin(ARDOUR::Session&, std::string unique_id, ARDOUR::PluginType);