pulling trunk
[ardour.git] / libs / ardour / ardour / control_protocol_manager.h
1 #ifndef ardour_control_protocol_manager_h
2 #define ardour_control_protocol_manager_h
3
4 #include <string>
5 #include <list>
6
7 #include <sigc++/sigc++.h>
8
9 #include <glibmm/thread.h>
10
11 #include <ardour/stateful.h>
12
13 namespace ARDOUR {
14
15 class ControlProtocol;
16 class ControlProtocolDescriptor;
17 class Session;
18
19 struct ControlProtocolInfo {
20     ControlProtocolDescriptor* descriptor;
21     ControlProtocol* protocol;
22     std::string name;
23     std::string path;
24     bool requested;
25     bool mandatory;
26 };
27
28  class ControlProtocolManager : public sigc::trackable, public Stateful
29 {
30   public:
31         ControlProtocolManager ();
32         ~ControlProtocolManager ();
33
34         static ControlProtocolManager& instance() { return *_instance; }
35
36         void set_session (Session&);
37         void discover_control_protocols (std::string search_path);
38         void foreach_known_protocol (sigc::slot<void,const ControlProtocolInfo*>);
39         void load_mandatory_protocols ();
40
41         ControlProtocol* instantiate (ControlProtocolInfo&);
42         int              teardown (ControlProtocolInfo&);
43
44         std::list<ControlProtocolInfo*> control_protocol_info;
45
46         static const std::string state_node_name;
47
48         int set_state (const XMLNode&);
49         XMLNode& get_state (void);
50
51   private:
52         static ControlProtocolManager* _instance;
53
54         Session* _session;
55         Glib::Mutex protocols_lock;
56         std::list<ControlProtocol*>    control_protocols;
57
58         void drop_session ();
59
60         int control_protocol_discover (std::string path);
61         ControlProtocolDescriptor* get_descriptor (std::string path);
62         ControlProtocolInfo* cpi_by_name (std::string);
63 };
64
65 } // namespace
66
67 #endif // ardour_control_protocol_manager_h