varied and wide changes to get input and output combos closer to working
[ardour.git] / libs / surfaces / mackie / controls.h
index b17030946bc6f0f5a1fde244da5306bb643e9349..38eb30fb65d7a1f7598876a146ea3e7e10665e32 100644 (file)
 #include <string>
 #include <stdint.h>
 
+#include <boost/smart_ptr.hpp>
+
 #include "pbd/signals.h"
 
 #include "mackie_control_exception.h"
+#include "midi_byte_array.h"
 
-namespace Mackie
-{
-
-class Control;
-class Surface;
-
-/**
-       This is a loose group of controls, eg cursor buttons,
-       transport buttons, functions buttons etc.
-*/
-class Group
-{
-public:
-       Group (const std::string & name)
-               : _name (name) {}
-
-       virtual ~Group() {}
-       
-       virtual bool is_strip() const { return false; }
-       virtual bool is_master() const { return false; }
-       
-       virtual void add (Control & control);
-       
-       const std::string & name() const { return _name; }
-       void set_name (const std::string & rhs) { _name = rhs; }
-       
-       typedef std::vector<Control*> Controls;
-       const Controls & controls() const { return _controls; }
-       
-protected:
-       Controls _controls;
-       
-private:
-       std::string _name;
-};
-
-class Button;
-class Pot;
-class Fader;
-
-struct StripControlDefinition {
-    const char* name;
-    uint32_t base_id;
-    Control* (*factory)(Surface&, int index, int ordinal, const char* name, Group&);
-};
-
-struct GlobalControlDefinition {
-    const char* name;
-    uint32_t id;
-    Control* (*factory)(Surface&, int index, int ordinal, const char* name, Group&);
-    const char* group_name;
-};
-
-/**
-       This is the set of controls that make up a strip.
-*/
-class Strip : public Group
-{
-public:
-       Strip (const std::string& name, int index); /* master strip only */
-       Strip (Surface&, const std::string & name, int index, int unit_index, StripControlDefinition* ctls);
-
-       virtual bool is_strip() const { return true; }
-       virtual void add (Control & control);
-       int index() const { return _index; } // zero based
-       
-       Button & solo();
-       Button & recenable();
-       Button & mute();
-       Button & select();
-       Button & vselect();
-       Button & fader_touch();
-       Pot & vpot();
-       Fader & gain();
-       
-       bool has_solo() const { return _solo != 0; }
-       bool has_recenable() const { return _recenable != 0; }
-       bool has_mute() const { return _mute != 0; }
-       bool has_select() const { return _select != 0; }
-       bool has_vselect() const { return _vselect != 0; }
-       bool has_fader_touch() const { return _fader_touch != 0; }
-       bool has_vpot() const { return _vpot != 0; }
-       bool has_gain() const { return _gain != 0; }
-       
-private:
-       Button* _solo;
-       Button* _recenable;
-       Button* _mute;
-       Button* _select;
-       Button* _vselect;
-       Button* _fader_touch;
-       Pot*    _vpot;
-       Fader*  _gain;
-       int     _index;
-};
+namespace ARDOUR {
+       class AutomationControl;
+}
 
-std::ostream & operator <<  (std::ostream &, const Strip &);
+namespace ArdourSurface {
 
-class MasterStrip : public Strip
-{
-public:
-       MasterStrip (const std::string & name, int index)
-               : Strip (name, index) {}
-       
-       virtual bool is_master() const  { return true; }
-};
+namespace Mackie {
 
-class Led;
+class Strip;
+class Group;
+class Surface;
 
-/**
-       The base class for controls on the surface. They deliberately
-       don't know the midi protocol for updating them.
-*/
-class Control
-{
+class Control {
 public:
-       enum type_t { 
-               type_led, 
-               type_led_ring, 
-               type_fader = 0xe0, 
-               type_button = 0x90, 
-               type_pot = 0xb0 
-       };
-
-       enum base_id_t {
-               fader_base_id = 0x0,
-               pot_base_id = 0x10,
-               fader_touch_button_base_id = 0x68,
-               vselect_button_base_id = 0x20,
-               select_button_base_id = 0x18,
-               mute_button_base_id = 0x10,
-               solo_button_base_id = 0x08,
-               recenable_button_base_id = 0x0,
-       };
-       
-       Control (int id, int ordinal, std::string name, Group& group);
+       Control (int id, std::string name, Group& group);
        virtual ~Control() {}
-       
-       virtual const Led & led() const { throw MackieControlException ("no led available"); }
 
-       /// type() << 8 + midi id of the control. This
-       /// provides a unique id for any control on the surface.
-       int id() const { return (type() << 8) + _id; }
-       
-       /// the value of the second bytes of the message. It's
-       /// the id of the control, but only guaranteed to be
-       /// unique within the control type.
-       int raw_id() const { return _id; }
-       
-       /// The 1-based number of the control
-       int ordinal() const { return _ordinal; }
-       
+       int id() const { return _id; }
        const std::string & name() const  { return _name; }
-       const Group & group() const { return _group; }
-       const Strip & strip() const { return dynamic_cast<const Strip&> (_group); }
-       Strip & strip() { return dynamic_cast<Strip&> (_group); }
-       virtual bool accepts_feedback() const  { return true; }
-       
-       virtual type_t type() const = 0;
-       
-       /// Return true if this control is the one and only Jog Wheel
-       virtual bool is_jog() const { return false; }
+       Group & group() const { return _group; }
 
        bool in_use () const;
        void set_in_use (bool);
-       
-       /// Keep track of the timeout so it can be updated with more incoming events
+
+       // Keep track of the timeout so it can be updated with more incoming events
        sigc::connection in_use_connection;
 
+       virtual MidiByteArray zero() = 0;
+
        /** If we are doing an in_use timeout for a fader without touch, this
         *  is its touch button control; otherwise 0.
         */
        Control* in_use_touch_control;
 
-private:
-       int _id;
-       int _ordinal;
-       std::string _name;
-       Group& _group;
-       bool _in_use;
-};
+       boost::shared_ptr<ARDOUR::AutomationControl> control () const { return normal_ac; }
+       virtual void set_control (boost::shared_ptr<ARDOUR::AutomationControl>);
 
-std::ostream & operator <<  (std::ostream & os, const Control & control);
+       float get_value ();
+       void set_value (float val);
 
-class Fader : public Control
-{
-public:
-       Fader (int id, int ordinal, std::string name, Group & group)
-               : Control (id, ordinal, name, group)
-       {
-       }
-       
-       virtual type_t type() const { return type_fader; }
-
-       static Control* factory (Surface&, int id, int ordinal, const char*, Group&);
-};
-
-class Led : public Control
-{
-public:
-       Led (int id, int ordinal, std::string name, Group & group)
-               : Control (id, ordinal, name, group)
-       {
-       }
-       
-       virtual const Led & led() const { return *this; }
-
-       virtual type_t type() const { return type_led; }
-
-       static Control* factory (Surface&, int id, int ordinal, const char*, Group&);
-};
-
-class Button : public Control
-{
-public:
-       Button (int id, int ordinal, std::string name, Group & group)
-               : Control (id,  ordinal, name, group)
-               , _led  (id, ordinal, name + "_led", group) {}
-       
-       virtual const Led & led() const  { return _led; }
-       
-       virtual type_t type() const { return type_button; };
-
-       static Control* factory (Surface&, int id, int ordinal, const char*, Group&);
-       
-private:
-       Led _led;
-};
-
-class LedRing : public Led
-{
-public:
-       LedRing (int id, int ordinal, std::string name, Group & group)
-               : Led (id, ordinal, name, group)
-       {
-       }
-
-       virtual type_t type() const { return type_led_ring; }
-};
-
-class Pot : public Control
-{
-public:
-       Pot (int id, int ordinal, std::string name, Group & group)
-               : Control (id, ordinal, name, group)
-               , _led_ring (id, ordinal, name + "_ring", group) {}
-
-       virtual type_t type() const { return type_pot; }
+       virtual void start_touch (double when);
+       virtual void stop_touch (bool mark, double when);
 
-       virtual const LedRing & led_ring() const {return _led_ring; }
+  protected:
+       boost::shared_ptr<ARDOUR::AutomationControl> normal_ac;
 
-       static Control* factory (Surface&, int id, int ordinal, const char*, Group&);
-
-private:
-       LedRing _led_ring;
-};
-
-class Jog : public Pot
-{
-public:
-       Jog (int id, int ordinal, std::string name, Group & group)
-               : Pot  (id, ordinal, name, group)
-       {
-       }
-
-       virtual bool is_jog() const { return true; }
-
-       static Control* factory (Surface&, int id, int ordinal, const char*, Group&);
+  private:
+       int _id; /* possibly device-dependent ID */
+       std::string _name;
+       Group& _group;
+       bool _in_use;
 };
 
 }
+}
+
+std::ostream & operator <<  (std::ostream & os, const ArdourSurface::Mackie::Control & control);
 
 #endif /* __mackie_controls_h__ */