X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fpanner.h;h=f6839f6d29e36c8a7baa92829c0f9e54e7f9214e;hb=022818b4a796f52c0a91eea42e65aec0bc7bed43;hp=3091527e59b78b93884809405a7f6734b0f8b01f;hpb=93c7aeba048f19df5abee5e4325ef8b0ef62c279;p=ardour.git diff --git a/libs/ardour/ardour/panner.h b/libs/ardour/ardour/panner.h index 3091527e59..f6839f6d29 100644 --- a/libs/ardour/ardour/panner.h +++ b/libs/ardour/ardour/panner.h @@ -15,13 +15,13 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #ifndef __ardour_panner_h__ #define __ardour_panner_h__ #include +#include #include #include #include @@ -31,20 +31,24 @@ #include #include -#include +#include +#include using std::istream; using std::ostream; namespace ARDOUR { +class Route; class Session; class Panner; +class BufferSet; +class AudioBuffer; -class StreamPanner : public sigc::trackable, public Stateful +class StreamPanner : public sigc::trackable, public PBD::Stateful { public: - StreamPanner (Panner& p); + StreamPanner (Panner& p, Evoral::Parameter param); ~StreamPanner (); void set_muted (bool yn); @@ -62,39 +66,26 @@ class StreamPanner : public sigc::trackable, public Stateful void get_effective_position (float& xpos, float& ypos) const { xpos = effective_x; ypos = effective_y; } void get_effective_position (float& xpos, float& ypos, float& zpos) const { xpos = effective_x; ypos = effective_y; zpos = effective_z; } - /* the basic panner API */ + /* the basic StreamPanner API */ - virtual void distribute (Sample* src, Sample** obufs, gain_t gain_coeff, nframes_t nframes) = 0; - virtual void distribute_automated (Sample* src, Sample** obufs, + virtual void distribute (AudioBuffer& src, BufferSet& obufs, gain_t gain_coeff, nframes_t nframes) = 0; + virtual void distribute_automated (AudioBuffer& src, BufferSet& obufs, nframes_t start, nframes_t end, nframes_t nframes, pan_t** buffers) = 0; - /* automation */ - - virtual void snapshot (nframes_t now) = 0; - virtual void transport_stopped (nframes_t frame) = 0; - virtual void set_automation_state (AutoState) = 0; - virtual void set_automation_style (AutoStyle) = 0; - - PBD::Controllable& control() { return _control; } + boost::shared_ptr pan_control() { return _control; } - /* XXX this is wrong. for multi-dimensional panners, there - must surely be more than 1 automation curve. - */ - - virtual Curve& automation() = 0; - - virtual int load (istream&, string path, uint32_t&) = 0; - - virtual int save (ostream&) const = 0; - sigc::signal Changed; /* for position */ sigc::signal StateChanged; /* for mute */ int set_state (const XMLNode&); virtual XMLNode& state (bool full_state) = 0; - - Panner & get_parent() { return parent; } + Panner & get_parent() { return parent; } + + /* old school automation loading */ + + virtual int load (istream&, string path, uint32_t&) = 0; + protected: friend class Panner; Panner& parent; @@ -111,19 +102,9 @@ class StreamPanner : public sigc::trackable, public Stateful float effective_y; float effective_z; - bool _muted; - - struct PanControllable : public PBD::Controllable { - PanControllable (StreamPanner& p) : panner (p) {} - - StreamPanner& panner; - - void set_value (float); - float get_value (void) const; - bool can_send_feedback() const; - }; + bool _muted; - PanControllable _control; + boost::shared_ptr _control; void add_state (XMLNode&); virtual void update () = 0; @@ -132,7 +113,7 @@ class StreamPanner : public sigc::trackable, public Stateful class BaseStereoPanner : public StreamPanner { public: - BaseStereoPanner (Panner&); + BaseStereoPanner (Panner&, Evoral::Parameter param); ~BaseStereoPanner (); /* this class just leaves the pan law itself to be defined @@ -141,16 +122,11 @@ class BaseStereoPanner : public StreamPanner and a type name. See EqualPowerStereoPanner as an example. */ - void distribute (Sample* src, Sample** obufs, gain_t gain_coeff, nframes_t nframes); + void distribute (AudioBuffer& src, BufferSet& obufs, gain_t gain_coeff, nframes_t nframes); - int load (istream&, string path, uint32_t&); - int save (ostream&) const; - void snapshot (nframes_t now); - void transport_stopped (nframes_t frame); - void set_automation_state (AutoState); - void set_automation_style (AutoStyle); + /* old school automation loading */ - Curve& automation() { return _automation; } + int load (istream&, string path, uint32_t&); protected: float left; @@ -159,23 +135,21 @@ class BaseStereoPanner : public StreamPanner float desired_right; float left_interp; float right_interp; - - Curve _automation; }; class EqualPowerStereoPanner : public BaseStereoPanner { public: - EqualPowerStereoPanner (Panner&); + EqualPowerStereoPanner (Panner&, Evoral::Parameter param); ~EqualPowerStereoPanner (); - void distribute_automated (Sample* src, Sample** obufs, + void distribute_automated (AudioBuffer& src, BufferSet& obufs, nframes_t start, nframes_t end, nframes_t nframes, pan_t** buffers); void get_current_coefficients (pan_t*) const; void get_desired_coefficients (pan_t*) const; - static StreamPanner* factory (Panner&); + static StreamPanner* factory (Panner&, Evoral::Parameter param); static string name; XMLNode& state (bool full_state); @@ -189,40 +163,30 @@ class EqualPowerStereoPanner : public BaseStereoPanner class Multi2dPanner : public StreamPanner { public: - Multi2dPanner (Panner& parent); + Multi2dPanner (Panner& parent, Evoral::Parameter); ~Multi2dPanner (); - void snapshot (nframes_t now); - void transport_stopped (nframes_t frame); - void set_automation_state (AutoState); - void set_automation_style (AutoStyle); - - /* XXX this is wrong. for multi-dimensional panners, there - must surely be more than 1 automation curve. - */ - - Curve& automation() { return _automation; } - - void distribute (Sample* src, Sample** obufs, gain_t gain_coeff, nframes_t nframes); - void distribute_automated (Sample* src, Sample** obufs, - nframes_t start, nframes_t end, nframes_t nframes, pan_t** buffers); - - int load (istream&, string path, uint32_t&); - int save (ostream&) const; + 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&); + static StreamPanner* factory (Panner&, Evoral::Parameter); static string name; XMLNode& state (bool full_state); XMLNode& get_state (void); int set_state (const XMLNode&); + /* old school automation loading */ + + int load (istream&, string path, uint32_t&); + private: - Curve _automation; void update (); }; -class Panner : public std::vector, public Stateful, public sigc::trackable + +class Panner : public Processor { public: struct Output { @@ -236,39 +200,43 @@ class Panner : public std::vector, public Stateful, public sigc:: }; + //Panner (std::string name, Session&, int _num_bufs); Panner (string name, Session&); virtual ~Panner (); - void set_name (string); + void clear_panners (); + + + /// The fundamental Panner function + 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; - int load (); - int save () 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 } @@ -278,7 +246,6 @@ class Panner : public std::vector, public Stateful, public sigc:: Output& output (uint32_t n) { return outputs[n]; } std::vector outputs; - Session& session() const { return _session; } enum LinkDirection { SameDirection, @@ -291,6 +258,10 @@ class Panner : public std::vector, public Stateful, public sigc:: 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 */ @@ -299,17 +270,49 @@ class Panner : public std::vector, public Stateful, public sigc:: void set_position (float x, StreamPanner& orig); void set_position (float x, float y, StreamPanner& orig); void set_position (float x, float y, float z, StreamPanner& orig); - - private: - string automation_path; - Session& _session; + /* old school automation */ + + 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); + std::vector _streampanners; uint32_t current_outs; bool _linked; bool _bypassed; LinkDirection _link_direction; static float current_automation_version_number; + + /* old school automation handling */ + + std::string automation_path; }; } // namespace ARDOUR