Fix the horrible mess that was anything related to sources and paths.
[ardour.git] / libs / ardour / ardour / panner.h
index 47ef212d584a6e0bb77a2d5f18423e751f08aefe..f6839f6d29e36c8a7baa92829c0f9e54e7f9214e 100644 (file)
 
 #include <ardour/types.h>
 #include <ardour/automation_control.h>
+#include <ardour/processor.h>
 
 using std::istream;
 using std::ostream;
 
 namespace ARDOUR {
 
+class Route;
 class Session;
 class Panner;
 class BufferSet;
@@ -46,7 +48,7 @@ class AudioBuffer;
 class StreamPanner : public sigc::trackable, public PBD::Stateful
 {
   public:
-       StreamPanner (Panner& p, Parameter param);
+       StreamPanner (Panner& p, Evoral::Parameter param);
        ~StreamPanner ();
 
        void set_muted (bool yn);
@@ -102,22 +104,7 @@ class StreamPanner : public sigc::trackable, public PBD::Stateful
 
        bool _muted;
 
-       struct PanControllable : public AutomationControl {
-           PanControllable (Session& s, std::string name, StreamPanner& p, Parameter param)
-                       : AutomationControl (s,
-                                       boost::shared_ptr<AutomationList>(new AutomationList(param)), name)
-                       , panner (p)
-               { assert(param.type() != NullAutomation); }
-           
-               AutomationList* alist() { return (AutomationList*)_list.get(); }
-           StreamPanner& panner;
-           
-           void set_value (float);
-           float get_value (void) const;
-           bool can_send_feedback() const;
-       };
-
-       boost::shared_ptr<PanControllable> _control;
+       boost::shared_ptr<AutomationControl> _control;
 
        void add_state (XMLNode&);
        virtual void update () = 0;
@@ -126,7 +113,7 @@ class StreamPanner : public sigc::trackable, public PBD::Stateful
 class BaseStereoPanner : public StreamPanner
 {
   public:
-       BaseStereoPanner (Panner&, Parameter param);
+       BaseStereoPanner (Panner&, Evoral::Parameter param);
        ~BaseStereoPanner ();
 
        /* this class just leaves the pan law itself to be defined
@@ -153,7 +140,7 @@ class BaseStereoPanner : public StreamPanner
 class EqualPowerStereoPanner : public BaseStereoPanner
 {
   public:
-       EqualPowerStereoPanner (Panner&, Parameter param);
+       EqualPowerStereoPanner (Panner&, Evoral::Parameter param);
        ~EqualPowerStereoPanner ();
 
        void distribute_automated (AudioBuffer& src, BufferSet& obufs, 
@@ -162,7 +149,7 @@ class EqualPowerStereoPanner : public BaseStereoPanner
        void get_current_coefficients (pan_t*) const;
        void get_desired_coefficients (pan_t*) const;
 
-       static StreamPanner* factory (Panner&, Parameter param);
+       static StreamPanner* factory (Panner&, Evoral::Parameter param);
        static string name;
 
        XMLNode& state (bool full_state); 
@@ -176,14 +163,14 @@ class EqualPowerStereoPanner : public BaseStereoPanner
 class Multi2dPanner : public StreamPanner
 {
   public:
-       Multi2dPanner (Panner& parent, Parameter);
+       Multi2dPanner (Panner& parent, Evoral::Parameter);
        ~Multi2dPanner ();
 
        void distribute (AudioBuffer& src, BufferSet& obufs, gain_t gain_coeff, nframes_t nframes);
        void distribute_automated (AudioBuffer& src, BufferSet& obufs,
                                   nframes_t start, nframes_t end, nframes_t nframes, pan_t** buffers);
 
-       static StreamPanner* factory (Panner&, Parameter);
+       static StreamPanner* factory (Panner&, Evoral::Parameter);
        static string name;
 
        XMLNode& state (bool full_state); 
@@ -198,7 +185,8 @@ class Multi2dPanner : public StreamPanner
        void update ();
 };
 
-class Panner : public std::vector<StreamPanner*>, public PBD::Stateful, public sigc::trackable
+
+class Panner : public Processor
 {
   public:
        struct Output {
@@ -212,37 +200,43 @@ class Panner : public std::vector<StreamPanner*>, public PBD::Stateful, public s
                    
        };
 
+       //Panner (std::string name, Session&, int _num_bufs);
        Panner (string name, Session&);
        virtual ~Panner ();
 
+       void clear_panners ();
+
+
        /// The fundamental Panner function
-       void distribute(BufferSet& src, BufferSet& dest, nframes_t start_frame, nframes_t end_frames, nframes_t nframes, nframes_t offset);
+       void set_automation_state (AutoState);
+       AutoState automation_state() const;
+       void set_automation_style (AutoStyle);
+       AutoStyle automation_style() const;
+       bool touching() const;
+
+       bool is_in_place () const { return false; }
+       bool is_out_of_place () const { return true; }
+       bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const { return true; };
+
+       void run_out_of_place(BufferSet& src, BufferSet& dest, nframes_t start_frame, nframes_t end_frames, nframes_t nframes, nframes_t offset);
+
+       //void* get_inline_gui() const = 0;
+       //void* get_full_gui() const = 0;
 
        bool bypassed() const { return _bypassed; }
        void set_bypassed (bool yn);
 
        StreamPanner* add ();
        void remove (uint32_t which);
-       void clear ();
        void reset (uint32_t noutputs, uint32_t npans);
 
-       void snapshot (nframes_t now);
-       void transport_stopped (nframes_t frame);
        
-       void clear_automation ();
 
-       void set_automation_state (AutoState);
-       AutoState automation_state() const;
-       void set_automation_style (AutoStyle);
-       AutoStyle automation_style() const;
-       bool touching() const;
 
        XMLNode& get_state (void);
        XMLNode& state (bool full);
        int      set_state (const XMLNode&);
 
-       sigc::signal<void> Changed;
-       
        static bool equivalent (pan_t a, pan_t b) {
                return fabsf (a - b) < 0.002; // about 1 degree of arc for a stereo panner
        }
@@ -252,7 +246,6 @@ class Panner : public std::vector<StreamPanner*>, public PBD::Stateful, public s
        Output& output (uint32_t n) { return outputs[n]; }
 
        std::vector<Output> outputs;
-       Session& session() const { return _session; }
 
        enum LinkDirection {
                SameDirection,
@@ -265,6 +258,10 @@ class Panner : public std::vector<StreamPanner*>, public PBD::Stateful, public s
        bool linked() const { return _linked; }
        void set_linked (bool yn);
 
+       StreamPanner &streampanner( uint32_t n ) const { assert( n < _streampanners.size() ); return *_streampanners[n]; }
+       uint32_t npanners() const { return _streampanners.size(); }
+
+       sigc::signal<void> Changed;
        sigc::signal<void> LinkStateChanged;
        sigc::signal<void> StateChanged; /* for bypass */
 
@@ -278,10 +275,34 @@ class Panner : public std::vector<StreamPanner*>, public PBD::Stateful, public s
 
        int load ();
 
+       struct PanControllable : public AutomationControl {
+           PanControllable (Session& s, std::string name, Panner& p, Evoral::Parameter param)
+                       : AutomationControl (s, param,
+                                       boost::shared_ptr<AutomationList>(new AutomationList(param)), name)
+                       , panner (p)
+               { assert(param.type() != NullAutomation); }
+           
+               AutomationList* alist() { return (AutomationList*)_list.get(); }
+           Panner& panner;
+           
+           void set_value (float);
+           float get_value (void) const;
+       };
+
+       boost::shared_ptr<AutomationControl> pan_control (int id, int chan=0) {
+           return automation_control(Evoral::Parameter (PanAutomation, chan, id));
+       }
+
+       boost::shared_ptr<const AutomationControl> pan_control (int id, int chan=0) const {
+           return automation_control(Evoral::Parameter (PanAutomation, chan, id));
+       }
+
   private:
+       /* disallow copy construction */
+       Panner (Panner const &);
+       
        void distribute_no_automation(BufferSet& src, BufferSet& dest, nframes_t nframes, nframes_t offset, gain_t gain_coeff);
-
-       Session&         _session;
+       std::vector<StreamPanner*> _streampanners;
        uint32_t     current_outs;
        bool             _linked;
        bool             _bypassed;
@@ -292,7 +313,6 @@ class Panner : public std::vector<StreamPanner*>, public PBD::Stateful, public s
        /* old school automation handling */
 
        std::string automation_path;
-       void set_name (std::string);
 };
 
 } // namespace ARDOUR