fix visual focus indication in IOSelector; import pays attention to audio file embedd...
[ardour.git] / libs / ardour / ardour / panner.h
index 806f350e03b915b4fe054531d932c7fa40fea2eb..32d512c2534e2c3c350d37019c2aeab52c6d1a8b 100644 (file)
 #include <iostream>
 #include <sigc++/signal.h>
 
-#include <midi++/controllable.h>
+#include <pbd/stateful.h> 
+#include <pbd/controllable.h>
 
 #include <ardour/types.h>
-#include <ardour/stateful.h>
 #include <ardour/curve.h>
 
 using std::istream;
@@ -64,35 +64,18 @@ class StreamPanner : public sigc::trackable, public Stateful
 
        /* the basic panner API */
 
-       virtual void distribute (Sample* src, Sample** obufs, gain_t gain_coeff, jack_nframes_t nframes) = 0;
+       virtual void distribute (Sample* src, Sample** obufs, gain_t gain_coeff, 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;
+                                    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 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;
        
-       /* 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);
+       PBD::Controllable& control()  { return _control; }
        
        /* XXX this is wrong. for multi-dimensional panners, there
           must surely be more than 1 automation curve.
@@ -100,19 +83,18 @@ class StreamPanner : public sigc::trackable, public Stateful
 
        virtual Curve& automation() = 0;
 
-
-       virtual int load (istream&, string path, uint32_t&) = 0;
-
-       virtual int save (ostream&) const = 0;
-
        sigc::signal<void> Changed;      /* for position */
        sigc::signal<void> StateChanged; /* for mute */
 
        int set_state (const XMLNode&);
        virtual XMLNode& state (bool full_state) = 0;
-
+       
        Panner & get_parent() { return parent; }
        
+       /* old school automation loading */
+
+       virtual int load (istream&, string path, uint32_t&) = 0;
+
   protected:
        friend class Panner;
        Panner& parent;
@@ -130,12 +112,20 @@ class StreamPanner : public sigc::trackable, public Stateful
        float effective_z;
 
        bool             _muted;
-       MIDIControl _midi_control;
 
-       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);
+       struct PanControllable : public PBD::Controllable {
+           PanControllable (std::string name, StreamPanner& p) : Controllable (name), panner (p) {}
+           
+           StreamPanner& panner;
+           
+           void set_value (float);
+           float get_value (void) const;
+           bool can_send_feedback() const;
+       };
 
+       PanControllable  _control;
+
+       void add_state (XMLNode&);
        virtual void update () = 0;
 };
 
@@ -151,17 +141,19 @@ 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 (Sample* src, Sample** 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 snapshot (nframes_t now);
+       void transport_stopped (nframes_t frame);
        void set_automation_state (AutoState);
        void set_automation_style (AutoStyle);
 
        Curve& automation() { return _automation; }
 
+       /* old school automation loading */
+
+       int load (istream&, string path, uint32_t&);
+
   protected:
        float left;
        float right;
@@ -180,7 +172,7 @@ class EqualPowerStereoPanner : public BaseStereoPanner
        ~EqualPowerStereoPanner ();
 
        void distribute_automated (Sample* src, Sample** obufs, 
-                            jack_nframes_t start, jack_nframes_t end, jack_nframes_t nframes, pan_t** buffers);
+                            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;
@@ -202,8 +194,8 @@ class Multi2dPanner : public StreamPanner
        Multi2dPanner (Panner& parent);
        ~Multi2dPanner ();
 
-       void snapshot (jack_nframes_t now);
-       void transport_stopped (jack_nframes_t frame);
+       void snapshot (nframes_t now);
+       void transport_stopped (nframes_t frame);
        void set_automation_state (AutoState);
        void set_automation_style (AutoStyle);
 
@@ -213,12 +205,9 @@ class Multi2dPanner : public StreamPanner
 
        Curve& automation() { return _automation; }
 
-       void distribute (Sample* src, Sample** obufs, gain_t gain_coeff, jack_nframes_t nframes);
+       void distribute (Sample* src, Sample** obufs, gain_t gain_coeff, 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);
-
-       int load (istream&, string path, uint32_t&);
-       int save (ostream&) const;
+                                  nframes_t start, nframes_t end, nframes_t nframes, pan_t** buffers);
 
        static StreamPanner* factory (Panner&);
        static string name;
@@ -227,6 +216,10 @@ class Multi2dPanner : public StreamPanner
        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 ();
@@ -249,8 +242,6 @@ class Panner : public std::vector<StreamPanner*>, public Stateful, public sigc::
        Panner (string name, Session&);
        virtual ~Panner ();
 
-       void set_name (string);
-
        bool bypassed() const { return _bypassed; }
        void set_bypassed (bool yn);
 
@@ -259,8 +250,8 @@ class Panner : public std::vector<StreamPanner*>, public Stateful, public sigc::
        void clear ();
        void reset (uint32_t noutputs, uint32_t npans);
 
-       void snapshot (jack_nframes_t now);
-       void transport_stopped (jack_nframes_t frame);
+       void snapshot (nframes_t now);
+       void transport_stopped (nframes_t frame);
        
        void clear_automation ();
 
@@ -270,9 +261,6 @@ class Panner : public std::vector<StreamPanner*>, public Stateful, public sigc::
        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&);
@@ -290,10 +278,6 @@ class Panner : public std::vector<StreamPanner*>, public Stateful, public sigc::
        std::vector<Output> 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,
                OppositeDirection
@@ -313,10 +297,13 @@ class Panner : public std::vector<StreamPanner*>, 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);
-       
+
+       /* old school automation */
+
+       int load ();
+
   private:
 
-       string            automation_path;
        Session&         _session;
        uint32_t     current_outs;
        bool             _linked;
@@ -324,8 +311,13 @@ class Panner : public std::vector<StreamPanner*>, public Stateful, public sigc::
        LinkDirection    _link_direction;
 
        static float current_automation_version_number;
+
+       /* old school automation handling */
+
+       std::string automation_path;
+       void set_name (std::string);
 };
 
-}; /* namespace ARDOUR */
+} // namespace ARDOUR
 
 #endif /*__ardour_panner_h__ */