id_t becomes a fully-fledged object, UUID's used for IDs, generic MIDI now owns bindi...
[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 <vector>
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   private:
36         MIDI::Port* _port;
37         ARDOUR::microseconds_t _feedback_interval;
38         ARDOUR::microseconds_t last_feedback_time;
39
40         void _send_feedback ();
41         void  send_feedback ();
42
43         typedef std::vector<MIDIControllable*> MIDIControllables;
44         MIDIControllables controllables;
45         MIDIControllables pending_controllables;
46         Glib::Mutex controllables_lock;
47         Glib::Mutex pending_lock;
48
49         bool start_learning (PBD::Controllable*);
50         void stop_learning (PBD::Controllable*);
51
52         void learning_stopped (MIDIControllable*);
53 };
54
55 #endif /* ardour_generic_midi_control_protocol_h */