#ifndef PORT_H #define PORT_H #include #include #include #include #include "rect.h" // // Jack port names look like client_name:port_name // A proposal is to add groups by separating the port_name with a period // resulting in client_name:port_group.port_suffix. // e.g. system:main_out.L // system:main_out.R // struct Client; struct PortGroup; struct Port; typedef std::list ClientList; typedef std::list PortGroupList; typedef std::list PortList; enum ConnectionMode { CM_UNKNOWN, CM_NONE, CM_PARTIAL, CM_FULL }; struct Client; struct PortGroup; struct Port; struct Base { virtual int get_type() const = 0; ConnectionMode ConnectedTo(Base *b) { switch (b->get_type()) { case 0: return ConnectedTo((Client *)b); case 1: return ConnectedTo((PortGroup *)b); case 2: return ConnectedTo((Port *)b); default: return CM_UNKNOWN; } } virtual ConnectionMode ConnectedTo(Client *client) = 0; virtual ConnectionMode ConnectedTo(PortGroup *group) = 0; virtual ConnectionMode ConnectedTo(Port *port) = 0; }; struct Client : Base { std::string m_name; bool m_is_input; bool m_is_midi; PortGroupList m_groups; PortList m_ports; Cairo::TextExtents extents; bool m_expanded; Rect rect; virtual ConnectionMode ConnectedTo(Port *port); virtual ConnectionMode ConnectedTo(PortGroup *group); virtual ConnectionMode ConnectedTo(Client *client); virtual int get_type() const { return 0; } }; struct PortGroup : Base { std::string m_name; JackPortFlags m_flags; PortList m_ports; Cairo::TextExtents extents; bool m_expanded; Rect rect; virtual ConnectionMode ConnectedTo(Port *port); virtual ConnectionMode ConnectedTo(PortGroup *group); virtual ConnectionMode ConnectedTo(Client *client); virtual int get_type() const { return 1; } }; struct Port : Base { jack_port_t *m_port; JackPortFlags m_flags; std::string m_name; bool m_is_midi; Client *m_client; PortGroup *m_group; PortList m_connections; Cairo::TextExtents extents; Rect rect; virtual ConnectionMode ConnectedTo(Port *port); virtual ConnectionMode ConnectedTo(PortGroup *group); virtual ConnectionMode ConnectedTo(Client *client); virtual int get_type() const { return 2; } }; #endif // PORT_H