@@ -29,12 +29,12 @@ | |||
#include "CarlaBackendUtils.hpp" | |||
#include "CarlaMathUtils.hpp" | |||
#include "juce_core.h" | |||
#include "linuxsampler/EngineFactory.h" | |||
#include <linuxsampler/Sampler.h> | |||
// FIXME | |||
#include <QtCore/QFileInfo> | |||
#include <QtCore/QStringList> | |||
// ----------------------------------------------------------------------- | |||
namespace LinuxSampler { | |||
@@ -68,19 +68,14 @@ public: | |||
// ------------------------------------------------------------------- | |||
// LinuxSampler virtual methods | |||
void Play() override | |||
{ | |||
} | |||
void Play() override {} | |||
void Stop() override {} | |||
bool IsPlaying() override | |||
{ | |||
return (fEngine->isRunning() && fPlugin->isEnabled()); | |||
} | |||
void Stop() override | |||
{ | |||
} | |||
uint MaxSamplesPerCycle() override | |||
{ | |||
return fEngine->getBufferSize(); | |||
@@ -123,9 +118,7 @@ class MidiInputPortPlugin : public MidiInputPort | |||
{ | |||
public: | |||
MidiInputPortPlugin(MidiInputDevice* const device, const int portNum) | |||
: MidiInputPort(device, portNum) | |||
{ | |||
} | |||
: MidiInputPort(device, portNum) {} | |||
~MidiInputPortPlugin() override {} | |||
}; | |||
@@ -137,20 +130,13 @@ class MidiInputDevicePlugin : public MidiInputDevice | |||
{ | |||
public: | |||
MidiInputDevicePlugin(Sampler* const sampler) | |||
: MidiInputDevice(std::map<String, DeviceCreationParameter*>(), sampler) | |||
{ | |||
} | |||
: MidiInputDevice(std::map<String, DeviceCreationParameter*>(), sampler) {} | |||
// ------------------------------------------------------------------- | |||
// LinuxSampler virtual methods | |||
void Listen() override | |||
{ | |||
} | |||
void StopListen() override | |||
{ | |||
} | |||
void Listen() override {} | |||
void StopListen() override {} | |||
String Driver() override | |||
{ | |||
@@ -172,11 +158,12 @@ public: | |||
// ----------------------------------------------------------------------- | |||
using juce::File; | |||
using juce::StringArray; | |||
CARLA_BACKEND_START_NAMESPACE | |||
#if 0 | |||
} | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
class LinuxSamplerPlugin : public CarlaPlugin | |||
{ | |||
@@ -411,19 +398,16 @@ public: | |||
if (fUses16Outs) | |||
{ | |||
QStringList midiProgramList(QString(value).split(":", QString::SkipEmptyParts)); | |||
StringArray midiProgramList(StringArray::fromTokens(value, ":", "")); | |||
if (midiProgramList.count() == MAX_MIDI_CHANNELS) | |||
if (midiProgramList.size() == MAX_MIDI_CHANNELS) | |||
{ | |||
uint i = 0; | |||
foreach (const QString& midiProg, midiProgramList) | |||
uint8_t channel = 0; | |||
for (juce::String *it=midiProgramList.begin(), *end=midiProgramList.end(); it != end; ++it) | |||
{ | |||
CARLA_SAFE_ASSERT_BREAK(i < MAX_MIDI_CHANNELS); | |||
bool ok; | |||
int index = midiProg.toInt(&ok); | |||
const int index(it->getIntValue()); | |||
if (ok && index >= 0 && index < static_cast<int>(pData->midiprog.count)) | |||
if (index >= 0 && index < static_cast<int>(pData->midiprog.count)) | |||
{ | |||
const uint32_t bank = pData->midiprog.data[index].bank; | |||
const uint32_t program = pData->midiprog.data[index].program; | |||
@@ -431,27 +415,26 @@ public: | |||
/*if (pData->engine->isOffline()) | |||
{ | |||
fEngineChannels[i]->PrepareLoadInstrument(pData->filename, rIndex); | |||
fEngineChannels[i]->LoadInstrument(); | |||
fEngineChannels[channel]->PrepareLoadInstrument(pData->filename, rIndex); | |||
fEngineChannels[channel]->LoadInstrument(); | |||
} | |||
else*/ | |||
{ | |||
fInstrument->LoadInstrumentInBackground(fInstrumentIds[rIndex], fEngineChannels[i]); | |||
fInstrument->LoadInstrumentInBackground(fInstrumentIds[rIndex], fEngineChannels[channel]); | |||
} | |||
fCurMidiProgs[i] = index; | |||
fCurMidiProgs[channel] = index; | |||
if (pData->ctrlChannel == static_cast<int32_t>(i)) | |||
if (pData->ctrlChannel == static_cast<int32_t>(channel)) | |||
{ | |||
pData->midiprog.current = index; | |||
pData->engine->callback(ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED, pData->id, index, 0, 0.0f, nullptr); | |||
} | |||
} | |||
++i; | |||
++channel; | |||
} | |||
CARLA_SAFE_ASSERT(i == MAX_MIDI_CHANNELS); | |||
CARLA_SAFE_ASSERT(channel == MAX_MIDI_CHANNELS); | |||
} | |||
} | |||
@@ -1361,26 +1344,11 @@ CarlaPlugin* CarlaPlugin::newLinuxSampler(const Initializer& init, const char* c | |||
// ------------------------------------------------------------------- | |||
// Check if file exists | |||
{ | |||
QFileInfo file(init.filename); | |||
if (! file.exists()) | |||
{ | |||
init.engine->setLastError("Requested file does not exist"); | |||
return nullptr; | |||
} | |||
if (! file.isFile()) | |||
{ | |||
init.engine->setLastError("Requested file is not valid"); | |||
return nullptr; | |||
} | |||
if (! file.isReadable()) | |||
{ | |||
init.engine->setLastError("Requested file is not readable"); | |||
return nullptr; | |||
} | |||
if (! File(init.filename).existsAsFile()) | |||
{ | |||
init.engine->setLastError("Requested file is not valid or does not exist"); | |||
return nullptr; | |||
} | |||
LinuxSamplerPlugin* const plugin(new LinuxSamplerPlugin(init.engine, init.id, format, use16Outs)); | |||
@@ -36,10 +36,9 @@ extern "C" { | |||
#include "rtmempool/rtmempool-lv2.h" | |||
} | |||
// FIXME | |||
#include <QtCore/QDir> | |||
#include <QtCore/QFile> | |||
#include <QtCore/QUrl> | |||
#include "juce_core.h" | |||
using juce::File; | |||
#define URI_CARLA_ATOM_WORKER "http://kxstudio.sf.net/ns/carla/atomWorker" | |||
#define URI_CARLA_FRONTEND_WIN_ID "http://kxstudio.sf.net/ns/carla/frontendWinId" | |||
@@ -971,10 +970,11 @@ public: | |||
if (fLv2Options.windowTitle == nullptr) | |||
return; | |||
QString guiTitle(QString("%1 (GUI)").arg(pData->name)); | |||
CarlaString guiTitle(pData->name); | |||
guiTitle += " (GUI)"; | |||
delete[] fLv2Options.windowTitle; | |||
fLv2Options.windowTitle = carla_strdup(guiTitle.toUtf8().constData()); | |||
fLv2Options.windowTitle = guiTitle.dup(); | |||
fLv2Options.opts[Lv2PluginOptions::WindowTitle].size = (uint32_t)std::strlen(fLv2Options.windowTitle); | |||
fLv2Options.opts[Lv2PluginOptions::WindowTitle].value = fLv2Options.windowTitle; | |||
@@ -3926,9 +3926,7 @@ public: | |||
bridgeBinary += ".exe"; | |||
#endif | |||
QFile file(bridgeBinary.buffer()); | |||
if (! file.exists()) | |||
if (! File(bridgeBinary.buffer()).existsAsFile()) | |||
return nullptr; | |||
return bridgeBinary.dup(); | |||
@@ -4555,16 +4553,17 @@ public: | |||
{ | |||
if (! is_lv2_feature_supported(fRdfDescriptor->Features[j].URI)) | |||
{ | |||
QString msg(QString("Plugin wants a feature that is not supported:\n%1").arg(fRdfDescriptor->Features[j].URI)); | |||
CarlaString msg("Plugin wants a feature that is not supported:\n"); | |||
msg += fRdfDescriptor->Features[j].URI; | |||
if (LV2_IS_FEATURE_REQUIRED(fRdfDescriptor->Features[j].Type)) | |||
{ | |||
canContinue = false; | |||
pData->engine->setLastError(msg.toUtf8().constData()); | |||
pData->engine->setLastError(msg); | |||
break; | |||
} | |||
else | |||
carla_stderr("%s", msg.toUtf8().constData()); | |||
carla_stderr("%s", msg.buffer()); | |||
} | |||
} | |||
@@ -5085,8 +5084,9 @@ public: | |||
// --------------------------------------------------------------- | |||
// initialize ui data | |||
QString guiTitle(QString("%1 (GUI)").arg(pData->name)); | |||
fLv2Options.windowTitle = carla_strdup(guiTitle.toUtf8().constData()); | |||
CarlaString guiTitle(pData->name); | |||
guiTitle += " (GUI)"; | |||
fLv2Options.windowTitle = guiTitle.dup(); | |||
fLv2Options.opts[Lv2PluginOptions::WindowTitle].size = (uint32_t)std::strlen(fLv2Options.windowTitle); | |||
fLv2Options.opts[Lv2PluginOptions::WindowTitle].value = fLv2Options.windowTitle; | |||
@@ -5414,8 +5414,7 @@ private: | |||
CARLA_SAFE_ASSERT_RETURN(path != nullptr && path[0] != '\0', nullptr); | |||
carla_debug("carla_lv2_state_make_path(%p, \"%s\")", handle, path); | |||
QDir dir; | |||
dir.mkpath(path); | |||
File(path).createDirectory(); | |||
return strdup(path); | |||
} | |||
@@ -5425,8 +5424,7 @@ private: | |||
CARLA_SAFE_ASSERT_RETURN(absolute_path != nullptr && absolute_path[0] != '\0', nullptr); | |||
carla_debug("carla_lv2_state_map_abstract_path(%p, \"%s\")", handle, absolute_path); | |||
QDir dir(absolute_path); | |||
return strdup(dir.canonicalPath().toUtf8().constData()); | |||
return strdup(File(absolute_path).getRelativePathFrom(File::getCurrentWorkingDirectory()).toRawUTF8()); | |||
} | |||
static char* carla_lv2_state_map_absolute_path(LV2_State_Map_Path_Handle handle, const char* abstract_path) | |||
@@ -5435,8 +5433,7 @@ private: | |||
CARLA_SAFE_ASSERT_RETURN(abstract_path != nullptr && abstract_path[0] != '\0', nullptr); | |||
carla_debug("carla_lv2_state_map_absolute_path(%p, \"%s\")", handle, abstract_path); | |||
QDir dir(abstract_path); | |||
return strdup(dir.absolutePath().toUtf8().constData()); | |||
return strdup(File(abstract_path).getFullPathName().toRawUTF8()); | |||
} | |||
static LV2_State_Status carla_lv2_state_store(LV2_State_Handle handle, uint32_t key, const void* value, size_t size, uint32_t type, uint32_t flags) | |||
@@ -74,7 +74,7 @@ DssiPlugin.cpp.o: DssiPlugin.cpp $(DSSI_PLUGIN_CPP_DEPS) | |||
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
Lv2Plugin.cpp.o: Lv2Plugin.cpp $(LV2_PLUGIN_CPP_DEPS) | |||
$(CXX) $< $(BUILD_CXX_FLAGS) $(QTCORE_FLAGS) -c -o $@ | |||
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
VstPlugin.cpp.o: VstPlugin.cpp $(VST_PLUGIN_CPP_DEPS) | |||
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
@@ -92,6 +92,6 @@ FluidSynthPlugin.cpp.o: FluidSynthPlugin.cpp $(FLUIDSYNTH_PLUGIN_CPP_DEPS) | |||
$(CXX) $< $(BUILD_CXX_FLAGS) $(FLUIDSYNTH_FLAGS) -c -o $@ | |||
LinuxSamplerPlugin.cpp.o: LinuxSamplerPlugin.cpp $(LINUXSAMPLER_PLUGIN_CPP_DEPS) | |||
$(CXX) $< $(BUILD_CXX_FLAGS) $(LINUXSAMPLER_FLAGS) $(QTCORE_FLAGS) -c -o $@ | |||
$(CXX) $< $(BUILD_CXX_FLAGS) $(LINUXSAMPLER_FLAGS) -c -o $@ | |||
# -------------------------------------------------------------- |
@@ -13,9 +13,6 @@ BUILD_CXX_FLAGS += -I../backend -I../includes -I../utils -isystem ../modules | |||
BUILD_CXX_FLAGS += -I../includes/ladspa -I../includes/vst -I../includes/vst3 | |||
#-Wno-multichar | |||
BUILD_CXX_FLAGS += $(QTCORE_FLAGS) | |||
LINK_FLAGS += $(QTCORE_LIBS) | |||
ifeq ($(MACOS),true) | |||
BUILD_CXX_FLAGS += -ObjC++ | |||
endif | |||
@@ -47,12 +47,10 @@ | |||
#include <iostream> | |||
#include "juce_audio_basics.h" | |||
using juce::File; | |||
using juce::FloatVectorOperations; | |||
// FIXME | |||
#include <QtCore/QDir> | |||
#include <QtCore/QFileInfo> | |||
#include <QtCore/QUrl> | |||
using juce::String; | |||
using juce::StringArray; | |||
#define DISCOVERY_OUT(x, y) std::cout << "\ncarla-discovery::" << x << "::" << y << std::endl; | |||
@@ -965,41 +963,43 @@ static void do_lv2_check(const char* const bundle, const bool init) | |||
Lv2WorldClass& lv2World(Lv2WorldClass::getInstance()); | |||
// Convert bundle filename to URI | |||
QString qBundle(QUrl::fromLocalFile(bundle).toString()); | |||
if (! qBundle.endsWith(OS_SEP_STR)) | |||
qBundle += OS_SEP_STR; | |||
CarlaString sBundle("file://"); | |||
sBundle += bundle; | |||
if (! sBundle.endsWith(OS_SEP)) | |||
sBundle += OS_SEP_STR; | |||
// Load bundle | |||
lv2World.load_bundle(qBundle.toUtf8().constData()); | |||
lv2World.load_bundle(sBundle); | |||
// Load plugins in this bundle | |||
const Lilv::Plugins lilvPlugins(lv2World.get_all_plugins()); | |||
// Get all plugin URIs in this bundle | |||
QStringList URIs; | |||
StringArray URIs; | |||
LILV_FOREACH(plugins, it, lilvPlugins) | |||
{ | |||
Lilv::Plugin lilvPlugin(lilv_plugins_get(lilvPlugins, it)); | |||
if (const char* const uri = lilvPlugin.get_uri().as_string()) | |||
URIs.append(QString(uri)); | |||
URIs.addIfNotAlreadyThere(String(uri)); | |||
} | |||
if (URIs.count() == 0) | |||
if (URIs.size() == 0) | |||
{ | |||
DISCOVERY_OUT("warning", "LV2 Bundle doesn't provide any plugins"); | |||
return; | |||
} | |||
// Get & check every plugin-instance | |||
for (int i=0, count=URIs.count(); i < count; ++i) | |||
for (int i=0, count=URIs.size(); i < count; ++i) | |||
{ | |||
const LV2_RDF_Descriptor* const rdfDescriptor(lv2_rdf_new(URIs.at(i).toUtf8().constData(), false)); | |||
const LV2_RDF_Descriptor* const rdfDescriptor(lv2_rdf_new(URIs[i].toRawUTF8(), false)); | |||
if (rdfDescriptor == nullptr || rdfDescriptor->URI == nullptr) | |||
{ | |||
DISCOVERY_OUT("error", "Failed to find LV2 plugin '" << URIs.at(i).toUtf8().constData() << "'"); | |||
DISCOVERY_OUT("error", "Failed to find LV2 plugin '" << URIs[i].toRawUTF8() << "'"); | |||
continue; | |||
} | |||
@@ -1606,30 +1606,18 @@ static void do_fluidsynth_check(const char* const filename, const bool init) | |||
static void do_linuxsampler_check(const char* const filename, const char* const stype, const bool init) | |||
{ | |||
#ifdef WANT_LINUXSAMPLER | |||
const QFileInfo file(filename); | |||
if (! file.exists()) | |||
{ | |||
DISCOVERY_OUT("error", "Requested file does not exist"); | |||
return; | |||
} | |||
const File file(filename); | |||
if (! file.isFile()) | |||
if (! file.existsAsFile()) | |||
{ | |||
DISCOVERY_OUT("error", "Requested file is not valid"); | |||
return; | |||
} | |||
if (! file.isReadable()) | |||
{ | |||
DISCOVERY_OUT("error", "Requested file is not readable"); | |||
DISCOVERY_OUT("error", "Requested file is not valid or does not exist"); | |||
return; | |||
} | |||
if (init) | |||
const LinuxSamplerScopedEngine engine(filename, stype); | |||
else | |||
LinuxSamplerScopedEngine::outputInfo(nullptr, 0, file.baseName().toUtf8().constData()); | |||
LinuxSamplerScopedEngine::outputInfo(nullptr, 0, file.getFileNameWithoutExtension().toRawUTF8()); | |||
#else | |||
DISCOVERY_OUT("error", stype << " support not available"); | |||
return; | |||
@@ -1640,28 +1628,6 @@ static void do_linuxsampler_check(const char* const filename, const char* const | |||
#endif | |||
} | |||
// -------------------------------------------------------------------------- | |||
class ScopedWorkingDirSet | |||
{ | |||
public: | |||
ScopedWorkingDirSet(const char* const filename) | |||
: fPreviousPath(QDir::currentPath()) | |||
{ | |||
QDir dir(filename); | |||
dir.cdUp(); | |||
QDir::setCurrent(dir.absolutePath()); | |||
} | |||
~ScopedWorkingDirSet() | |||
{ | |||
QDir::setCurrent(fPreviousPath); | |||
} | |||
private: | |||
const QString fPreviousPath; | |||
}; | |||
// ------------------------------ main entry point ------------------------------ | |||
int main(int argc, char* argv[]) | |||
@@ -1676,8 +1642,6 @@ int main(int argc, char* argv[]) | |||
const char* const filename = argv[2]; | |||
const PluginType type = getPluginTypeFromString(stype); | |||
const ScopedWorkingDirSet swds(filename); | |||
CarlaString filenameStr(filename); | |||
filenameStr.toLower(); | |||
@@ -28,7 +28,7 @@ | |||
#define NULL nullptr | |||
#include "CarlaLadspaUtils.hpp" | |||
#include "CarlaDssiUtils.hpp" | |||
#include "CarlaDssiUtils.cpp" | |||
#include "CarlaLv2Utils.hpp" | |||
#include "CarlaVstUtils.hpp" | |||
@@ -55,38 +55,17 @@ static void test_CarlaLadspaUtils() | |||
// ----------------------------------------------------------------------- | |||
namespace dssi_juce { | |||
const char* find_dssi_ui(const char* const filename, const char* const label) noexcept; | |||
#define HAVE_JUCE | |||
#include "CarlaDssiUtils.cpp" | |||
} | |||
namespace dssi_qt { | |||
const char* find_dssi_ui(const char* const filename, const char* const label) noexcept; | |||
#undef HAVE_JUCE | |||
#include "CarlaDssiUtils.cpp" | |||
} | |||
static void test_CarlaDssiUtils() noexcept | |||
{ | |||
const char* const ui_juce = dssi_juce::find_dssi_ui("/usr/lib/dssi/trivial_sampler.so", "aa"); | |||
const char* const ui_qt = dssi_qt::find_dssi_ui("/usr/lib/dssi/trivial_sampler.so", "aa"); | |||
CARLA_SAFE_ASSERT(ui_juce != nullptr); | |||
CARLA_SAFE_ASSERT(ui_qt != nullptr); | |||
const char* const ui = find_dssi_ui("/usr/lib/dssi/trivial_sampler.so", "aa"); | |||
if (ui_juce != nullptr) | |||
{ | |||
carla_stdout("%s", ui_juce); | |||
assert(std::strcmp(ui_juce, "/usr/lib/dssi/trivial_sampler/trivial_sampler_qt") == 0); | |||
delete[] ui_juce; | |||
} | |||
CARLA_SAFE_ASSERT(ui != nullptr); | |||
if (ui_qt != nullptr) | |||
if (ui != nullptr) | |||
{ | |||
carla_stdout("%s", ui_qt); | |||
assert(std::strcmp(ui_qt, "/usr/lib/dssi/trivial_sampler/trivial_sampler_qt") == 0); | |||
delete[] ui_qt; | |||
carla_stdout("%s", ui); | |||
assert(std::strcmp(ui, "/usr/lib/dssi/trivial_sampler/trivial_sampler_qt") == 0); | |||
delete[] ui; | |||
} | |||
} | |||
@@ -61,10 +61,10 @@ | |||
#include "lilv/lilvmm.hpp" | |||
#include "sratom/sratom.h" | |||
#ifdef HAVE_JUCE | |||
# include "juce_core.h" | |||
#else | |||
#ifdef USE_QT | |||
# include <QtCore/QStringList> | |||
#else | |||
# include "juce_core.h" | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
@@ -576,17 +576,7 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri, const bool doInit) | |||
if (replaceNode.is_uri()) | |||
{ | |||
#ifdef HAVE_JUCE | |||
const juce::String replaceURI(replaceNode.as_uri()); | |||
if (replaceURI.startsWith("urn:")) | |||
{ | |||
const int uniqueId(replaceURI.getTrailingIntValue()); | |||
if (uniqueId > 0) | |||
rdfDescriptor->UniqueID = static_cast<ulong>(uniqueId); | |||
} | |||
#else | |||
#ifdef USE_QT | |||
const QString replaceURI(replaceNode.as_uri()); | |||
if (replaceURI.startsWith("urn:")) | |||
@@ -599,6 +589,16 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri, const bool doInit) | |||
if (ok && uniqueId != 0) | |||
rdfDescriptor->UniqueID = uniqueId; | |||
} | |||
#else | |||
const juce::String replaceURI(replaceNode.as_uri()); | |||
if (replaceURI.startsWith("urn:")) | |||
{ | |||
const int uniqueId(replaceURI.getTrailingIntValue()); | |||
if (uniqueId > 0) | |||
rdfDescriptor->UniqueID = static_cast<ulong>(uniqueId); | |||
} | |||
#endif | |||
} | |||
} | |||
@@ -1088,38 +1088,38 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri, const bool doInit) | |||
// create a list of preset URIs (for checking appliesTo, sorting and unique-ness) | |||
// FIXME - check appliesTo? | |||
#ifdef HAVE_JUCE | |||
juce::StringArray presetListURIs; | |||
#ifdef USE_QT | |||
QStringList presetListURIs; | |||
LILV_FOREACH(nodes, it, presetNodes) | |||
{ | |||
Lilv::Node presetNode(presetNodes.get(it)); | |||
juce::String presetURI(presetNode.as_uri()); | |||
QString presetURI(presetNode.as_uri()); | |||
if (presetURI.trim().isNotEmpty()) | |||
presetListURIs.addIfNotAlreadyThere(presetURI); | |||
if (! (presetURI.trimmed().isEmpty() || presetListURIs.contains(presetURI))) | |||
presetListURIs.append(presetURI); | |||
} | |||
presetListURIs.sortNatural(); | |||
presetListURIs.sort(); | |||
rdfDescriptor->PresetCount = static_cast<uint32_t>(presetListURIs.size()); | |||
rdfDescriptor->PresetCount = static_cast<uint32_t>(presetListURIs.count()); | |||
#else | |||
QStringList presetListURIs; | |||
juce::StringArray presetListURIs; | |||
LILV_FOREACH(nodes, it, presetNodes) | |||
{ | |||
Lilv::Node presetNode(presetNodes.get(it)); | |||
QString presetURI(presetNode.as_uri()); | |||
juce::String presetURI(presetNode.as_uri()); | |||
if (! (presetURI.trimmed().isEmpty() || presetListURIs.contains(presetURI))) | |||
presetListURIs.append(presetURI); | |||
if (presetURI.trim().isNotEmpty()) | |||
presetListURIs.addIfNotAlreadyThere(presetURI); | |||
} | |||
presetListURIs.sort(); | |||
presetListURIs.sortNatural(); | |||
rdfDescriptor->PresetCount = static_cast<uint32_t>(presetListURIs.count()); | |||
rdfDescriptor->PresetCount = static_cast<uint32_t>(presetListURIs.size()); | |||
#endif | |||
// create presets with unique URIs | |||
@@ -1135,10 +1135,10 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri, const bool doInit) | |||
if (const char* const presetURI = presetNode.as_uri()) | |||
{ | |||
#ifdef HAVE_JUCE | |||
const int index(presetListURIs.indexOf(juce::String(presetURI))); | |||
#else | |||
#ifdef USE_QT | |||
const int index(presetListURIs.indexOf(QString(presetURI))); | |||
#else | |||
const int index(presetListURIs.indexOf(juce::String(presetURI))); | |||
#endif | |||
CARLA_SAFE_ASSERT_CONTINUE(index >= 0); | |||