Fix the horrible mess that was anything related to sources and paths.
[ardour.git] / libs / ardour / ardour / route.h
index c7c0b77102f441b5d9c72369a621ff632ac932cb..217ce36fe9759e8bd61776b9f4bd39493fbc89b1 100644 (file)
 #define __ardour_route_h__
 
 #include <cmath>
+#include <cstring>
 #include <list>
-#include <set>
 #include <map>
+#include <set>
 #include <string>
 
 #include <boost/shared_ptr.hpp>
+#include <boost/weak_ptr.hpp>
 
-#include <pbd/fastlog.h>
 #include <glibmm/thread.h>
+#include <pbd/fastlog.h>
 #include <pbd/xml++.h>
 #include <pbd/undo.h>
 #include <pbd/stateful.h> 
 
 #include <ardour/ardour.h>
 #include <ardour/io.h>
-#include <ardour/session.h>
-#include <ardour/io_processor.h>
 #include <ardour/types.h>
 
 namespace ARDOUR {
 
 class Processor;
+class IOProcessor;
 class Send;
 class RouteGroup;
 
@@ -69,7 +70,6 @@ class Route : public IO
                ControlOut = 0x4
        };
 
-
        Route (Session&, std::string name, int input_min, int input_max, int output_min, int output_max,
               Flag flags = Flag(0), DataType default_type = DataType::AUDIO);
        Route (Session&, const XMLNode&, DataType default_type = DataType::AUDIO);
@@ -90,14 +90,15 @@ class Route : public IO
        /* these are the core of the API of a Route. see the protected sections as well */
 
 
-       virtual int  roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, 
-                          nframes_t offset, int declick, bool can_record, bool rec_monitors_input);
+       virtual int roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, 
+                       nframes_t offset, int declick, bool can_record, bool rec_monitors_input);
+
+       virtual int no_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, 
+                       nframes_t offset, bool state_changing, bool can_record, bool rec_monitors_input);
 
-       virtual int  no_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, 
-                             nframes_t offset, bool state_changing, bool can_record, bool rec_monitors_input);
+       virtual int silent_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, 
+                       nframes_t offset, bool can_record, bool rec_monitors_input);
 
-       virtual int  silent_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, 
-                                 nframes_t offset, bool can_record, bool rec_monitors_input);
        virtual void toggle_monitor_input ();
        virtual bool can_record() { return false; }
        virtual void set_record_enable (bool yn, void *src) {}
@@ -107,6 +108,8 @@ class Route : public IO
 
        /* end of vfunc-based API */
 
+       void shift (nframes64_t, nframes64_t);
+
        /* override IO::set_gain() to provide group control */
 
        void set_gain (gain_t val, void *src);
@@ -117,7 +120,7 @@ class Route : public IO
 
        void set_solo_safe (bool yn, void *src);
        bool solo_safe() const { return _solo_safe; }
-
+       
        void set_mute (bool yn, void *src);
        bool muted() const { return _muted; }
        bool solo_muted() const { return desired_solo_gain == 0.0; }
@@ -133,17 +136,17 @@ class Route : public IO
        void       drop_mix_group (void *);
        RouteGroup *mix_group () { return _mix_group; }
 
-       virtual void  set_meter_point (MeterPoint, void *src);
-       MeterPoint  meter_point() const { return _meter_point; }
+       virtual void set_meter_point (MeterPoint, void *src);
+       MeterPoint   meter_point() const { return _meter_point; }
 
        /* Processors */
 
        void flush_processors ();
 
-       template<class T> void foreach_processor (T *obj, void (T::*func)(boost::shared_ptr<Processor>)) {
+       void foreach_processor (sigc::slot<void, boost::weak_ptr<Processor> > method) {
                Glib::RWLock::ReaderLock lm (_processor_lock);
                for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
-                       (obj->*func) (*i);
+                       method (boost::weak_ptr<Processor> (*i));
                }
        }
 
@@ -152,7 +155,7 @@ class Route : public IO
                ProcessorList::iterator i;
                for (i = _processors.begin(); i != _processors.end() && n; ++i, --n);
                if (i == _processors.end()) {
-                       return boost::shared_ptr<IOProcessor> ();
+                       return boost::shared_ptr<Processor> ();
                } else {
                        return *i;
                }
@@ -174,7 +177,6 @@ class Route : public IO
        int add_processor (boost::shared_ptr<Processor>, ProcessorStreams* err = 0);
        int add_processors (const ProcessorList&, ProcessorStreams* err = 0);
        int remove_processor (boost::shared_ptr<Processor>, ProcessorStreams* err = 0);
-       int copy_processors (const Route&, Placement, ProcessorStreams* err = 0);
        int sort_processors (ProcessorStreams* err = 0);
        void disable_processors (Placement);
        void disable_processors ();
@@ -225,7 +227,7 @@ class Route : public IO
        IO* control_outs() { return _control_outs; }
 
        bool feeds (boost::shared_ptr<Route>);
-       set<boost::shared_ptr<Route> > fed_by;
+       std::set<boost::shared_ptr<Route> > fed_by;
 
        struct ToggleControllable : public PBD::Controllable {
            enum ToggleType {
@@ -256,68 +258,66 @@ class Route : public IO
        uint32_t remote_control_id () const;
        sigc::signal<void> RemoteControlIDChanged;
 
-       void sync_order_keys ();
-       static sigc::signal<void> SyncOrderKeys;
+       void sync_order_keys (const char* base);
+       static sigc::signal<void,const char*> SyncOrderKeys;
 
   protected:
        friend class Session;
 
+       void catch_up_on_solo_mute_override ();
        void set_solo_mute (bool yn);
        void set_block_size (nframes_t nframes);
        bool has_external_redirects() const;
        void curve_reallocate ();
 
   protected:
-       Flag _flags;
-
-       /* tight cache-line access here is more important than sheer speed of
-          access.
-       */
-
-       bool                     _muted : 1;
-       bool                     _soloed : 1;
-       bool                     _solo_safe : 1;
-       bool                     _recordable : 1;
-       bool                     _mute_affects_pre_fader : 1;
-       bool                     _mute_affects_post_fader : 1;
-       bool                     _mute_affects_control_outs : 1;
-       bool                     _mute_affects_main_outs : 1;
-       bool                     _silent : 1;
-       bool                     _declickable : 1;
-       int                      _pending_declick;
+       nframes_t check_initial_delay (nframes_t, nframes_t&, nframes_t&);
        
-       MeterPoint               _meter_point;
-
-       gain_t                    solo_gain;
-       gain_t                    mute_gain;
-       gain_t                    desired_solo_gain;
-       gain_t                    desired_mute_gain;
+       void passthru (nframes_t start_frame, nframes_t end_frame,
+                       nframes_t nframes, nframes_t offset, int declick, bool meter_inputs);
 
-
-
-       nframes_t           _initial_delay;
-       nframes_t           _roll_delay;
-       ProcessorList       _processors;
-       Glib::RWLock        _processor_lock;
-       IO                 *_control_outs;
-       Glib::Mutex         _control_outs_lock;
-       RouteGroup         *_edit_group;
-       RouteGroup         *_mix_group;
-       std::string         _comment;
-       bool                _have_internal_generator;
-
-       boost::shared_ptr<ToggleControllable> _solo_control;
-       boost::shared_ptr<ToggleControllable> _mute_control;
+       virtual void process_output_buffers (BufferSet& bufs,
+                       nframes_t start_frame, nframes_t end_frame,
+                       nframes_t nframes, nframes_t offset, bool with_processors, int declick,
+                       bool meter);
+
+       Flag           _flags;
+       int            _pending_declick;
+       MeterPoint     _meter_point;
+
+       gain_t          solo_gain;
+       gain_t          mute_gain;
+       gain_t          desired_solo_gain;
+       gain_t          desired_mute_gain;
        
-       nframes_t check_initial_delay (nframes_t, nframes_t&, nframes_t&);
+       nframes_t      _initial_delay;
+       nframes_t      _roll_delay;
+       ProcessorList  _processors;
+       Glib::RWLock   _processor_lock;
+       IO            *_control_outs;
+       Glib::Mutex    _control_outs_lock;
+       RouteGroup    *_edit_group;
+       RouteGroup    *_mix_group;
+       std::string    _comment;
+       bool           _have_internal_generator;
        
-       void passthru (nframes_t start_frame, nframes_t end_frame, 
-                      nframes_t nframes, nframes_t offset, int declick, bool meter_inputs);
+       boost::shared_ptr<ToggleControllable> _solo_control;
+       boost::shared_ptr<ToggleControllable> _mute_control;
 
-       virtual void process_output_buffers (BufferSet& bufs,
-                                    nframes_t start_frame, nframes_t end_frame,
-                                    nframes_t nframes, nframes_t offset, bool with_processors, int declick,
-                                    bool meter);
+       /* tight cache-line access here is more important than sheer speed of access.
+          keep these after things that should be aligned
+       */
+
+       bool _muted : 1;
+       bool _soloed : 1;
+       bool _solo_safe : 1;
+       bool _recordable : 1;
+       bool _mute_affects_pre_fader : 1;
+       bool _mute_affects_post_fader : 1;
+       bool _mute_affects_control_outs : 1;
+       bool _mute_affects_main_outs : 1;
+       bool _silent : 1;
+       bool _declickable : 1;
 
   protected:
 
@@ -345,10 +345,8 @@ class Route : public IO
 
        static uint32_t order_key_cnt;
 
-       struct ltstr
-       {
-           bool operator()(const char* s1, const char* s2) const
-           {
+       struct ltstr {
+           bool operator()(const char* s1, const char* s2) const {
                    return strcmp(s1, s2) < 0;
            }
        };
@@ -359,11 +357,10 @@ class Route : public IO
        void input_change_handler (IOChange, void *src);
        void output_change_handler (IOChange, void *src);
 
-       int reset_plugin_counts (ProcessorStreams*); /* locked */
-       int _reset_plugin_counts (ProcessorStreams*); /* unlocked */
-
-       /* processor I/O channels and plugin count handling */
+       int reset_processor_counts (ProcessorStreams*); /* locked */
+       int _reset_processor_counts (ProcessorStreams*); /* unlocked */
 
+       /** processor I/O channels and plugin count handling */
        struct ProcessorCount {
            boost::shared_ptr<ARDOUR::Processor> processor;
            ChanCount in;
@@ -372,8 +369,9 @@ class Route : public IO
            ProcessorCount (boost::shared_ptr<ARDOUR::Processor> ins) : processor(ins) {}
        };
        
-       int32_t apply_some_plugin_counts (std::list<ProcessorCount>& iclist);
-       bool    check_some_plugin_counts (std::list<ProcessorCount>& iclist, ChanCount required_inputs, ProcessorStreams* err_streams);
+       int32_t apply_some_processor_counts (std::list<ProcessorCount>& iclist);
+       bool    check_some_processor_counts (std::list<ProcessorCount>& iclist,
+                               ChanCount required_inputs, ProcessorStreams* err_streams);
 
        void set_deferred_state ();
        void add_processor_from_xml (const XMLNode&);