fix a deadlock with jack2 when inserting a plugin adds ports.
[ardour.git] / libs / ardour / ardour / route.h
index b103abf45bb408634c2bf5e635184252681927e4..bac33ae7a147f622dc39d86580e6a9eac8e27102 100644 (file)
@@ -44,6 +44,7 @@
 #include "ardour/gain_control.h"
 #include "ardour/instrument_info.h"
 #include "ardour/io.h"
+#include "ardour/io_vector.h"
 #include "ardour/libardour_visibility.h"
 #include "ardour/types.h"
 #include "ardour/mute_master.h"
@@ -89,6 +90,8 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 
        boost::shared_ptr<IO> input() const { return _input; }
        boost::shared_ptr<IO> output() const { return _output; }
+       IOVector all_inputs () const;
+       IOVector all_outputs () const;
 
        ChanCount n_inputs() const { return _input->n_ports(); }
        ChanCount n_outputs() const { return _output->n_ports(); }
@@ -235,6 +238,7 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
        /* special processors */
 
        boost::shared_ptr<InternalSend>     monitor_send() const { return _monitor_send; }
+       /** the signal processorat at end of the processing chain which produces output */
        boost::shared_ptr<Delivery>         main_outs() const { return _main_outs; }
        boost::shared_ptr<InternalReturn>   internal_return() const { return _intreturn; }
        boost::shared_ptr<MonitorProcessor> monitor_control() const { return _monitor_control; }
@@ -262,8 +266,22 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
        boost::shared_ptr<Processor> before_processor_for_placement (Placement);
        boost::shared_ptr<Processor> before_processor_for_index (int);
        bool processors_reorder_needs_configure (const ProcessorList& new_order);
-       int remove_processor (boost::shared_ptr<Processor>, ProcessorStreams* err = 0, bool need_process_lock = true);
-       int replace_processor (boost::shared_ptr<Processor>, boost::shared_ptr<Processor>, ProcessorStreams* err = 0);
+       /** remove plugin/processor
+        *
+        * @param proc processor to remove
+        * @param err error report (index where removal vailed, channel-count why it failed) may be nil
+        * @param need_process_lock if locking is required (set to true, unless called from RT context with lock)
+        * @returns 0 on success
+        */
+       int remove_processor (boost::shared_ptr<Processor> proc, ProcessorStreams* err = 0, bool need_process_lock = true);
+       /** replace plugin/processor with another
+        *
+        * @param old processor to remove
+        * @param sub processor to substitute the old one with
+        * @param err error report (index where removal vailed, channel-count why it failed) may be nil
+        * @returns 0 on success
+        */
+       int replace_processor (boost::shared_ptr<Processor> old, boost::shared_ptr<Processor> sub, ProcessorStreams* err = 0);
        int remove_processors (const ProcessorList&, ProcessorStreams* err = 0);
        int reorder_processors (const ProcessorList& new_order, ProcessorStreams* err = 0);
        void disable_processors (Placement);
@@ -276,8 +294,43 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 
        bool strict_io () const { return _strict_io; }
        bool set_strict_io (bool);
+       /** reset plugin-insert configuration to default, disable customizations.
+        *
+        * This is equivalent to calling
+        * @code
+        * customize_plugin_insert (proc, 0, unused)
+        * @endcode
+        *
+        * @param proc Processor to reset
+        * @returns true if successful
+        */
        bool reset_plugin_insert (boost::shared_ptr<Processor> proc);
-       bool customize_plugin_insert (boost::shared_ptr<Processor> proc, uint32_t count, ChanCount outs);
+       /** enable custom plugin-insert configuration
+        * @param proc Processor to customize
+        * @param count number of plugin instances to use (if zero, reset to default)
+        * @param outs output port customization
+        * @param sinks input pins for variable-I/O plugins
+        * @returns true if successful
+        */
+       bool customize_plugin_insert (boost::shared_ptr<Processor> proc, uint32_t count, ChanCount outs, ChanCount sinks);
+       bool add_remove_sidechain (boost::shared_ptr<Processor> proc, bool);
+       bool plugin_preset_output (boost::shared_ptr<Processor> proc, ChanCount outs);
+
+       /* enable sidechain input for a given processor
+        *
+        * The sidechain itself is an IO port object with variable number of channels and configured independently.
+        * Adding/removing the port itself however requires reconfiguring the route and is hence
+        * not a plugin operation itself.
+        *
+        * @param proc the processor to add sidechain inputs to
+        * @returns true on success
+        */
+       bool add_sidechain (boost::shared_ptr<Processor> proc) { return add_remove_sidechain (proc, true); }
+       /* remove sidechain input from given processor
+        * @param proc the processor to remove the sidechain input from
+        * @returns true on success
+        */
+       bool remove_sidechain (boost::shared_ptr<Processor> proc) { return add_remove_sidechain (proc, false); }
 
        framecnt_t set_private_port_latencies (bool playback) const;
        void       set_public_port_latencies (framecnt_t, bool playback) const;
@@ -366,6 +419,8 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
         */
        bool direct_feeds_according_to_graph (boost::shared_ptr<Route>, bool* via_send_only = 0);
 
+       bool feeds_according_to_graph (boost::shared_ptr<Route>);
+
        struct FeedRecord {
                boost::weak_ptr<Route> r;
                bool sends_only;
@@ -780,14 +835,20 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 
        void input_change_handler (IOChange, void *src);
        void output_change_handler (IOChange, void *src);
+       void sidechain_change_handler (IOChange, void *src);
+
+       void processor_selfdestruct (boost::weak_ptr<Processor>);
+       std::vector<boost::weak_ptr<Processor> > selfdestruct_sequence;
+       Glib::Threads::Mutex  selfdestruct_lock;
 
        bool input_port_count_changing (ChanCount);
        bool output_port_count_changing (ChanCount);
 
        bool _in_configure_processors;
        bool _initial_io_setup;
+       bool _in_sidechain_setup;
 
-       int configure_processors_unlocked (ProcessorStreams*);
+       int configure_processors_unlocked (ProcessorStreams*, Glib::Threads::RWLock::WriterLock*);
        bool set_meter_point_unlocked ();
        void apply_processor_order (const ProcessorList& new_order);