carla/source/utils/CarlaPatchbayUtils.hpp

246 lines
5.9 KiB
C++

/*
* Carla patchbay utils
* Copyright (C) 2011-2020 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
#ifndef CARLA_PATCHBAY_UTILS_HPP_INCLUDED
#define CARLA_PATCHBAY_UTILS_HPP_INCLUDED
#include "CarlaMutex.hpp"
#include "LinkedList.hpp"
#define STR_MAX 0xFF
// -----------------------------------------------------------------------
struct GroupNameToId {
uint group;
char name[STR_MAX]; // globally unique
void clear() noexcept
{
group = 0;
name[0] = '\0';
}
void setData(const uint g, const char n[]) noexcept
{
group = g;
rename(n);
}
void rename(const char n[]) noexcept
{
std::strncpy(name, n, STR_MAX-1);
name[STR_MAX-1] = '\0';
}
bool operator==(const GroupNameToId& groupNameToId) const noexcept
{
if (groupNameToId.group != group)
return false;
if (std::strncmp(groupNameToId.name, name, STR_MAX-1) != 0)
return false;
return true;
}
bool operator!=(const GroupNameToId& groupNameToId) const noexcept
{
return !operator==(groupNameToId);
}
};
struct PatchbayGroupList {
uint lastId;
LinkedList<GroupNameToId> list;
CarlaMutex mutex;
PatchbayGroupList() noexcept
: lastId(0),
list(),
mutex() {}
void clear() noexcept
{
lastId = 0;
list.clear();
}
uint getGroupId(const char* const groupName) const noexcept;
// always returns valid pointer (non-null)
const char* getGroupName(const uint groupId) const noexcept;
};
// -----------------------------------------------------------------------
struct PortNameToId {
uint group;
uint port;
char name[STR_MAX]; // locally unique (within the same group)
char fullName[STR_MAX]; // globally unique
char identifier[STR_MAX]; // globally unique, if used
void clear() noexcept
{
group = 0;
port = 0;
name[0] = '\0';
fullName[0] = '\0';
identifier[0] = '\0';
}
void setData(const uint g, const uint p, const char n[], const char fn[]) noexcept
{
group = g;
port = p;
rename(n, fn);
}
void setDataWithIdentifier(const uint g, const uint p, const char n[], const char id[]) noexcept
{
group = g;
port = p;
std::strncpy(name, n, STR_MAX-1);
name[STR_MAX-1] = '\0';
fullName[0] = '\0';
std::strncpy(identifier, id, STR_MAX-1);
identifier[STR_MAX-1] = '\0';
}
void setFullName(const char fn[]) noexcept
{
std::strncpy(fullName, fn, STR_MAX-1);
fullName[STR_MAX-1] = '\0';
}
void rename(const char n[], const char fn[]) noexcept
{
std::strncpy(name, n, STR_MAX-1);
name[STR_MAX-1] = '\0';
std::strncpy(fullName, fn, STR_MAX-1);
fullName[STR_MAX-1] = '\0';
}
bool operator==(const PortNameToId& portNameToId) noexcept
{
if (portNameToId.group != group || portNameToId.port != port)
return false;
if (std::strncmp(portNameToId.name, name, STR_MAX-1) != 0)
return false;
if (std::strncmp(portNameToId.fullName, fullName, STR_MAX-1) != 0)
return false;
return true;
}
bool operator!=(const PortNameToId& portNameToId) noexcept
{
return !operator==(portNameToId);
}
};
struct PatchbayPortList {
uint lastId;
LinkedList<PortNameToId> list;
CarlaMutex mutex;
PatchbayPortList() noexcept
: lastId(0),
list(),
mutex() {}
void clear() noexcept
{
lastId = 0;
list.clear();
}
// always returns valid pointer (non-null)
const char* getFullPortName(const uint groupId, const uint portId) const noexcept;
const PortNameToId& getPortNameToId(const char* const fullPortName) const noexcept;
};
// -----------------------------------------------------------------------
struct ConnectionToId {
uint id;
uint groupA, portA;
uint groupB, portB;
void clear() noexcept
{
// needed for apple GCC4.2
this->id = 0;
groupA = 0;
portA = 0;
groupB = 0;
portB = 0;
}
void setData(const uint i, const uint gA, const uint pA, const uint gB, const uint pB) noexcept
{
// needed for apple GCC4.2
this->id = i;
groupA = gA;
portA = pA;
groupB = gB;
portB = pB;
}
bool operator==(const ConnectionToId& connectionToId) const noexcept
{
if (connectionToId.id != id)
return false;
if (connectionToId.groupA != groupA || connectionToId.portA != portA)
return false;
if (connectionToId.groupB != groupB || connectionToId.portB != portB)
return false;
return true;
}
bool operator!=(const ConnectionToId& connectionToId) const noexcept
{
return !operator==(connectionToId);
}
};
struct PatchbayConnectionList {
uint lastId;
LinkedList<ConnectionToId> list;
CarlaMutex mutex;
PatchbayConnectionList() noexcept
: lastId(0),
list(),
mutex() {}
void clear() noexcept
{
lastId = 0;
list.clear();
}
};
// -----------------------------------------------------------------------
#endif // CARLA_PATCHBAY_UTILS_HPP_INCLUDED