major design changes: use glib event loop for MIDI thread/UI; rework design of BaseUI...
[ardour.git] / libs / ardour / ardour / midi_ui.h
1 #ifndef __libardour_midi_ui_h__
2 #define __libardour_midi_ui_h__
3
4 #include <list>
5 #include "pbd/abstract_ui.h"
6
7 namespace MIDI { 
8         class port;
9 }
10
11 namespace ARDOUR {
12
13 class Session;
14
15 /* this is mostly a placeholder because I suspect that at some
16    point we will want to add more members to accomodate
17    certain types of requests to the MIDI UI
18 */
19
20 struct MidiUIRequest : public BaseUI::BaseRequestObject {
21   public:
22         MidiUIRequest () {}
23         ~MidiUIRequest() {}
24 };
25
26 class MidiControlUI : public AbstractUI<MidiUIRequest>
27 {
28   public:
29         MidiControlUI (Session& s);
30         ~MidiControlUI ();
31         
32         static BaseUI::RequestType PortChange;
33         
34         void change_midi_ports ();
35         
36   protected:
37         void thread_init ();
38         void do_request (MidiUIRequest*);
39         
40   private:
41         typedef std::list<Glib::RefPtr<Glib::IOSource> > PortSources;
42         PortSources port_sources;
43         ARDOUR::Session& _session;
44         
45         bool midi_input_handler (Glib::IOCondition, MIDI::Port*);
46         void reset_ports ();
47         void clear_ports ();
48 };
49
50 }
51
52 #endif /* __libardour_midi_ui_h__ */