X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fplugin_insert.h;h=2b8d1bc54246cc491f2ac9161b61b34d630563bc;hb=940707e327014f30791d75be00ccbd33b0a0555d;hp=2b1eddc905ae1bfead33a87f2e6070103a39ec28;hpb=2f62309d447d9f9426a7624b454aef06a58e6656;p=ardour.git diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h index 2b1eddc905..2b8d1bc542 100644 --- a/libs/ardour/ardour/plugin_insert.h +++ b/libs/ardour/ardour/plugin_insert.h @@ -28,9 +28,13 @@ #include "ardour/ardour.h" #include "ardour/libardour_visibility.h" #include "ardour/chan_mapping.h" +#include "ardour/fixed_delay.h" +#include "ardour/io.h" #include "ardour/types.h" #include "ardour/parameter_descriptor.h" +#include "ardour/plugin.h" #include "ardour/processor.h" +#include "ardour/sidechain.h" #include "ardour/automation_control.h" class XMLNode; @@ -55,15 +59,20 @@ class LIBARDOUR_API PluginInsert : public Processor XMLNode& get_state(void); int set_state(const XMLNode&, int version); void update_id (PBD::ID); + void set_owner (SessionObject*); void set_state_dir (const std::string& d = ""); - void run (BufferSet& in, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool); - void silence (framecnt_t nframes); + void run (BufferSet& in, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool); + void silence (framecnt_t nframes, framepos_t start_frame); void activate (); void deactivate (); void flush (); + void enable (bool yn); + bool enabled () const; + bool bypassable () const; + bool reset_parameters_to_default (); bool can_reset_all_parameters (); @@ -85,18 +94,35 @@ class LIBARDOUR_API PluginInsert : public Processor } } - ChanMapping input_map () const; - ChanMapping output_map () const; + ChanMapping thru_map () const { + return _thru_map; + } + + bool pre_seed (const ChanCount&, const ChanCount&, const ChanMapping&, const ChanMapping&, const ChanMapping&); + + ChanMapping input_map () const; ///< combined (all instances) input map + ChanMapping no_sc_input_map () const; ///< combined (all instances) input map w/o sidechain sinks + ChanMapping output_map () const; ///< combined (all instances) output map bool has_midi_bypass () const; + bool has_midi_thru () const; + bool inplace () const { return ! _no_inplace; } + +#ifdef MIXBUS + bool is_channelstrip () const; +#endif void set_input_map (uint32_t, ChanMapping); void set_output_map (uint32_t, ChanMapping); + void set_thru_map (ChanMapping); bool reset_map (bool emit = true); bool sanitize_maps (); + bool check_inplace (); + bool configured () const { return _configured; } // these are ports visible on the outside ChanCount output_streams() const; ChanCount input_streams() const; + ChanCount internal_streams() const; // with side-chain // actual ports of all plugins. // n * natural_i/o or result of reconfigurable i/o @@ -107,14 +133,35 @@ class LIBARDOUR_API PluginInsert : public Processor ChanCount natural_output_streams() const; ChanCount natural_input_streams() const; + /** plugin ports marked as sidechain */ + ChanCount sidechain_input_pins() const; + + /** Plugin-Insert IO sidechain ports */ + ChanCount sidechain_input_ports() const { + if (_sidechain) { + return _sidechain->input ()->n_ports (); + } else { + return ChanCount (); + } + } + + const ChanCount& required_buffers () const { return _required_buffers; } + const ChanCount& preset_out () const { return _preset_out; } + // allow to override output_streams(), implies "Custom Mode" // only the owning route may call these (with process lock held) // route is not a friend class, it owns us bool set_count (uint32_t num); + void set_sinks (const ChanCount&); // reconfigurable I/O ONLY void set_outputs (const ChanCount&); void set_strict_io (bool b); void set_custom_cfg (bool b); + bool set_preset_out (const ChanCount&); + bool add_sidechain (uint32_t n_audio = 1, uint32_t n_midi = 0); + bool del_sidechain (); + void set_sidechain_latency (uint32_t, uint32_t); + boost::shared_ptr sidechain () const { return _sidechain; } // end C++ class slavery! uint32_t get_count () const { return _plugins.size(); } @@ -126,12 +173,18 @@ class LIBARDOUR_API PluginInsert : public Processor bool has_no_inputs() const; bool has_no_audio_inputs() const; - bool is_midi_instrument() const; + bool is_instrument () const; + bool has_output_presets ( + ChanCount in = ChanCount (DataType::MIDI, 1), + ChanCount out = ChanCount (DataType::AUDIO, 2) + ); void realtime_handle_transport_stopped (); void realtime_locate (); void monitoring_changed (); + bool load_preset (Plugin::PresetRecord); + /** A control that manipulates a plugin parameter (control port). */ struct PluginControl : public AutomationControl { @@ -140,15 +193,13 @@ class LIBARDOUR_API PluginInsert : public Processor const ParameterDescriptor& desc, boost::shared_ptr list=boost::shared_ptr()); - void set_value (double val, PBD::Controllable::GroupControlDisposition group_override); - void set_value_unchecked (double); double get_value (void) const; void catch_up_with_external_value (double val); XMLNode& get_state(); private: PluginInsert* _plugin; - void _set_value (double val, PBD::Controllable::GroupControlDisposition group_override); + void actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override); }; /** A control that manipulates a plugin property (message). */ @@ -159,10 +210,10 @@ class LIBARDOUR_API PluginInsert : public Processor const ParameterDescriptor& desc, boost::shared_ptr list=boost::shared_ptr()); - void set_value (double val, PBD::Controllable::GroupControlDisposition group_override); - void set_value_unchecked (double); double get_value (void) const; XMLNode& get_state(); + protected: + void actually_set_value (double value, PBD::Controllable::GroupControlDisposition); private: PluginInsert* _plugin; @@ -177,6 +228,19 @@ class LIBARDOUR_API PluginInsert : public Processor } } + framecnt_t plugin_latency () const; + + bool has_sidechain () const { + return _sidechain ? true : false; + } + + boost::shared_ptr sidechain_input () const { + if (_sidechain) { + return _sidechain->input (); + } + return boost::shared_ptr (); + } + PluginType type (); std::string describe_parameter (Evoral::Parameter param); @@ -238,13 +302,18 @@ class LIBARDOUR_API PluginInsert : public Processor void parameter_changed_externally (uint32_t, float); - void set_parameter (Evoral::Parameter param, float val); + void set_parameter (Evoral::Parameter param, float val); float default_parameter_value (const Evoral::Parameter& param); typedef std::vector > Plugins; Plugins _plugins; + boost::shared_ptr _sidechain; + uint32_t _sc_playback_latency; + uint32_t _sc_capture_latency; + uint32_t _plugin_signal_latency; + boost::weak_ptr _impulseAnalysisPlugin; framecnt_t _signal_analysis_collected_nframes; @@ -253,17 +322,26 @@ class LIBARDOUR_API PluginInsert : public Processor BufferSet _signal_analysis_inputs; BufferSet _signal_analysis_outputs; + FixedDelay _delaybuffers; + ChanCount _configured_in; + ChanCount _configured_internal; // with side-chain ChanCount _configured_out; ChanCount _custom_out; + ChanCount _custom_sinks; + ChanCount _preset_out; + ChanCount _cached_sidechain_pins; + ChanCount _required_buffers; bool _configured; bool _no_inplace; bool _strict_io; bool _custom_cfg; bool _maps_from_state; + bool _mapping_changed; Match private_can_support_io_configuration (ChanCount const &, ChanCount &) const; + Match internal_can_support_io_configuration (ChanCount const &, ChanCount &) const; Match automatic_can_support_io_configuration (ChanCount const &, ChanCount &) const; /** details of the match currently being used */ @@ -272,20 +350,32 @@ class LIBARDOUR_API PluginInsert : public Processor typedef std::map PinMappings; PinMappings _in_map; PinMappings _out_map; + ChanMapping _thru_map; // out-idx <= in-idx - void automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes); - void connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now = 0); + void automation_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes); + void connect_and_run (BufferSet& bufs, framepos_t start, framecnt_t end, double speed, pframes_t nframes, framecnt_t offset, bool with_auto); + void bypass (BufferSet& bufs, pframes_t nframes); + void inplace_silence_unconnected (BufferSet&, const PinMappings&, framecnt_t nframes, framecnt_t offset) const; void create_automatable_parameters (); void control_list_automation_state_changed (Evoral::Parameter, AutoState); void set_parameter_state_2X (const XMLNode& node, int version); void set_control_ids (const XMLNode&, int version); + void enable_changed (); + void bypassable_changed (); + boost::shared_ptr plugin_factory (boost::shared_ptr); void add_plugin (boost::shared_ptr); void start_touch (uint32_t param_id); void end_touch (uint32_t param_id); + + void latency_changed (); + bool _latency_changed; + uint32_t _bypass_port; + + void preset_load_set_value (uint32_t, float); }; } // namespace ARDOUR