#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; } } std::string m_name; bool m_is_input; bool m_is_midi; Cairo::TextExtents extents; bool m_expanded; Rect rect; virtual ConnectionMode ConnectedTo(Client *client) = 0; virtual ConnectionMode ConnectedTo(PortGroup *group) = 0; virtual ConnectionMode ConnectedTo(Port *port) = 0; }; struct Client : Base { PortGroupList m_groups; PortList m_ports; virtual ~Client() { } 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 { PortList m_ports; virtual ~PortGroup() { } 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; Client *m_client; PortGroup *m_group; PortList m_connections; std::string m_real_name; virtual ~Port() { } 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