diff --git a/source/backend/engine/CarlaEngine.cpp b/source/backend/engine/CarlaEngine.cpp index 1e146ecee..103cd4b31 100644 --- a/source/backend/engine/CarlaEngine.cpp +++ b/source/backend/engine/CarlaEngine.cpp @@ -1303,6 +1303,20 @@ bool CarlaEngine::loadFilename(const char* const filename) return false; } +bool charEndsWith(const char* const str, const char* const suffix) +{ + if (str == nullptr || suffix == nullptr) + return false; + + const size_t strLen(std::strlen(str)); + const size_t suffixLen(std::strlen(suffix)); + + if (strLen < suffixLen) + return false; + + return (std::strncmp(str + (strLen-suffixLen), suffix, suffixLen) == 0); +} + bool CarlaEngine::loadProject(const char* const filename) { CARLA_ASSERT(filename != nullptr); @@ -1342,7 +1356,16 @@ bool CarlaEngine::loadProject(const char* const filename) const void* extraStuff = nullptr; if (std::strcmp(saveState.type, "DSSI") == 0) + { extraStuff = findDSSIGUI(saveState.binary, saveState.label); + } + else if (std::strcmp(saveState.type, "SF2") == 0) + { + const char use16OutsSuffix[] = " (16 outs)"; + + if (charEndsWith(saveState.label, use16OutsSuffix)) + extraStuff = (void*)0x1; // non-null + } // TODO - proper find&load plugins if (addPlugin(getPluginTypeFromString(saveState.type), saveState.binary, saveState.name, saveState.label, extraStuff)) diff --git a/source/backend/plugin/FluidSynthPlugin.cpp b/source/backend/plugin/FluidSynthPlugin.cpp index 1cbb8a996..6328594d8 100644 --- a/source/backend/plugin/FluidSynthPlugin.cpp +++ b/source/backend/plugin/FluidSynthPlugin.cpp @@ -1571,6 +1571,9 @@ public: fFilename = filename; fLabel = label; + if (kUses16Outs && ! fLabel.endsWith(" (16 outs)")) + fLabel += " (16 outs)"; + if (name != nullptr) fName = kData->engine->getUniquePluginName(name); else diff --git a/source/backend/plugin/LinuxSamplerPlugin.cpp b/source/backend/plugin/LinuxSamplerPlugin.cpp index 2bd5a13f1..3cf2b1910 100644 --- a/source/backend/plugin/LinuxSamplerPlugin.cpp +++ b/source/backend/plugin/LinuxSamplerPlugin.cpp @@ -1049,6 +1049,9 @@ public: fMaker = info.Artists.c_str(); fFilename = filename; + if (kUses16Outs && ! fLabel.endsWith(" (16 outs)")) + fLabel += " (16 outs)"; + if (name != nullptr) fName = kData->engine->getUniquePluginName(name); else diff --git a/source/utils/CarlaString.hpp b/source/utils/CarlaString.hpp index f22bbbb33..c04922a08 100644 --- a/source/utils/CarlaString.hpp +++ b/source/utils/CarlaString.hpp @@ -178,6 +178,32 @@ public: return (buffer[pos] >= '0' && buffer[pos] <= '9'); } + bool startsWith(const char* const prefix) const + { + if (prefix == nullptr) + return false; + + const size_t prefixLen(std::strlen(prefix)); + + if (bufferLen < prefixLen) + return false; + + return (std::strncmp(buffer + (bufferLen-prefixLen), prefix, prefixLen) == 0); + } + + bool endsWith(const char* const suffix) const + { + if (suffix == nullptr) + return false; + + const size_t suffixLen(std::strlen(suffix)); + + if (bufferLen < suffixLen) + return false; + + return (std::strncmp(buffer + (bufferLen-suffixLen), suffix, suffixLen) == 0); + } + void clear() { truncate(0);