X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fpanner.h;h=da68ed8578a8836b371a3e4eabfc85f20c44354e;hb=2a6dcddcc513fa3ebc1aad4b2e5fede62277aba5;hp=954727d2809f590f067366c43a60d6e867f2ad9b;hpb=aae367b63c9b619db1e40f27dc334c6987219481;p=ardour.git diff --git a/libs/ardour/ardour/panner.h b/libs/ardour/ardour/panner.h index 954727d280..da68ed8578 100644 --- a/libs/ardour/ardour/panner.h +++ b/libs/ardour/ardour/panner.h @@ -48,15 +48,14 @@ class StreamPanner : public PBD::Stateful void set_muted (bool yn); bool muted() const { return _muted; } - void set_mono (bool); void set_position (float x, bool link_call = false); void set_position (float x, float y, bool link_call = false); void set_position (float x, float y, float z, bool link_call = false); - void get_position (float& xpos) const { xpos = x; } - void get_position (float& xpos, float& ypos) const { xpos = x; ypos = y; } - void get_position (float& xpos, float& ypos, float& zpos) const { xpos = x; ypos = y; zpos = z; } + void get_position (float& xpos) const { xpos = _x; } + void get_position (float& xpos, float& ypos) const { xpos = _x; ypos = _y; } + void get_position (float& xpos, float& ypos, float& zpos) const { xpos = _x; ypos = _y; zpos = _z; } void get_effective_position (float& xpos) const { xpos = effective_x; } void get_effective_position (float& xpos, float& ypos) const { xpos = effective_x; ypos = effective_y; } @@ -73,7 +72,7 @@ class StreamPanner : public PBD::Stateful * @param src Input buffer. * @param obufs Output buffers (one per panner output). * @param gain_coeff Gain coefficient to apply to output samples. - * @param nframes Numbner of frames in the input. + * @param nframes Number of frames in the input. */ virtual void do_distribute (AudioBuffer& src, BufferSet& obufs, gain_t gain_coeff, nframes_t nframes) = 0; virtual void do_distribute_automated (AudioBuffer& src, BufferSet& obufs, @@ -82,7 +81,7 @@ class StreamPanner : public PBD::Stateful boost::shared_ptr pan_control() { return _control; } PBD::Signal0 Changed; /* for position */ - PBD::Signal0 StateChanged; /* for mute */ + PBD::Signal0 StateChanged; /* for mute, mono */ int set_state (const XMLNode&, int version); virtual XMLNode& state (bool full_state) = 0; @@ -90,16 +89,17 @@ class StreamPanner : public PBD::Stateful Panner & get_parent() { return parent; } /* old school automation loading */ - virtual int load (std::istream&, std::string path, uint32_t&) = 0; protected: friend class Panner; Panner& parent; - float x; - float y; - float z; + void set_mono (bool); + + float _x; + float _y; + float _z; /* these are for automation. they store the last value used by the most recent process() cycle. @@ -115,6 +115,8 @@ class StreamPanner : public PBD::Stateful boost::shared_ptr _control; void add_state (XMLNode&); + + /* Update internal parameters based on _x, _y and _z */ virtual void update () = 0; }; @@ -194,23 +196,24 @@ class Multi2dPanner : public StreamPanner }; -///< Class to pan from some number of inputs to some number of outputs - -class Panner : public SessionObject, public AutomatableControls +/** Class to pan from some number of inputs to some number of outputs. + * This class has a number of StreamPanners, one for each input. + */ +class Panner : public SessionObject, public Automatable { public: struct Output { - float x; - float y; - pan_t current_pan; - pan_t desired_pan; - - Output (float xp, float yp) - : x (xp), y (yp), current_pan (0.0f), desired_pan (0.f) {} + float x; + float y; + float z; + pan_t current_pan; + pan_t desired_pan; + + Output (float xp, float yp, float zp = 0.0) + : x (xp), y (yp), z (zp), current_pan (0), desired_pan (0) {} }; - //Panner (std::string name, Session&, int _num_bufs); Panner (std::string name, Session&); virtual ~Panner (); @@ -226,10 +229,7 @@ public: bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) const { return true; }; /// The fundamental Panner function - void run (BufferSet& src, BufferSet& dest, sframes_t start_frame, sframes_t end_frames, nframes_t nframes); - - //void* get_inline_gui() const = 0; - //void* get_full_gui() const = 0; + void run (BufferSet& src, BufferSet& dest, framepos_t start_frame, framepos_t end_frames, nframes_t nframes); bool bypassed() const { return _bypassed; } void set_bypassed (bool yn); @@ -254,8 +254,6 @@ public: uint32_t nouts() const { return outputs.size(); } Output& output (uint32_t n) { return outputs[n]; } - std::vector outputs; - enum LinkDirection { SameDirection, OppositeDirection @@ -270,7 +268,7 @@ public: StreamPanner &streampanner( uint32_t n ) const { assert( n < _streampanners.size() ); return *_streampanners[n]; } uint32_t npanners() const { return _streampanners.size(); } - PBD::Signal0 Changed; + PBD::Signal0 Changed; /* panner and/or outputs count changed */ PBD::Signal0 LinkStateChanged; PBD::Signal0 StateChanged; /* for bypass */ @@ -294,24 +292,27 @@ public: AutomationList* alist() { return (AutomationList*)_list.get(); } Panner& panner; - void set_value (float); - float get_value (void) const; + void set_value (double); + double get_value (void) const; }; boost::shared_ptr pan_control (int id, int chan=0) { - return automation_control(Evoral::Parameter (PanAutomation, chan, id)); + 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)); + return automation_control (Evoral::Parameter (PanAutomation, chan, id)); } + static std::string value_as_string (double); + private: /* disallow copy construction */ Panner (Panner const &); void distribute_no_automation(BufferSet& src, BufferSet& dest, nframes_t nframes, gain_t gain_coeff); std::vector _streampanners; ///< one StreamPanner per input + std::vector outputs; uint32_t current_outs; bool _linked; bool _bypassed; @@ -320,6 +321,8 @@ public: static float current_automation_version_number; + void setup_speakers (uint32_t nouts); + /* old school automation handling */ std::string automation_path;