jsweeper/src/port.h

108 lines
2.2 KiB
C++

#ifndef PORT_H
#define PORT_H
#include <list>
#include <string>
#include <gtkmm.h>
#include <jack/jack.h>
#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<Client *> ClientList;
typedef std::list<PortGroup *> PortGroupList;
typedef std::list<Port *> 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