prepare plugin configuration and replacing instruments
[ardour.git] / libs / ardour / ardour / route.h
index 56f7ccdc990d1fe922c6bbe1870a75590bfd25eb..3ade22319d28a7c555aeb68914a0231dd984b249 100644 (file)
@@ -14,7 +14,6 @@
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
 */
 
 #ifndef __ardour_route_h__
@@ -53,6 +52,8 @@
 #include "ardour/automatable.h"
 #include "ardour/unknown_processor.h"
 
+class RoutePinWindowProxy;
+
 namespace ARDOUR {
 
 class Amp;
@@ -63,6 +64,7 @@ class Panner;
 class PannerShell;
 class PortSet;
 class Processor;
+class PluginInsert;
 class RouteGroup;
 class Send;
 class InternalReturn;
@@ -73,7 +75,7 @@ class InternalSend;
 
 class LIBARDOUR_API Route : public SessionObject, public Automatable, public RouteGroupMember, public GraphNode, public boost::enable_shared_from_this<Route>
 {
-  public:
+public:
 
        typedef std::list<boost::shared_ptr<Processor> > ProcessorList;
 
@@ -107,8 +109,8 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
        bool set_name (const std::string& str);
        static void set_name_in_state (XMLNode &, const std::string &, bool rename_playlist = true);
 
-        uint32_t order_key () const;
-        bool has_order_key () const;
+       uint32_t order_key () const;
+       bool has_order_key () const;
        void set_order_key (uint32_t);
 
        bool is_auditioner() const { return _flags & Auditioner; }
@@ -138,7 +140,7 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
        virtual void nonrealtime_handle_transport_stopped (bool abort, bool did_locate, bool flush_processors);
        virtual void realtime_handle_transport_stopped () {}
        virtual void realtime_locate () {}
-        virtual void non_realtime_locate (framepos_t);
+       virtual void non_realtime_locate (framepos_t);
        virtual void set_pending_declick (int);
 
        /* end of vfunc-based API */
@@ -235,6 +237,9 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 
        std::list<std::string> unknown_processors () const;
 
+       RoutePinWindowProxy * pinmgr_proxy () const { return _pinmgr_proxy; }
+       void set_pingmgr_proxy (RoutePinWindowProxy* wp) { _pinmgr_proxy = wp ; }
+
        /* special processors */
 
        boost::shared_ptr<InternalSend>     monitor_send() const { return _monitor_send; }
@@ -266,8 +271,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);
@@ -280,10 +299,42 @@ 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;
@@ -322,6 +373,14 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
                PropertyChanged (ARDOUR::Properties::name);
        }
 
+       enum PluginSetupOptions {
+               None = 0x0,
+               CanReplace = 0x1,
+               MultiOut = 0x2,
+       };
+
+       static PBD::Signal3<int,boost::shared_ptr<Route>, boost::shared_ptr<PluginInsert>, PluginSetupOptions > PluginSetup;
+
        /** the processors have changed; the parameter indicates what changed */
        PBD::Signal1<void,RouteProcessorChange> processors_changed;
        PBD::Signal1<void,void*> record_enable_changed;
@@ -548,75 +607,75 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
           special case not covered by this utility function.
        */
        boost::shared_ptr<Processor> the_instrument() const;
-        InstrumentInfo& instrument_info() { return _instrument_info; }
-
-        /* "well-known" controls for panning. Any or all of these may return
-         * null.
-         */
-
-        boost::shared_ptr<AutomationControl> pan_azimuth_control() const;
-        boost::shared_ptr<AutomationControl> pan_elevation_control() const;
-        boost::shared_ptr<AutomationControl> pan_width_control() const;
-        boost::shared_ptr<AutomationControl> pan_frontback_control() const;
-        boost::shared_ptr<AutomationControl> pan_lfe_control() const;
-
-        /* "well-known" controls for an EQ in this route. Any or all may
-         * be null. eq_band_cnt() must return 0 if there is no EQ present.
-         * Passing an @param band value >= eq_band_cnt() will guarantee the
-         * return of a null ptr (or an empty string for eq_band_name()).
-         */
-        uint32_t eq_band_cnt () const;
-        std::string eq_band_name (uint32_t) const;
-        boost::shared_ptr<AutomationControl> eq_gain_controllable (uint32_t band) const;
-        boost::shared_ptr<AutomationControl> eq_freq_controllable (uint32_t band) const;
-        boost::shared_ptr<AutomationControl> eq_q_controllable (uint32_t band) const;
-        boost::shared_ptr<AutomationControl> eq_shape_controllable (uint32_t band) const;
-        boost::shared_ptr<AutomationControl> eq_enable_controllable () const;
-        boost::shared_ptr<AutomationControl> eq_hpf_controllable () const;
-
-        /* "well-known" controls for a compressor in this route. Any or all may
-         * be null.
-         */
-        boost::shared_ptr<AutomationControl> comp_enable_controllable () const;
-        boost::shared_ptr<AutomationControl> comp_threshold_controllable () const;
-        boost::shared_ptr<AutomationControl> comp_speed_controllable () const;
-        boost::shared_ptr<AutomationControl> comp_mode_controllable () const;
-        boost::shared_ptr<AutomationControl> comp_makeup_controllable () const;
-        boost::shared_ptr<AutomationControl> comp_redux_controllable () const;
-
-        /* @param mode must be supplied by the comp_mode_controllable(). All other values
-         * result in undefined behaviour
-         */
-        std::string comp_mode_name (uint32_t mode) const;
-        /* @param mode - as for comp mode name. This returns the name for the
-         * parameter/control accessed via comp_speed_controllable(), which can
-         * be mode dependent.
-         */
-        std::string comp_speed_name (uint32_t mode) const;
-
-        /* "well-known" controls for sends to well-known busses in this route. Any or all may
-         * be null.
-         *
-         * In Mixbus, these are the sends that connect to the mixbusses.
-         * In Ardour, these are user-created sends that connect to user-created
-         * Aux busses.
-         */
-        boost::shared_ptr<AutomationControl> send_level_controllable (uint32_t n) const;
-        boost::shared_ptr<AutomationControl> send_enable_controllable (uint32_t n) const;
-        /* for the same value of @param n, this returns the name of the send
-         * associated with the pair of controllables returned by the above two methods.
-         */
-        std::string send_name (uint32_t n) const;
-
-        /* well known control that enables/disables sending to the master bus.
-         *
-         * In Ardour, this returns null.
-         * In Mixbus, it will return a suitable control, or null depending on
-         * the route.
-         */
-        boost::shared_ptr<AutomationControl> master_send_enable_controllable () const;
-
-        void protect_automation ();
+       InstrumentInfo& instrument_info() { return _instrument_info; }
+
+       /* "well-known" controls for panning. Any or all of these may return
+        * null.
+        */
+
+       boost::shared_ptr<AutomationControl> pan_azimuth_control() const;
+       boost::shared_ptr<AutomationControl> pan_elevation_control() const;
+       boost::shared_ptr<AutomationControl> pan_width_control() const;
+       boost::shared_ptr<AutomationControl> pan_frontback_control() const;
+       boost::shared_ptr<AutomationControl> pan_lfe_control() const;
+
+       /* "well-known" controls for an EQ in this route. Any or all may
+        * be null. eq_band_cnt() must return 0 if there is no EQ present.
+        * Passing an @param band value >= eq_band_cnt() will guarantee the
+        * return of a null ptr (or an empty string for eq_band_name()).
+        */
+       uint32_t eq_band_cnt () const;
+       std::string eq_band_name (uint32_t) const;
+       boost::shared_ptr<AutomationControl> eq_gain_controllable (uint32_t band) const;
+       boost::shared_ptr<AutomationControl> eq_freq_controllable (uint32_t band) const;
+       boost::shared_ptr<AutomationControl> eq_q_controllable (uint32_t band) const;
+       boost::shared_ptr<AutomationControl> eq_shape_controllable (uint32_t band) const;
+       boost::shared_ptr<AutomationControl> eq_enable_controllable () const;
+       boost::shared_ptr<AutomationControl> eq_hpf_controllable () const;
+
+       /* "well-known" controls for a compressor in this route. Any or all may
+        * be null.
+        */
+       boost::shared_ptr<AutomationControl> comp_enable_controllable () const;
+       boost::shared_ptr<AutomationControl> comp_threshold_controllable () const;
+       boost::shared_ptr<AutomationControl> comp_speed_controllable () const;
+       boost::shared_ptr<AutomationControl> comp_mode_controllable () const;
+       boost::shared_ptr<AutomationControl> comp_makeup_controllable () const;
+       boost::shared_ptr<AutomationControl> comp_redux_controllable () const;
+
+       /* @param mode must be supplied by the comp_mode_controllable(). All other values
+        * result in undefined behaviour
+        */
+       std::string comp_mode_name (uint32_t mode) const;
+       /* @param mode - as for comp mode name. This returns the name for the
+        * parameter/control accessed via comp_speed_controllable(), which can
+        * be mode dependent.
+        */
+       std::string comp_speed_name (uint32_t mode) const;
+
+       /* "well-known" controls for sends to well-known busses in this route. Any or all may
+        * be null.
+        *
+        * In Mixbus, these are the sends that connect to the mixbusses.
+        * In Ardour, these are user-created sends that connect to user-created
+        * Aux busses.
+        */
+       boost::shared_ptr<AutomationControl> send_level_controllable (uint32_t n) const;
+       boost::shared_ptr<AutomationControl> send_enable_controllable (uint32_t n) const;
+       /* for the same value of @param n, this returns the name of the send
+        * associated with the pair of controllables returned by the above two methods.
+        */
+       std::string send_name (uint32_t n) const;
+
+       /* well known control that enables/disables sending to the master bus.
+        *
+        * In Ardour, this returns null.
+        * In Mixbus, it will return a suitable control, or null depending on
+        * the route.
+        */
+       boost::shared_ptr<AutomationControl> master_send_enable_controllable () const;
+
+       void protect_automation ();
 
        enum {
                /* These numbers are taken from MIDI Machine Control,
@@ -629,7 +688,7 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 
        void     set_remote_control_id (uint32_t id, bool notify_class_listeners = true);
        uint32_t remote_control_id () const;
-        void     set_remote_control_id_explicit (uint32_t order_key);
+       void     set_remote_control_id_explicit (uint32_t order_key);
 
        /* for things concerned about *this* route's RID */
 
@@ -642,13 +701,13 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 
        bool has_external_redirects() const;
 
-        /* can only be executed by a route for which is_monitor() is true
-          (i.e. the monitor out)
-        */
-        void monitor_run (framepos_t start_frame, framepos_t end_frame,
-                         pframes_t nframes, int declick);
+       /* can only be executed by a route for which is_monitor() is true
+        *       (i.e. the monitor out)
+        */
+       void monitor_run (framepos_t start_frame, framepos_t end_frame,
+                       pframes_t nframes, int declick);
 
-  protected:
+protected:
        friend class Session;
 
        void catch_up_on_solo_mute_override ();
@@ -657,12 +716,12 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
        void curve_reallocate ();
        virtual void set_block_size (pframes_t nframes);
 
-  protected:
+protected:
        virtual framecnt_t check_initial_delay (framecnt_t nframes, framepos_t&) { return nframes; }
 
-        void fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes);
+       void fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes);
 
-        void passthru (BufferSet&, framepos_t start_frame, framepos_t end_frame,
+       void passthru (BufferSet&, framepos_t start_frame, framepos_t end_frame,
                        pframes_t nframes, int declick);
 
        virtual void write_out_of_band_data (BufferSet& /* bufs */, framepos_t /* start_frame */, framepos_t /* end_frame */,
@@ -745,11 +804,11 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
        DataType       _default_type;
        FedBy          _fed_by;
 
-        InstrumentInfo _instrument_info;
+       InstrumentInfo _instrument_info;
 
        virtual ChanCount input_streams () const;
 
-  protected:
+protected:
        virtual XMLNode& state(bool);
 
        int configure_processors (ProcessorStreams*);
@@ -777,13 +836,13 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 
        boost::shared_ptr<Processor> the_instrument_unlocked() const;
 
-  private:
+private:
        int set_state_2X (const XMLNode&, int);
        void set_processor_state_2X (XMLNodeList const &, int);
 
        uint32_t _order_key;
        bool _has_order_key;
-        uint32_t _remote_control_id;
+       uint32_t _remote_control_id;
 
        int64_t _track_number;
 
@@ -791,6 +850,10 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
        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);
 
@@ -798,7 +861,7 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
        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);
 
@@ -862,10 +925,11 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
            or 0.
        */
        boost::weak_ptr<Processor> _processor_after_last_custom_meter;
+       RoutePinWindowProxy *_pinmgr_proxy;
 
-        void reset_instrument_info ();
+       void reset_instrument_info ();
 
-        void set_remote_control_id_internal (uint32_t id, bool notify_class_listeners = true);
+       void set_remote_control_id_internal (uint32_t id, bool notify_class_listeners = true);
 };
 
 } // namespace ARDOUR