From 5416f36a3093efaf4d93b2f3f72c0209f82cc452 Mon Sep 17 00:00:00 2001 From: falkTX Date: Fri, 6 Sep 2013 21:15:55 +0100 Subject: [PATCH] Update discovery code, fix build; misc API changes --- source/Makefile.mk | 1 + source/backend/CarlaEngine.hpp | 37 +++---- source/backend/engine/CarlaEngine.cpp | 100 ++++-------------- source/backend/engine/CarlaEngineInternal.hpp | 12 +-- source/backend/engine/CarlaEngineThread.cpp | 4 +- source/backend/engine/CarlaEngineThread.hpp | 4 +- source/backend/standalone/CarlaStandalone.cpp | 19 +--- source/backend/standalone/Makefile | 14 +-- source/carla_database.py | 27 ----- source/discovery/Makefile | 7 +- source/discovery/carla-discovery.cpp | 47 +++++--- source/modules/CarlaNative.h | 1 + source/utils/CarlaDssiUtils.hpp | 46 +++++++- 13 files changed, 131 insertions(+), 188 deletions(-) diff --git a/source/Makefile.mk b/source/Makefile.mk index b93c02914..ddb1c1429 100644 --- a/source/Makefile.mk +++ b/source/Makefile.mk @@ -43,6 +43,7 @@ endif ifeq ($(DEBUG),true) BASE_FLAGS += -DDEBUG -O0 -g +LINK_OPTS = else BASE_FLAGS += -DNDEBUG $(BASE_OPTS) -fvisibility=hidden CXXFLAGS += -fvisibility-inlines-hidden diff --git a/source/backend/CarlaEngine.hpp b/source/backend/CarlaEngine.hpp index f00801c4b..df9156848 100644 --- a/source/backend/CarlaEngine.hpp +++ b/source/backend/CarlaEngine.hpp @@ -97,10 +97,16 @@ enum EnginePortType { kEnginePortTypeCV = 2, /*! - * Event port type. + * Event port type (Control or MIDI). ** \see CarlaEngineEventPort */ - kEnginePortTypeEvent = 3 + kEnginePortTypeEvent = 3, + + /*! + * OSC port type. + ** \see CarlaEngineOscPort + */ + kEnginePortTypeOSC = 3 }; /*! @@ -233,19 +239,14 @@ struct EngineOptions { bool preferPluginBridges; bool preferUiBridges; bool uisAlwaysOnTop; -#ifdef WANT_DSSI - bool useDssiVstChunks; -#endif unsigned int maxParameters; unsigned int uiBridgesTimeout; -#ifdef WANT_RTAUDIO - unsigned int rtaudioNumPeriods; - unsigned int rtaudioBufferSize; - unsigned int rtaudioSampleRate; - CarlaString rtaudioDevice; -#endif + unsigned int audioNumPeriods; + unsigned int audioBufferSize; + unsigned int audioSampleRate; + CarlaString audioDevice; CarlaString resourceDir; @@ -284,17 +285,11 @@ struct EngineOptions { preferPluginBridges(false), preferUiBridges(true), uisAlwaysOnTop(true), -#ifdef WANT_DSSI - useDssiVstChunks(false), -#endif maxParameters(MAX_DEFAULT_PARAMETERS), uiBridgesTimeout(4000), -#ifdef WANT_RTAUDIO - rtaudioNumPeriods(2), - rtaudioBufferSize(512), - rtaudioSampleRate(44100), -#endif - resourceDir() {} + audioNumPeriods(2), + audioBufferSize(512), + audioSampleRate(44100) {} }; /*! @@ -1067,7 +1062,7 @@ public: /*! * Force register a plugin into slot \a id. \n - * This is needed so that we can receive OSC events for the plugin while it initializes. + * This is needed so we can receive OSC events for a plugin while it initializes. */ void registerEnginePlugin(const unsigned int id, CarlaPlugin* const plugin); diff --git a/source/backend/engine/CarlaEngine.cpp b/source/backend/engine/CarlaEngine.cpp index 5525cb23a..496eef1e5 100644 --- a/source/backend/engine/CarlaEngine.cpp +++ b/source/backend/engine/CarlaEngine.cpp @@ -56,31 +56,15 @@ CarlaEngineAudioPort::CarlaEngineAudioPort(const CarlaEngine& engine, const bool fBuffer(nullptr) { carla_debug("CarlaEngineAudioPort::CarlaEngineAudioPort(name:\"%s\", %s)", engine.getName(), bool2str(isInput)); - - if (fEngine.getProccessMode() == PROCESS_MODE_PATCHBAY) - fBuffer = new float[PATCHBAY_BUFFER_SIZE]; } CarlaEngineAudioPort::~CarlaEngineAudioPort() { carla_debug("CarlaEngineAudioPort::~CarlaEngineAudioPort()"); - - if (fEngine.getProccessMode() == PROCESS_MODE_PATCHBAY) - { - CARLA_ASSERT(fBuffer != nullptr); - - if (fBuffer != nullptr) - { - delete[] fBuffer; - fBuffer = nullptr; - } - } } void CarlaEngineAudioPort::initBuffer() { - if (fEngine.getProccessMode() == PROCESS_MODE_PATCHBAY && ! fIsInput) - carla_zeroFloat(fBuffer, PATCHBAY_BUFFER_SIZE); } // ----------------------------------------------------------------------- @@ -95,17 +79,17 @@ CarlaEngineCVPort::CarlaEngineCVPort(const CarlaEngine& engine, const bool isInp CarlaEngineCVPort::~CarlaEngineCVPort() { + CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr,); carla_debug("CarlaEngineCVPort::~CarlaEngineCVPort()"); - if (fBuffer != nullptr) - { - delete[] fBuffer; - fBuffer = nullptr; - } + delete[] fBuffer; + fBuffer = nullptr; } void CarlaEngineCVPort::initBuffer() { + CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr,); + carla_zeroFloat(fBuffer, fEngine.getBufferSize()); } @@ -132,7 +116,7 @@ CarlaEngineEventPort::CarlaEngineEventPort(const CarlaEngine& engine, const bool carla_debug("CarlaEngineEventPort::CarlaEngineEventPort(name:\"%s\", %s)", engine.getName(), bool2str(isInput)); if (fEngine.getProccessMode() == PROCESS_MODE_PATCHBAY) - fBuffer = new EngineEvent[INTERNAL_EVENT_COUNT]; + fBuffer = new EngineEvent[kEngineMaxInternalEventCount]; } CarlaEngineEventPort::~CarlaEngineEventPort() @@ -141,13 +125,10 @@ CarlaEngineEventPort::~CarlaEngineEventPort() if (fEngine.getProccessMode() == PROCESS_MODE_PATCHBAY) { - CARLA_ASSERT(fBuffer != nullptr); + CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr,); - if (fBuffer != nullptr) - { - delete[] fBuffer; - fBuffer = nullptr; - } + delete[] fBuffer; + fBuffer = nullptr; } } @@ -156,7 +137,7 @@ void CarlaEngineEventPort::initBuffer() if (fEngine.getProccessMode() == PROCESS_MODE_CONTINUOUS_RACK || fEngine.getProccessMode() == PROCESS_MODE_BRIDGE) fBuffer = fEngine.getInternalEventBuffer(fIsInput); else if (fEngine.getProccessMode() == PROCESS_MODE_PATCHBAY && ! fIsInput) - carla_zeroStruct(fBuffer, INTERNAL_EVENT_COUNT); + carla_zeroStruct(fBuffer, kEngineMaxInternalEventCount); } uint32_t CarlaEngineEventPort::getEventCount() const @@ -167,7 +148,7 @@ uint32_t CarlaEngineEventPort::getEventCount() const uint32_t i=0; - for (; i < INTERNAL_EVENT_COUNT; ++i) + for (; i < kEngineMaxInternalEventCount; ++i) { if (fBuffer[i].type == kEngineEventTypeNull) break; @@ -181,7 +162,7 @@ const EngineEvent& CarlaEngineEventPort::getEvent(const uint32_t index) CARLA_SAFE_ASSERT_RETURN(fIsInput, kFallbackEngineEvent); CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr, kFallbackEngineEvent); CARLA_SAFE_ASSERT_RETURN(fEngine.getProccessMode() != PROCESS_MODE_SINGLE_CLIENT && fEngine.getProccessMode() != PROCESS_MODE_MULTIPLE_CLIENTS, kFallbackEngineEvent); - CARLA_SAFE_ASSERT_RETURN(index < INTERNAL_EVENT_COUNT, kFallbackEngineEvent); + CARLA_SAFE_ASSERT_RETURN(index < kEngineMaxInternalEventCount, kFallbackEngineEvent); return fBuffer[index]; } @@ -202,7 +183,7 @@ void CarlaEngineEventPort::writeControlEvent(const uint32_t time, const uint8_t const float fixedValue(carla_fixValue(0.0f, 1.0f, value)); - for (uint32_t i=0; i < INTERNAL_EVENT_COUNT; ++i) + for (uint32_t i=0; i < kEngineMaxInternalEventCount; ++i) { if (fBuffer[i].type != kEngineEventTypeNull) continue; @@ -230,7 +211,7 @@ void CarlaEngineEventPort::writeMidiEvent(const uint32_t time, const uint8_t cha CARLA_SAFE_ASSERT_RETURN(data != nullptr,); CARLA_SAFE_ASSERT_RETURN(size > 0 && size <= 4,); - for (uint32_t i=0; i < INTERNAL_EVENT_COUNT; ++i) + for (uint32_t i=0; i < kEngineMaxInternalEventCount; ++i) { if (fBuffer[i].type != kEngineEventTypeNull) continue; @@ -324,6 +305,8 @@ CarlaEnginePort* CarlaEngineClient::addPort(const EnginePortType portType, const return new CarlaEngineCVPort(fEngine, isInput); case kEnginePortTypeEvent: return new CarlaEngineEventPort(fEngine, isInput); + case kEnginePortTypeOSC: + return nullptr; //new CarlaEngineOscPort(fEngine, isInput); } carla_stderr("CarlaEngineClient::addPort(%i, \"%s\", %s) - invalid type", portType, name, bool2str(isInput)); @@ -348,43 +331,6 @@ CarlaEngine::~CarlaEngine() delete pData; } -// ----------------------------------------------------------------------- -// Helpers - -// returned value must be deleted -const char* findDSSIGUI(const char* const filename, const char* const label) -{ -// QString guiFilename; -// QString pluginDir(filename); -// pluginDir.resize(pluginDir.lastIndexOf(".")); -// -// QString shortName(QFileInfo(pluginDir).baseName()); -// -// QString checkLabel(label); -// QString checkSName(shortName); -// -// if (! checkLabel.endsWith("_")) checkLabel += "_"; -// if (! checkSName.endsWith("_")) checkSName += "_"; -// -// QStringList guiFiles(QDir(pluginDir).entryList()); -// -// foreach (const QString& gui, guiFiles) -// { -// if (gui.startsWith(checkLabel) || gui.startsWith(checkSName)) -// { -// QFileInfo finalname(pluginDir + QDir::separator() + gui); -// guiFilename = finalname.absoluteFilePath(); -// break; -// } -// } -// -// if (guiFilename.isEmpty()) -// return nullptr; -// -// return carla_strdup(guiFilename.toUtf8().constData()); - return nullptr; -} - // ----------------------------------------------------------------------- // Static values and calls @@ -528,8 +474,8 @@ bool CarlaEngine::init(const char* const clientName) case PROCESS_MODE_CONTINUOUS_RACK: pData->maxPluginNumber = MAX_RACK_PLUGINS; - pData->bufEvents.in = new EngineEvent[INTERNAL_EVENT_COUNT]; - pData->bufEvents.out = new EngineEvent[INTERNAL_EVENT_COUNT]; + pData->bufEvents.in = new EngineEvent[kEngineMaxInternalEventCount]; + pData->bufEvents.out = new EngineEvent[kEngineMaxInternalEventCount]; break; case PROCESS_MODE_PATCHBAY: @@ -538,8 +484,8 @@ bool CarlaEngine::init(const char* const clientName) case PROCESS_MODE_BRIDGE: pData->maxPluginNumber = 1; - pData->bufEvents.in = new EngineEvent[INTERNAL_EVENT_COUNT]; - pData->bufEvents.out = new EngineEvent[INTERNAL_EVENT_COUNT]; + pData->bufEvents.in = new EngineEvent[kEngineMaxInternalEventCount]; + pData->bufEvents.out = new EngineEvent[kEngineMaxInternalEventCount]; break; } @@ -1746,7 +1692,7 @@ void CarlaEngine::processRack(float* inBuf[2], float* outBuf[2], const uint32_t // initialize outputs (zero) carla_zeroFloat(outBuf[0], frames); carla_zeroFloat(outBuf[1], frames); - carla_zeroMem(pData->bufEvents.out, sizeof(EngineEvent)*INTERNAL_EVENT_COUNT); + carla_zeroMem(pData->bufEvents.out, sizeof(EngineEvent)*kEngineMaxInternalEventCount); bool processed = false; @@ -1763,12 +1709,12 @@ void CarlaEngine::processRack(float* inBuf[2], float* outBuf[2], const uint32_t // initialize inputs (from previous outputs) carla_copyFloat(inBuf[0], outBuf[0], frames); carla_copyFloat(inBuf[1], outBuf[1], frames); - std::memcpy(pData->bufEvents.in, pData->bufEvents.out, sizeof(EngineEvent)*INTERNAL_EVENT_COUNT); + std::memcpy(pData->bufEvents.in, pData->bufEvents.out, sizeof(EngineEvent)*kEngineMaxInternalEventCount); // initialize outputs (zero) carla_zeroFloat(outBuf[0], frames); carla_zeroFloat(outBuf[1], frames); - carla_zeroMem(pData->bufEvents.out, sizeof(EngineEvent)*INTERNAL_EVENT_COUNT); + carla_zeroMem(pData->bufEvents.out, sizeof(EngineEvent)*kEngineMaxInternalEventCount); } // process diff --git a/source/backend/engine/CarlaEngineInternal.hpp b/source/backend/engine/CarlaEngineInternal.hpp index fed8efda7..e905382ca 100644 --- a/source/backend/engine/CarlaEngineInternal.hpp +++ b/source/backend/engine/CarlaEngineInternal.hpp @@ -70,6 +70,8 @@ const char* EnginePortType2Str(const EnginePortType type) return "kEnginePortTypeCV"; case kEnginePortTypeEvent: return "kEnginePortTypeEvent"; + case kEnginePortTypeOSC: + return "kEnginePortTypeOSC"; } carla_stderr("CarlaBackend::EnginePortType2Str(%i) - invalid type", type); @@ -118,8 +120,7 @@ const char* EngineControlEventType2Str(const EngineControlEventType type) // ----------------------------------------------------------------------- -const unsigned short INTERNAL_EVENT_COUNT = 512; -const uint32_t PATCHBAY_BUFFER_SIZE = 128; +const unsigned short kEngineMaxInternalEventCount = 512; enum EnginePostAction { kEnginePostActionNull, @@ -133,19 +134,12 @@ struct EnginePluginData { float insPeak[2]; float outsPeak[2]; -#ifdef CARLA_PROPER_CPP11_SUPPORT - EnginePluginData() - : plugin(nullptr), - insPeak{0.0f}, - outsPeak{0.0f} {} -#else EnginePluginData() : plugin(nullptr) { insPeak[0] = insPeak[1] = nullptr; outsPeak[0] = outsPeak[1] = nullptr; } -#endif }; // ----------------------------------------------------------------------- diff --git a/source/backend/engine/CarlaEngineThread.cpp b/source/backend/engine/CarlaEngineThread.cpp index 2c729bd63..c7eb71491 100644 --- a/source/backend/engine/CarlaEngineThread.cpp +++ b/source/backend/engine/CarlaEngineThread.cpp @@ -25,7 +25,7 @@ CARLA_BACKEND_START_NAMESPACE // ----------------------------------------------------------------------- CarlaEngineThread::CarlaEngineThread(CarlaEngine* const engine) - : juce::Thread("CarlaEngineThread"), + : Thread("CarlaEngineThread"), fEngine(engine) { CARLA_ASSERT(engine != nullptr); @@ -60,7 +60,7 @@ void CarlaEngineThread::run() for (i=0, count = fEngine->getCurrentPluginCount(); i < count; ++i) { - CarlaPlugin* const plugin = fEngine->getPluginUnchecked(i); + CarlaPlugin* const plugin(fEngine->getPluginUnchecked(i)); if (plugin == nullptr || ! plugin->isEnabled()) continue; diff --git a/source/backend/engine/CarlaEngineThread.hpp b/source/backend/engine/CarlaEngineThread.hpp index 8346f212d..b94fdb371 100644 --- a/source/backend/engine/CarlaEngineThread.hpp +++ b/source/backend/engine/CarlaEngineThread.hpp @@ -21,13 +21,15 @@ #include "CarlaBackend.hpp" #include "CarlaJuceUtils.hpp" +using juce::Thread; + CARLA_BACKEND_START_NAMESPACE #if 0 } // Fix editor indentation #endif -class CarlaEngineThread : public juce::Thread +class CarlaEngineThread : public Thread { public: CarlaEngineThread(CarlaEngine* const engine); diff --git a/source/backend/standalone/CarlaStandalone.cpp b/source/backend/standalone/CarlaStandalone.cpp index 12f91890f..a06b1f2c6 100644 --- a/source/backend/standalone/CarlaStandalone.cpp +++ b/source/backend/standalone/CarlaStandalone.cpp @@ -19,21 +19,12 @@ #include "CarlaBackendUtils.hpp" #include "CarlaOscUtils.hpp" + #include "CarlaEngine.hpp" #include "CarlaPlugin.hpp" -#include "CarlaMIDI.h" #include "CarlaNative.h" #include "CarlaLogThread.hpp" -#include "CarlaStyle.hpp" - -// #include -// -// #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) -// # include -// #else -// # include -// #endif #if ! (defined(DEBUG) || defined(WANT_LOGS) || defined(BUILD_ANSI_TEST)) # define WANT_LOGS @@ -46,9 +37,6 @@ using CB::CarlaPlugin; using CB::EngineOptions; using CB::EngineTimeInfo; -// TEST -int main() { return 0; } - // ------------------------------------------------------------------------------------------------------------------- // Single, standalone engine @@ -263,10 +251,7 @@ const CarlaNativePluginInfo* carla_get_internal_plugin_info(unsigned int interna const PluginDescriptor* const nativePlugin(CarlaPlugin::getNativePluginDescriptor(internalPluginId)); // as internal plugin, this must never fail - CARLA_ASSERT(nativePlugin != nullptr); - - if (nativePlugin == nullptr) - return nullptr; + CARLA_SAFE_ASSERT_RETURN(nativePlugin != nullptr, nullptr); info.category = static_cast(nativePlugin->category); info.hints = 0x0; diff --git a/source/backend/standalone/Makefile b/source/backend/standalone/Makefile index 73d70415a..949b286f9 100644 --- a/source/backend/standalone/Makefile +++ b/source/backend/standalone/Makefile @@ -11,24 +11,12 @@ include ../Makefile.mk BUILD_CXX_FLAGS += -I../../modules/theme BUILD_CXX_FLAGS += $(shell pkg-config --cflags liblo) -ifeq ($(HAVE_QT4),true) -BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtGui) -else -BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core Qt5Widgets) -endif - # -------------------------------------------------------------- # Common LINK_FLAGS += $(shell pkg-config --libs liblo) LINK_FLAGS += -lpthread -ifeq ($(HAVE_QT4),true) -LINK_FLAGS += $(shell pkg-config --libs QtCore QtGui QtXml) -else -LINK_FLAGS += $(shell pkg-config --libs Qt5Core Qt5Gui Qt5Xml Qt5Widgets) -endif - # -------------------------------------------------------------- # Engine @@ -101,8 +89,8 @@ endif LIBS = ../libcarla_engine.a LIBS += ../libcarla_plugin.a LIBS += ../../modules/carla_native.a -LIBS += ../../modules/juce_core.a LIBS += ../../modules/juce_audio_basics.a +LIBS += ../../modules/juce_core.a LIBS += ../../modules/rtmempool.a ifeq ($(CARLA_PLUGIN_SUPPORT),true) diff --git a/source/carla_database.py b/source/carla_database.py index 8ee601653..0d0d7338d 100644 --- a/source/carla_database.py +++ b/source/carla_database.py @@ -113,33 +113,6 @@ def findFilenames(filePath, stype): return filenames -# FIXME - put this into c++ discovery -def findDSSIGUI(filename, name, label): - pluginDir = filename.rsplit(".", 1)[0] - shortName = os.path.basename(pluginDir) - guiFilename = "" - - checkName = name.replace(" ", "_") - checkLabel = label - checkSName = shortName - - if checkName[-1] != "_": checkName += "_" - if checkLabel[-1] != "_": checkLabel += "_" - if checkSName[-1] != "_": checkSName += "_" - - for root, dirs, files in os.walk(pluginDir): - guiFiles = files - break - else: - guiFiles = [] - - for guiFile in guiFiles: - if guiFile.startswith((checkName, checkLabel, checkSName)): - guiFilename = os.path.join(pluginDir, guiFile) - break - - return guiFilename - # ------------------------------------------------------------------------------------------------------------ # Plugin Query diff --git a/source/discovery/Makefile b/source/discovery/Makefile index 8c50a499c..4ca305309 100644 --- a/source/discovery/Makefile +++ b/source/discovery/Makefile @@ -9,6 +9,7 @@ include ../Makefile.mk # -------------------------------------------------------------- BUILD_CXX_FLAGS += -I../backend -I../includes -I../modules -I../utils +BUILD_CXX_FLAGS += -DWANT_NATIVE ifeq ($(CARLA_PLUGIN_SUPPORT),true) BUILD_CXX_FLAGS += -DWANT_LADSPA -DWANT_DSSI -DWANT_LV2 -DWANT_VST @@ -17,6 +18,10 @@ BUILD_CXX_FLAGS += -DVESTIGE_HEADER endif endif +ifeq ($(CARLA_CSOUND_SUPPORT),true) +NATIVE_FLAGS += -DWANT_CSOUND +endif + ifeq ($(HAVE_FLUIDSYNTH),true) NATIVE_FLAGS += $(shell pkg-config --cflags --libs fluidsynth) -DWANT_FLUIDSYNTH endif @@ -30,7 +35,7 @@ endif POSIX_BUILD_FLAGS = $(BUILD_CXX_FLAGS) POSIX_32BIT_FLAGS = $(32BIT_FLAGS) -L/usr/lib32 -L/usr/lib/i386-linux-gnu POSIX_64BIT_FLAGS = $(64BIT_FLAGS) -L/usr/lib64 -L/usr/lib/x86_64-linux-gnu -POSIX_LINK_FLAGS = $(LINK_FLAGS) -ldl +POSIX_LINK_FLAGS = $(LINK_FLAGS) $(EXTRA_LIBS) -ldl WIN_BUILD_FLAGS = $(BUILD_CXX_FLAGS) WIN_32BIT_FLAGS = $(32BIT_FLAGS) diff --git a/source/discovery/carla-discovery.cpp b/source/discovery/carla-discovery.cpp index d524a8bab..f823c4125 100644 --- a/source/discovery/carla-discovery.cpp +++ b/source/discovery/carla-discovery.cpp @@ -20,8 +20,6 @@ #include "CarlaString.hpp" #include "CarlaMIDI.h" -#include "JuceHeader.h" - #ifdef WANT_LADSPA # include "CarlaLadspaUtils.hpp" #endif @@ -46,6 +44,8 @@ # undef TMP__cplusplus #endif +#include "juce_core.h" + #include #define DISCOVERY_OUT(x, y) std::cout << "\ncarla-discovery::" << x << "::" << y << std::endl; @@ -343,7 +343,7 @@ public: DISCOVERY_OUT("label", basename); } - DISCOVERY_OUT("hints", PLUGIN_IS_SYNTH); +// DISCOVERY_OUT("hints", PLUGIN_IS_SYNTH); DISCOVERY_OUT("audio.outs", 2); DISCOVERY_OUT("audio.total", 2); DISCOVERY_OUT("midi.ins", 1); @@ -743,8 +743,14 @@ void do_dssi_check(void*& libHandle, const char* const filename, const bool init if (descriptor->run_synth || descriptor->run_multiple_synths) midiIns = midiTotal = 1; - if (midiIns > 0 && audioIns == 0 && audioOuts > 0) - hints |= PLUGIN_IS_SYNTH; +// if (midiIns > 0 && audioIns == 0 && audioOuts > 0) +// hints |= PLUGIN_IS_SYNTH; + + if (const char* const ui = find_dssi_ui(filename, ldescriptor->Label)) + { + hints |= PLUGIN_HAS_GUI; + delete[] ui; + } if (init) { @@ -1112,8 +1118,8 @@ void do_lv2_check(const char* const bundle, const bool init) } } - if (rdfDescriptor->Type[1] & LV2_PLUGIN_INSTRUMENT) - hints |= PLUGIN_IS_SYNTH; +// if (rdfDescriptor->Type[1] & LV2_PLUGIN_INSTRUMENT) +// hints |= PLUGIN_IS_SYNTH; if (rdfDescriptor->UICount > 0) hints |= PLUGIN_HAS_GUI; @@ -1238,8 +1244,8 @@ void do_vst_check(void*& libHandle, const bool init) if (effect->flags & effFlagsHasEditor) hints |= PLUGIN_HAS_GUI; - if (effect->flags & effFlagsIsSynth) - hints |= PLUGIN_IS_SYNTH; +// if (effect->flags & effFlagsIsSynth) +// hints |= PLUGIN_IS_SYNTH; if (vstPluginCanDo(effect, "receiveVstEvents") || vstPluginCanDo(effect, "receiveVstMidiEvent") || (effect->flags & effFlagsIsSynth) > 0) midiIns = 1; @@ -1469,7 +1475,7 @@ void do_fluidsynth_check(const char* const filename, const bool init) DISCOVERY_OUT("label", (const char*)label); DISCOVERY_OUT("maker", ""); DISCOVERY_OUT("copyright", ""); - DISCOVERY_OUT("hints", PLUGIN_IS_SYNTH); +// DISCOVERY_OUT("hints", PLUGIN_IS_SYNTH); DISCOVERY_OUT("audio.outs", 2); DISCOVERY_OUT("audio.total", 2); DISCOVERY_OUT("midi.ins", 1); @@ -1490,7 +1496,7 @@ void do_fluidsynth_check(const char* const filename, const bool init) DISCOVERY_OUT("name", (const char*)name); DISCOVERY_OUT("label", (const char*)label); DISCOVERY_OUT("copyright", ""); - DISCOVERY_OUT("hints", PLUGIN_IS_SYNTH); +// DISCOVERY_OUT("hints", PLUGIN_IS_SYNTH); DISCOVERY_OUT("audio.outs", 32); DISCOVERY_OUT("audio.total", 32); DISCOVERY_OUT("midi.ins", 1); @@ -1601,6 +1607,19 @@ int main(int argc, char* argv[]) const char* const filename = argv[2]; const PluginType type = getPluginTypeFromString(stype); + CarlaString filenameStr(filename); + + if (filenameStr.contains("fluidsynth", true)) + { + DISCOVERY_OUT("info", "skipping fluidsynth based plugin"); + return 0; + } + if (filenameStr.contains("linuxsampler", true)) + { + DISCOVERY_OUT("info", "skipping linuxsampler based plugin"); + return 0; + } + bool openLib = false; void* handle = nullptr; @@ -1627,11 +1646,7 @@ int main(int argc, char* argv[]) } // never do init for dssi-vst, takes too long and it's crashy -#ifdef __USE_GNU - bool doInit = (strcasestr(filename, "dssi-vst") == nullptr); -#else - bool doInit = (std::strstr(filename, "dssi-vst") == nullptr); -#endif + bool doInit = ! filenameStr.contains("dssi-vst", true); if (doInit && getenv("CARLA_DISCOVERY_NO_PROCESSING_CHECKS") != nullptr) doInit = false; diff --git a/source/modules/CarlaNative.h b/source/modules/CarlaNative.h index 36e309478..f11d926a2 100644 --- a/source/modules/CarlaNative.h +++ b/source/modules/CarlaNative.h @@ -196,6 +196,7 @@ typedef struct { void (*ui_custom_data_changed)(HostHandle handle, const char* key, const char* value); void (*ui_closed)(HostHandle handle); + // TODO: add some msgbox call const char* (*ui_open_file)(HostHandle handle, bool isDir, const char* title, const char* filter); const char* (*ui_save_file)(HostHandle handle, bool isDir, const char* title, const char* filter); diff --git a/source/utils/CarlaDssiUtils.hpp b/source/utils/CarlaDssiUtils.hpp index 6e75bb243..bf68852da 100644 --- a/source/utils/CarlaDssiUtils.hpp +++ b/source/utils/CarlaDssiUtils.hpp @@ -19,16 +19,54 @@ #define CARLA_DSSI_UTILS_HPP_INCLUDED #include "CarlaLadspaUtils.hpp" - #include "dssi/dssi.h" +#include "juce_core.h" + // ----------------------------------------------------------------------- -// ... static inline -bool func() +const char* find_dssi_ui(const char* const filename, const char* const label) { - return false; + CARLA_SAFE_ASSERT_RETURN(filename != nullptr, nullptr); + CARLA_SAFE_ASSERT_RETURN(label != nullptr, nullptr); + + using namespace juce; + + File pluginFile(filename); + File pluginDir(pluginFile.getParentDirectory()); + + Array results; + + if (pluginDir.findChildFiles(results, File::findFiles|File::ignoreHiddenFiles, false) == 0) + return nullptr; + + StringArray guiFiles; + + for (int i=0, count=results.size(); i < count; ++i) + { + const File& file(results[i]); + guiFiles.add(file.getFullPathName()); + } + + String pluginDirName(pluginDir.getFullPathName()); + String pluginShortName(pluginFile.getFileNameWithoutExtension()); + + String checkLabel(label); + String checkShort(pluginShortName); + + if (! checkLabel.endsWith("_")) checkLabel += "_"; + if (! checkShort.endsWith("_")) checkShort += "_"; + + for (int i=0, count=guiFiles.size(); i < count; ++i) + { + const String& gui(guiFiles[i]); + + if (gui.startsWith(checkLabel) || gui.startsWith(checkShort)) + return carla_strdup(File(pluginDir).getChildFile(gui).getFullPathName().toRawUTF8()); + } + + return nullptr; } // -----------------------------------------------------------------------