110 lines
2.3 KiB
C
110 lines
2.3 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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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
|