X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fardour%2Fardour%2Fpanner.h;h=211ad0ca8eb12bf8401ddad4469407ea005a5f8c;hb=aabcbf7bad012739e02301faeed156fed29a4638;hp=7ebfe5ee032fdeb4dda82d24a3279b820eb22c2b;hpb=96cc6c3410c927ca14f50a52487e304967efdbf3;p=ardour.git diff --git a/libs/ardour/ardour/panner.h b/libs/ardour/ardour/panner.h index 7ebfe5ee03..211ad0ca8e 100644 --- a/libs/ardour/ardour/panner.h +++ b/libs/ardour/ardour/panner.h @@ -30,10 +30,23 @@ #include "pbd/signals.h" #include "pbd/stateful.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" #include "ardour/automation_control.h" #include "ardour/automatable.h" + +/* This section is for actual panners to use. They will include this file, + * declare ARDOURPANNER_DLL_EXPORTS during compilation, and ... voila. + */ + +#ifdef ARDOURPANNER_DLL_EXPORTS // defined if we are building a panner implementation + #define ARDOURPANNER_API LIBARDOUR_DLL_EXPORT + #else + #define ARDOURPANNER_API LIBARDOUR_DLL_IMPORT + #endif +#define ARDOURPANNER_LOCAL LIBARDOUR_DLL_LOCAL + namespace ARDOUR { class Session; @@ -42,48 +55,53 @@ class BufferSet; class AudioBuffer; class Speakers; -class Panner : public PBD::Stateful, public PBD::ScopedConnectionList +class LIBARDOUR_API Panner : public PBD::Stateful, public PBD::ScopedConnectionList { - public: +public: Panner (boost::shared_ptr); ~Panner (); - virtual ChanCount in() const = 0; - virtual ChanCount out() const = 0; + virtual boost::shared_ptr get_speakers() const { return boost::shared_ptr(); } + + virtual ChanCount in() const = 0; + virtual ChanCount out() const = 0; + + virtual void configure_io (ARDOUR::ChanCount /*in*/, ARDOUR::ChanCount /*out*/) {} - virtual void configure_io (ARDOUR::ChanCount /*in*/, ARDOUR::ChanCount /*out*/) {} - - /* derived implementations of these methods must indicate - whether it is legal for a Controllable to use the - value of the argument (post-call) in a call to - Controllable::set_value(). - - they have a choice of: + /* derived implementations of these methods must indicate + whether it is legal for a Controllable to use the + value of the argument (post-call) in a call to + Controllable::set_value(). - * return true, leave argument unchanged - * return true, modify argument - * return false + they have a choice of: - */ + * return true, leave argument unchanged + * return true, modify argument + * return false + */ - virtual bool clamp_position (double&) { return true; } - virtual bool clamp_width (double&) { return true; } - virtual bool clamp_elevation (double&) { return true; } + virtual bool clamp_position (double&) { return true; } + virtual bool clamp_width (double&) { return true; } + virtual bool clamp_elevation (double&) { return true; } - virtual void set_position (double) { } - virtual void set_width (double) { } - virtual void set_elevation (double) { } - - virtual double position () const { return 0.0; } - virtual double width () const { return 0.0; } - virtual double elevation () const { return 0.0; } + virtual std::pair position_range () const { return std::make_pair (-DBL_MAX, DBL_MAX); } + virtual std::pair width_range () const { return std::make_pair (-DBL_MAX, DBL_MAX); } + virtual std::pair elevation_range () const { return std::make_pair (-DBL_MAX, DBL_MAX); } - virtual PBD::AngularVector signal_position (uint32_t) const { return PBD::AngularVector(); } + virtual void set_position (double) { } + virtual void set_width (double) { } + virtual void set_elevation (double) { } - virtual void reset() {} - - virtual bool bypassed() const { return _bypassed; } - virtual void set_bypassed (bool yn); + virtual double position () const { return 0.0; } + virtual double width () const { return 0.0; } + virtual double elevation () const { return 0.0; } + + virtual PBD::AngularVector signal_position (uint32_t) const { return PBD::AngularVector(); } + + virtual void reset () = 0; + + /* azimut, width or elevation updated -> recalc signal_position -> emit Changed */ + PBD::Signal0 SignalPositionChanged; void set_automation_state (AutoState); AutoState automation_state() const; @@ -91,33 +109,33 @@ class Panner : public PBD::Stateful, public PBD::ScopedConnectionList AutoStyle automation_style() const; virtual std::set what_can_be_automated() const; - virtual std::string describe_parameter (Evoral::Parameter); - virtual std::string value_as_string (boost::shared_ptr) const; + virtual std::string describe_parameter (Evoral::Parameter); + virtual std::string value_as_string (boost::shared_ptr) const; bool touching() const; - static double azimuth_to_lr_fract (double azi) { + static double azimuth_to_lr_fract (double azi) { /* 180.0 degrees=> left => 0.0 */ /* 0.0 degrees => right => 1.0 */ - /* humans can only distinguish 1 degree of arc between two positions, - so force azi back to an integral value before computing - */ + /* humans can only distinguish 1 degree of arc between two positions, + so force azi back to an integral value before computing + */ return 1.0 - (rint(azi)/180.0); } - static double lr_fract_to_azimuth (double fract) { + static double lr_fract_to_azimuth (double fract) { /* fract = 0.0 => degrees = 180.0 => left */ /* fract = 1.0 => degrees = 0.0 => right */ - /* humans can only distinguish 1 degree of arc between two positions, - so force azi back to an integral value after computing - */ + /* humans can only distinguish 1 degree of arc between two positions, + so force azi back to an integral value after computing + */ return rint (180.0 - (fract * 180.0)); } - + /** * Pan some input buffers to a number of output buffers. * @@ -125,60 +143,60 @@ class Panner : public PBD::Stateful, public PBD::ScopedConnectionList * @param obufs Output buffers (one per panner output). * @param gain_coeff fixed, additional gain coefficient to apply to output samples. * @param nframes Number of frames in the input. - * - * Derived panners can choose to implement these if they need to gain more control over the panning algorithm. - * the default is to call distribute_one() or distribute_one_automated() on each input buffer to deliver it to each output - * buffer. - * - * If a panner does not need to override this default behaviour, it can just implement - * distribute_one() and distribute_one_automated() (below). + * + * Derived panners can choose to implement these if they need to gain more + * control over the panning algorithm. The default is to call + * distribute_one() or distribute_one_automated() on each input buffer to + * deliver it to each output buffer. + * + * If a panner does not need to override this default behaviour, it can + * just implement distribute_one() and distribute_one_automated() (below). */ virtual void distribute (BufferSet& ibufs, BufferSet& obufs, gain_t gain_coeff, pframes_t nframes); virtual void distribute_automated (BufferSet& ibufs, BufferSet& obufs, - framepos_t start, framepos_t end, pframes_t nframes, - pan_t** buffers); - - PBD::Signal0 Changed; /* for positional info */ - PBD::Signal0 StateChanged; /* for mute */ + framepos_t start, framepos_t end, pframes_t nframes, + pan_t** buffers); int set_state (const XMLNode&, int version); - virtual XMLNode& state (bool full_state) = 0; - - boost::shared_ptr pannable() const { return _pannable; } - - //virtual std::string describe_parameter (Evoral::Parameter); - //virtual std::string value_as_string (Evoral::Parameter, double val); + XMLNode& get_state (); + + boost::shared_ptr pannable() const { return _pannable; } static bool equivalent (pan_t a, pan_t b) { return fabsf (a - b) < 0.002; // about 1 degree of arc for a stereo panner } static bool equivalent (const PBD::AngularVector& a, const PBD::AngularVector& b) { - /* XXX azimuth only, at present */ + /* XXX azimuth only, at present */ return fabs (a.azi - b.azi) < 1.0; } - protected: - boost::shared_ptr _pannable; - bool _bypassed; + virtual void freeze (); + virtual void thaw (); - XMLNode& get_state (); +protected: + boost::shared_ptr _pannable; virtual void distribute_one (AudioBuffer&, BufferSet& obufs, gain_t gain_coeff, pframes_t nframes, uint32_t which) = 0; virtual void distribute_one_automated (AudioBuffer&, BufferSet& obufs, - framepos_t start, framepos_t end, pframes_t nframes, - pan_t** buffers, uint32_t which) = 0; + framepos_t start, framepos_t end, pframes_t nframes, + pan_t** buffers, uint32_t which) = 0; + + int32_t _frozen; }; } // namespace extern "C" { - struct PanPluginDescriptor { - std::string name; - int32_t in; - int32_t out; - ARDOUR::Panner* (*factory)(boost::shared_ptr, boost::shared_ptr); - }; +struct LIBARDOUR_API PanPluginDescriptor { + std::string name; + std::string panner_uri; + std::string gui_uri; + int32_t in; + int32_t out; + uint32_t priority; + ARDOUR::Panner* (*factory)(boost::shared_ptr, boost::shared_ptr); +}; } #endif /* __ardour_panner_h__ */