X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fpanner.h;h=f6839f6d29e36c8a7baa92829c0f9e54e7f9214e;hb=022818b4a796f52c0a91eea42e65aec0bc7bed43;hp=806f350e03b915b4fe054531d932c7fa40fea2eb;hpb=8af0757b61990767f2a85e68f535a5af9976fd79;p=ardour.git diff --git a/libs/ardour/ardour/panner.h b/libs/ardour/ardour/panner.h index 806f350e03..f6839f6d29 100644 --- a/libs/ardour/ardour/panner.h +++ b/libs/ardour/ardour/panner.h @@ -15,36 +15,40 @@ 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 #include -#include +#include +#include #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,57 +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, jack_nframes_t nframes) = 0; - virtual void distribute_automated (Sample* src, Sample** obufs, - jack_nframes_t start, jack_nframes_t end, jack_nframes_t nframes, pan_t** buffers) = 0; + 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 (jack_nframes_t now) = 0; - virtual void transport_stopped (jack_nframes_t frame) = 0; - virtual void set_automation_state (AutoState) = 0; - virtual void set_automation_style (AutoStyle) = 0; - - /* MIDI control */ - - struct MIDIControl : public MIDI::Controllable { - MIDIControl (StreamPanner&, MIDI::Port *); - void set_value (float); - void send_feedback (gain_t); - MIDI::byte* write_feedback (MIDI::byte* buf, int32_t& bufsize, gain_t val, bool force = false); - - pan_t (*midi_to_pan)(double val); - double (*pan_to_midi)(pan_t p); - - StreamPanner& sp; - bool setting; - gain_t last_written; - }; - - MIDIControl& midi_control() { return _midi_control; } - void reset_midi_control (MIDI::Port *, bool); + 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; @@ -129,20 +102,18 @@ class StreamPanner : public sigc::trackable, public Stateful float effective_y; float effective_z; - bool _muted; - MIDIControl _midi_control; + bool _muted; - void add_state (XMLNode&); - bool get_midi_node_info (XMLNode * node, MIDI::eventType & ev, MIDI::channel_t & chan, MIDI::byte & additional); - bool set_midi_node_info (XMLNode * node, MIDI::eventType ev, MIDI::channel_t chan, MIDI::byte additional); + boost::shared_ptr _control; + void add_state (XMLNode&); virtual void update () = 0; }; class BaseStereoPanner : public StreamPanner { public: - BaseStereoPanner (Panner&); + BaseStereoPanner (Panner&, Evoral::Parameter param); ~BaseStereoPanner (); /* this class just leaves the pan law itself to be defined @@ -151,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, jack_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 (jack_nframes_t now); - void transport_stopped (jack_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; @@ -169,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, - jack_nframes_t start, jack_nframes_t end, jack_nframes_t nframes, pan_t** buffers); + 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); @@ -199,40 +163,30 @@ class EqualPowerStereoPanner : public BaseStereoPanner class Multi2dPanner : public StreamPanner { public: - Multi2dPanner (Panner& parent); + Multi2dPanner (Panner& parent, Evoral::Parameter); ~Multi2dPanner (); - void snapshot (jack_nframes_t now); - void transport_stopped (jack_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, jack_nframes_t nframes); - void distribute_automated (Sample* src, Sample** obufs, - jack_nframes_t start, jack_nframes_t end, jack_nframes_t nframes, pan_t** buffers); + 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); - int load (istream&, string path, uint32_t&); - int save (ostream&) const; - - 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 { @@ -246,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 (jack_nframes_t now); - void transport_stopped (jack_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 } @@ -288,11 +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; } - - void reset_midi_control (MIDI::Port *, bool); - void send_all_midi_feedback (); - MIDI::byte* write_midi_feedback (MIDI::byte*, int32_t& bufsize); enum LinkDirection { SameDirection, @@ -305,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 */ @@ -313,19 +270,51 @@ 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 */ +} // namespace ARDOUR #endif /*__ardour_panner_h__ */