d0087447275aa5c6ff7017b7624a00906c4fb80f
[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         bool supports_feedback () const { return true; }
38
39         XMLNode& get_state ();
40         int set_state (const XMLNode&);
41
42   private:
43         MIDI::Port* _port;
44         ARDOUR::microseconds_t _feedback_interval;
45         ARDOUR::microseconds_t last_feedback_time;
46
47         bool  do_feedback;
48         void _send_feedback ();
49         void  send_feedback ();
50
51         typedef std::set<MIDIControllable*> MIDIControllables;
52         MIDIControllables controllables;
53         MIDIControllables pending_controllables;
54         Glib::Mutex controllables_lock;
55         Glib::Mutex pending_lock;
56
57         bool start_learning (PBD::Controllable*);
58         void stop_learning (PBD::Controllable*);
59
60         void learning_stopped (MIDIControllable*);
61 };
62
63 #endif /* ardour_generic_midi_control_protocol_h */