/* * Carla patchbay utils * Copyright (C) 2011-2020 Filipe Coelho * * 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 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 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 list; CarlaMutex mutex; PatchbayConnectionList() noexcept : lastId(0), list(), mutex() {} void clear() noexcept { lastId = 0; list.clear(); } }; // ----------------------------------------------------------------------- #endif // CARLA_PATCHBAY_UTILS_HPP_INCLUDED