rework Stateful::set_state() patch to avoid default version argument
[ardour.git] / libs / surfaces / generic_midi / generic_midi_control_protocol.h
1 #ifndef ardour_generic_midi_control_protocol_h
2 #define ardour_generic_midi_control_protocol_h
3
4 #include <set>
5 #include <glibmm/thread.h>
6 #include <ardour/types.h>
7
8 #include <control_protocol/control_protocol.h>
9
10 namespace MIDI {
11         class Port;
12 }
13
14 namespace PBD {
15         class Controllable;
16 }       
17
18 namespace ARDOUR {
19         class Session;
20 }
21
22 class MIDIControllable;
23
24 class GenericMidiControlProtocol : public ARDOUR::ControlProtocol {
25   public:
26         GenericMidiControlProtocol (ARDOUR::Session&);
27         virtual ~GenericMidiControlProtocol();
28
29         int set_active (bool yn);
30         static bool probe() { return true; }
31
32         MIDI::Port* port () const { return _port; }
33         void set_feedback_interval (ARDOUR::microseconds_t);
34
35         int set_feedback (bool yn);
36         bool get_feedback () const;
37
38         XMLNode& get_state ();
39         int set_state (const XMLNode&, int version);
40
41   private:
42         MIDI::Port* _port;
43         ARDOUR::microseconds_t _feedback_interval;
44         ARDOUR::microseconds_t last_feedback_time;
45
46         bool  do_feedback;
47         bool  auto_binding;
48         void _send_feedback ();
49         void  send_feedback ();
50
51         typedef std::set<MIDIControllable*> MIDIControllables;
52         MIDIControllables controllables;
53
54         typedef std::list<std::pair<MIDIControllable*,sigc::connection> > MIDIPendingControllables;
55         MIDIPendingControllables pending_controllables;
56         Glib::Mutex controllables_lock;
57         Glib::Mutex pending_lock;
58
59         bool start_learning (PBD::Controllable*);
60         void stop_learning (PBD::Controllable*);
61
62         void learning_stopped (MIDIControllable*);
63
64         void create_binding (PBD::Controllable*, int, int);
65         void delete_binding (PBD::Controllable*);
66
67         void auto_binding_on();
68         void auto_binding_off();
69
70 };
71
72 #endif /* ardour_generic_midi_control_protocol_h */