X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fpanner.h;h=f6839f6d29e36c8a7baa92829c0f9e54e7f9214e;hb=022818b4a796f52c0a91eea42e65aec0bc7bed43;hp=47ef212d584a6e0bb77a2d5f18423e751f08aefe;hpb=d8ade6d30595a3a8be343b392e47d422940eac27;p=ardour.git diff --git a/libs/ardour/ardour/panner.h b/libs/ardour/ardour/panner.h index 47ef212d58..f6839f6d29 100644 --- a/libs/ardour/ardour/panner.h +++ b/libs/ardour/ardour/panner.h @@ -32,12 +32,14 @@ #include #include +#include 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(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 _control; + boost::shared_ptr _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, public PBD::Stateful, public sigc::trackable + +class Panner : public Processor { public: struct Output { @@ -212,37 +200,43 @@ class Panner : public std::vector, 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 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, public PBD::Stateful, public s Output& output (uint32_t n) { return outputs[n]; } std::vector outputs; - Session& session() const { return _session; } enum LinkDirection { SameDirection, @@ -265,6 +258,10 @@ class Panner : public std::vector, 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 Changed; sigc::signal LinkStateChanged; sigc::signal StateChanged; /* for bypass */ @@ -278,10 +275,34 @@ class Panner : public std::vector, 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(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 pan_control (int id, int chan=0) { + return automation_control(Evoral::Parameter (PanAutomation, chan, id)); + } + + boost::shared_ptr 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 _streampanners; uint32_t current_outs; bool _linked; bool _bypassed; @@ -292,7 +313,6 @@ class Panner : public std::vector, public PBD::Stateful, public s /* old school automation handling */ std::string automation_path; - void set_name (std::string); }; } // namespace ARDOUR