X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fplugin.h;h=892ae8c6c6ccc8bf599b69679f7faf0f8deee6d8;hb=21102b45d0d22f2761697b1b9fdfa92aafc25834;hp=bc32d7c3e62846f9a363f4e3bac3e70ad7eefd6f;hpb=db564a03c77e8271534810e2e3a60fd3506ec0b0;p=ardour.git diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h index bc32d7c3e6..892ae8c6c6 100644 --- a/libs/ardour/ardour/plugin.h +++ b/libs/ardour/ardour/plugin.h @@ -33,6 +33,7 @@ #include "ardour/cycles.h" #include "ardour/latent.h" #include "ardour/libardour_visibility.h" +#include "ardour/midi_ring_buffer.h" #include "ardour/midi_state_tracker.h" #include "ardour/parameter_descriptor.h" #include "ardour/types.h" @@ -51,6 +52,7 @@ class PluginInsert; class Plugin; class PluginInfo; class AutomationControl; +class SessionObject; typedef boost::shared_ptr PluginPtr; typedef boost::shared_ptr PluginInfoPtr; @@ -102,6 +104,7 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent virtual int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const = 0; virtual uint32_t nth_parameter (uint32_t which, bool& ok) const = 0; + virtual std::string parameter_label (uint32_t which) const; virtual void activate () = 0; virtual void deactivate () = 0; virtual void flush () { deactivate(); activate(); } @@ -111,9 +114,9 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent virtual bool inplace_broken() const { return false; } virtual int connect_and_run (BufferSet& bufs, - framepos_t start, framepos_t end, double speed, + samplepos_t start, samplepos_t end, double speed, ChanMapping in, ChanMapping out, - pframes_t nframes, framecnt_t offset); + pframes_t nframes, samplecnt_t offset); virtual std::set automatable() const = 0; virtual std::string describe_parameter (Evoral::Parameter) = 0; @@ -132,13 +135,20 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent IOPortDescription (const std::string& n) : name (n) , is_sidechain (false) + , group_name (n) + , group_channel (0) {} IOPortDescription (const IOPortDescription &other) : name (other.name) , is_sidechain (other.is_sidechain) + , group_name (other.group_name) + , group_channel (other.group_channel) {} std::string name; bool is_sidechain; + + std::string group_name; + uint32_t group_channel; }; virtual IOPortDescription describe_io_port (DataType dt, bool input, uint32_t id) const; @@ -150,6 +160,8 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent return boost::shared_ptr(); } + bool write_immediate_event (size_t size, const uint8_t* buf); + void realtime_handle_transport_stopped (); void realtime_locate (); void monitoring_changed (); @@ -162,9 +174,20 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent } Display_Image_Surface; virtual bool has_inline_display () { return false; } + virtual bool inline_display_in_gui () { return false; } virtual Display_Image_Surface* render_inline_display (uint32_t, uint32_t) { return NULL; } PBD::Signal0 QueueDraw; + virtual bool has_midnam () { return false; } + virtual bool read_midnam () { return false; } + virtual std::string midnam_model () { return ""; } + PBD::Signal0 UpdateMidnam; + PBD::Signal0 UpdatedMidnam; + + virtual bool knows_bank_patch () { return false; } + virtual uint32_t bank_patch (uint8_t chn) { return UINT32_MAX; } + PBD::Signal1 BankPatchChange; + struct PresetRecord { PresetRecord () : valid (false) {} PresetRecord (const std::string& u, const std::string& l, bool s = true) : uri (u), label (l), user (s), valid (true) {} @@ -225,25 +248,8 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent return 0; } - /** Emitted when a Latency Changes - * - * (this cannot be part of ARDOUR::Latent because - * signals cannot be copy-constructed). - */ - PBD::Signal2 LatencyChanged; - - /* overload Latent::set_user_latency w/signal emission */ - virtual void set_user_latency (framecnt_t val) { - bool changed = val != _user_latency; - framecnt_t old = effective_latency (); - _user_latency = val; - if (changed) { - LatencyChanged (old, effective_latency ()); /* EMIT SIGNAL */ - } - } - /** the max possible latency a plugin will have */ - virtual framecnt_t max_latency () const { return 0; } // TODO = 0, require implementation + virtual samplecnt_t max_latency () const { return 0; } // TODO = 0, require implementation /** Emitted when a preset is added or removed, respectively */ PBD::Signal0 PresetAdded; @@ -260,6 +266,9 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent */ PBD::Signal0 PresetDirty; + /** Emitted for preset-load to set a control-port */ + PBD::Signal2 PresetPortSetValue; + virtual bool has_editor () const = 0; /** Emitted when a parameter is altered by something outside of our @@ -279,6 +288,9 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent PluginInfoPtr get_info() const { return _info; } virtual void set_info (const PluginInfoPtr inf); + virtual void set_owner (SessionObject* o) { _owner = o; } + SessionObject* owner() const { return _owner; } + ARDOUR::AudioEngine& engine() const { return _engine; } ARDOUR::Session& session() const { return _session; } @@ -331,7 +343,7 @@ protected: /* Called when a parameter of the plugin is changed outside of this * host's control (typical via a plugin's own GUI/editor) */ - void parameter_changed_externally (uint32_t which, float val); + virtual void parameter_changed_externally (uint32_t which, float val); /* should be overridden by plugin API specific derived types to * actually implement changing the parameter. The derived type should @@ -352,13 +364,13 @@ protected: uint32_t _cycles; std::map _presets; + SessionObject* _owner; + private: /** Fill _presets with our presets */ virtual void find_presets () = 0; - void update_presets (std::string src_unique_id, Plugin* src ); - /** Add state to an existing XMLNode */ virtual void add_state (XMLNode *) const = 0; @@ -371,6 +383,8 @@ private: PBD::ScopedConnection _preset_connection; + MidiRingBuffer _immediate_events; + void resolve_midi (); }; @@ -411,9 +425,16 @@ class LIBARDOUR_API PluginInfo { std::string unique_id; virtual PluginPtr load (Session& session) = 0; - virtual bool is_instrument() const; - virtual bool needs_midi_input() const { return is_instrument (); } - virtual bool in_category (const std::string &) const { return false; } + + /* NOTE: it is possible for a plugin to be an effect AND an instrument. + * override these funcs as necessary to support that. + */ + virtual bool is_effect () const; + virtual bool is_instrument () const; + virtual bool is_utility () const; //this includes things like "generators" and "midi filters" + virtual bool is_analyzer () const; + + virtual bool needs_midi_input() const; virtual std::vector get_presets (bool user_only) const = 0;