| @@ -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 | |||
| @@ -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); | |||
| @@ -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<EngineEvent>(fBuffer, INTERNAL_EVENT_COUNT); | |||
| carla_zeroStruct<EngineEvent>(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<float>(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 | |||
| @@ -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 | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| @@ -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; | |||
| @@ -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); | |||
| @@ -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 <QtCore/QSettings> | |||
| // | |||
| // #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) | |||
| // # include <QtWidgets/QApplication> | |||
| // #else | |||
| // # include <QtGui/QApplication> | |||
| // #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<CarlaPluginCategory>(nativePlugin->category); | |||
| info.hints = 0x0; | |||
| @@ -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) | |||
| @@ -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 | |||
| @@ -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) | |||
| @@ -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 <iostream> | |||
| #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; | |||
| @@ -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); | |||
| @@ -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<File> 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; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||