#include <ardour/types.h>
#include <ardour/automation_control.h>
+#include <ardour/processor.h>
using std::istream;
using std::ostream;
namespace ARDOUR {
+class Route;
class Session;
class Panner;
class BufferSet;
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);
bool _muted;
- struct PanControllable : public AutomationControl {
- PanControllable (Session& s, std::string name, StreamPanner& p, Parameter param)
- : AutomationControl (s,
- boost::shared_ptr<AutomationList>(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<PanControllable> _control;
+ boost::shared_ptr<AutomationControl> _control;
void add_state (XMLNode&);
virtual void update () = 0;
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
class EqualPowerStereoPanner : public BaseStereoPanner
{
public:
- EqualPowerStereoPanner (Panner&, Parameter param);
+ EqualPowerStereoPanner (Panner&, Evoral::Parameter param);
~EqualPowerStereoPanner ();
void distribute_automated (AudioBuffer& src, BufferSet& obufs,
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);
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);
void update ();
};
-class Panner : public std::vector<StreamPanner*>, public PBD::Stateful, public sigc::trackable
+
+class Panner : public Processor
{
public:
struct Output {
};
+ //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<void> 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
}
Output& output (uint32_t n) { return outputs[n]; }
std::vector<Output> outputs;
- Session& session() const { return _session; }
enum LinkDirection {
SameDirection,
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<void> Changed;
sigc::signal<void> LinkStateChanged;
sigc::signal<void> StateChanged; /* for bypass */
int load ();
+ struct PanControllable : public AutomationControl {
+ PanControllable (Session& s, std::string name, Panner& p, Evoral::Parameter param)
+ : AutomationControl (s, param,
+ boost::shared_ptr<AutomationList>(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<AutomationControl> pan_control (int id, int chan=0) {
+ return automation_control(Evoral::Parameter (PanAutomation, chan, id));
+ }
+
+ boost::shared_ptr<const AutomationControl> 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<StreamPanner*> _streampanners;
uint32_t current_outs;
bool _linked;
bool _bypassed;
/* old school automation handling */
std::string automation_path;
- void set_name (std::string);
};
} // namespace ARDOUR