/* * Carla State utils * Copyright (C) 2012-2022 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_STATE_UTILS_HPP_INCLUDED #define CARLA_STATE_UTILS_HPP_INCLUDED #include "CarlaBackend.h" #include "LinkedList.hpp" #include "water/text/String.h" CARLA_BACKEND_START_NAMESPACE // ----------------------------------------------------------------------- struct CarlaStateSave { struct Parameter { bool dummy; // if true only midiChannel/CC are used int32_t index; const char* name; const char* symbol; float value; #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH int16_t mappedControlIndex; uint8_t midiChannel; bool mappedRangeValid; float mappedMinimum; float mappedMaximum; #endif Parameter() noexcept; ~Parameter() noexcept; CARLA_DECLARE_NON_COPYABLE(Parameter) }; typedef LinkedList ParameterList; typedef LinkedList::Itenerator ParameterItenerator; struct CustomData { const char* type; const char* key; const char* value; CustomData() noexcept; ~CustomData() noexcept; bool isValid() const noexcept; CARLA_DECLARE_NON_COPYABLE(CustomData) }; typedef LinkedList CustomDataList; typedef LinkedList::Itenerator CustomDataItenerator; const char* type; const char* name; const char* label; const char* binary; int64_t uniqueId; uint options; // saved during clone, rename or similar bool temporary; #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH bool active; float dryWet; float volume; float balanceLeft; float balanceRight; float panning; int8_t ctrlChannel; #endif int32_t currentProgramIndex; const char* currentProgramName; int32_t currentMidiBank; int32_t currentMidiProgram; const char* chunk; ParameterList parameters; CustomDataList customData; CarlaStateSave() noexcept; ~CarlaStateSave() noexcept; void clear() noexcept; bool fillFromXmlElement(const water::XmlElement* const xmlElement); void dumpToMemoryStream(water::MemoryOutputStream& stream) const; CARLA_DECLARE_NON_COPYABLE(CarlaStateSave) }; static inline water::String xmlSafeString(const char* const cstring, const bool toXml) { water::String newString = water::String(water::CharPointer_UTF8(cstring)); if (toXml) return newString.replace("&","&").replace("<","<").replace(">",">").replace("'","'").replace("\"","""); else return newString.replace("<","<").replace(">",">").replace("'","'").replace(""","\"").replace("&","&"); } static inline water::String xmlSafeString(const water::String& string, const bool toXml) { water::String newString(string); if (toXml) return newString.replace("&","&").replace("<","<").replace(">",">").replace("'","'").replace("\"","""); else return newString.replace("<","<").replace(">",">").replace("'","'").replace(""","\"").replace("&","&"); } // ----------------------------------------------------------------------- CARLA_BACKEND_END_NAMESPACE #endif // CARLA_STATE_UTILS_HPP_INCLUDED