| @@ -8,49 +8,68 @@ include ../Makefile.mk | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| BUILD_CXX_FLAGS += -I../backend -I../includes -I../modules -I../utils | |||||
| BUILD_CXX_FLAGS += -I../backend -I../includes -I../modules -I../utils -Wno-multichar | |||||
| BUILD_CXX_FLAGS += $(QTCORE_FLAGS) | BUILD_CXX_FLAGS += $(QTCORE_FLAGS) | ||||
| LINK_FLAGS += $(QTCORE_LIBS) | LINK_FLAGS += $(QTCORE_LIBS) | ||||
| ifeq ($(HAVE_JUCE),true) | |||||
| BUILD_CXX_FLAGS += $(JUCE_CORE_FLAGS) $(JUCE_AUDIO_BASICS_FLAGS) -DHAVE_JUCE | |||||
| LINK_FLAGS += $(JUCE_CORE_LIBS) $(JUCE_AUDIO_BASICS_LIBS) | |||||
| endif | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| BUILD_CXX_FLAGS += -DWANT_NATIVE | BUILD_CXX_FLAGS += -DWANT_NATIVE | ||||
| ifeq ($(CARLA_PLUGIN_SUPPORT),true) | ifeq ($(CARLA_PLUGIN_SUPPORT),true) | ||||
| BUILD_CXX_FLAGS += -DWANT_LADSPA -DWANT_DSSI -DWANT_LV2 -DWANT_VST | BUILD_CXX_FLAGS += -DWANT_LADSPA -DWANT_DSSI -DWANT_LV2 -DWANT_VST | ||||
| ifeq ($(CARLA_VESTIGE_HEADER),true) | |||||
| ifeq ($(CARLA_VESTIGE_HEADER),true) # TODO: and not have juce | |||||
| BUILD_CXX_FLAGS += -DVESTIGE_HEADER | BUILD_CXX_FLAGS += -DVESTIGE_HEADER | ||||
| endif | endif | ||||
| endif | endif | ||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| ifeq ($(HAVE_CSOUND),true) | |||||
| # ifeq ($(HAVE_CSOUND),true) | |||||
| # NATIVE_FLAGS += $(shell pkg-config --cflags --libs sndfile) -lcsound64 -DWANT_CSOUND | # NATIVE_FLAGS += $(shell pkg-config --cflags --libs sndfile) -lcsound64 -DWANT_CSOUND | ||||
| # NATIVE_FLAGS += $(JUCE_CORE_FLAGS) $(JUCE_CORE_LIBS) | |||||
| endif | |||||
| ifeq ($(HAVE_FLUIDSYNTH),true) | |||||
| NATIVE_FLAGS += $(shell pkg-config --cflags --libs fluidsynth) -DWANT_FLUIDSYNTH | |||||
| endif | |||||
| ifeq ($(HAVE_LINUXSAMPLER),true) | |||||
| # endif | |||||
| # | |||||
| # ifeq ($(HAVE_FLUIDSYNTH),true) | |||||
| # NATIVE_FLAGS += $(shell pkg-config --cflags --libs fluidsynth) -DWANT_FLUIDSYNTH | |||||
| # endif | |||||
| # | |||||
| # ifeq ($(HAVE_LINUXSAMPLER),true) | |||||
| # NATIVE_FLAGS += $(shell pkg-config --cflags --libs linuxsampler) -DWANT_LINUXSAMPLER | # NATIVE_FLAGS += $(shell pkg-config --cflags --libs linuxsampler) -DWANT_LINUXSAMPLER | ||||
| endif | |||||
| # endif | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| ifeq ($(CARLA_PLUGIN_SUPPORT),true) | |||||
| LIBS = ../modules/lilv.a | |||||
| LIBS_posix32 = ../modules/lilv.posix32.a | |||||
| LIBS_posix64 = ../modules/lilv.posix64.a | |||||
| LIBS_win32 = ../modules/lilv.win32.a | |||||
| LIBS_win64 = ../modules/lilv.win64.a | |||||
| LINK_FLAGS += $(LILV_LIBS) | |||||
| ifeq ($(HAVE_JUCE),true) | |||||
| LIBS += ../modules/juce_core.a | |||||
| LIBS_posix32 += ../modules/juce_core.posix32.a | |||||
| LIBS_posix64 += ../modules/juce_core.posix64.a | |||||
| LIBS_win32 += ../modules/juce_core.win32.a | |||||
| LIBS_win64 += ../modules/juce_core.win64.a | |||||
| LIBS += ../modules/juce_audio_basics.a | |||||
| LIBS_posix32 += ../modules/juce_audio_basics.posix32.a | |||||
| LIBS_posix64 += ../modules/juce_audio_basics.posix64.a | |||||
| LIBS_win32 += ../modules/juce_audio_basics.win32.a | |||||
| LIBS_win64 += ../modules/juce_audio_basics.win64.a | |||||
| # LIBS += ../modules/juce_audio_processors.a | |||||
| # LIBS_posix32 += ../modules/juce_audio_processors.posix32.a | |||||
| # LIBS_posix64 += ../modules/juce_audio_processors.posix64.a | |||||
| # LIBS_win32 += ../modules/juce_audio_processors.win32.a | |||||
| # LIBS_win64 += ../modules/juce_audio_processors.win64.a | |||||
| endif | endif | ||||
| ifeq ($(HAVE_CSOUND),true) | |||||
| # LIBS = ../modules/juce_core.a | |||||
| ifeq ($(CARLA_PLUGIN_SUPPORT),true) | |||||
| LIBS += ../modules/lilv.a | |||||
| LIBS_posix32 += ../modules/lilv.posix32.a | |||||
| LIBS_posix64 += ../modules/lilv.posix64.a | |||||
| LIBS_win32 += ../modules/lilv.win32.a | |||||
| LIBS_win64 += ../modules/lilv.win64.a | |||||
| LINK_FLAGS += $(LILV_LIBS) | |||||
| endif | endif | ||||
| POSIX_BUILD_FLAGS = $(BUILD_CXX_FLAGS) | POSIX_BUILD_FLAGS = $(BUILD_CXX_FLAGS) | ||||
| @@ -20,6 +20,16 @@ | |||||
| #include "CarlaString.hpp" | #include "CarlaString.hpp" | ||||
| #include "CarlaMIDI.h" | #include "CarlaMIDI.h" | ||||
| #ifdef HAVE_JUCE | |||||
| # define JUCE_PLUGIN_HOST_NO_UI | |||||
| # undef WANT_VST | |||||
| # undef WANT_AU | |||||
| # include "juce_core.h" | |||||
| # include "juce_audio_processors.h" | |||||
| #else | |||||
| # undef WANT_CSOUND | |||||
| #endif | |||||
| #ifdef WANT_LADSPA | #ifdef WANT_LADSPA | ||||
| # include "CarlaLadspaUtils.hpp" | # include "CarlaLadspaUtils.hpp" | ||||
| #endif | #endif | ||||
| @@ -27,26 +37,26 @@ | |||||
| # include "CarlaDssiUtils.hpp" | # include "CarlaDssiUtils.hpp" | ||||
| #endif | #endif | ||||
| #ifdef WANT_LV2 | #ifdef WANT_LV2 | ||||
| # include <QtCore/QUrl> | |||||
| # include "CarlaLv2Utils.hpp" | # include "CarlaLv2Utils.hpp" | ||||
| #endif | #endif | ||||
| #ifdef WANT_VST | #ifdef WANT_VST | ||||
| # include "CarlaVstUtils.hpp" | # include "CarlaVstUtils.hpp" | ||||
| #endif | #endif | ||||
| #ifdef WANT_CSOUND | #ifdef WANT_CSOUND | ||||
| # include "juce_core.h" | |||||
| # include <csound/csound.hpp> | # include <csound/csound.hpp> | ||||
| #endif | #endif | ||||
| #ifdef WANT_FLUIDSYNTH | #ifdef WANT_FLUIDSYNTH | ||||
| # include <fluidsynth.h> | # include <fluidsynth.h> | ||||
| #endif | #endif | ||||
| #ifdef WANT_LINUXSAMPLER | #ifdef WANT_LINUXSAMPLER | ||||
| # include <QtCore/QFileInfo> | |||||
| # include "linuxsampler/EngineFactory.h" | # include "linuxsampler/EngineFactory.h" | ||||
| #endif | #endif | ||||
| #include <iostream> | #include <iostream> | ||||
| # include <QtCore/QDir> | |||||
| #include <QtCore/QDir> | |||||
| #include <QtCore/QFileInfo> | |||||
| #include <QtCore/QUrl> | |||||
| #define DISCOVERY_OUT(x, y) std::cout << "\ncarla-discovery::" << x << "::" << y << std::endl; | #define DISCOVERY_OUT(x, y) std::cout << "\ncarla-discovery::" << x << "::" << y << std::endl; | ||||
| @@ -263,6 +273,23 @@ intptr_t VSTCALLBACK vstHostCallback(AEffect* const effect, const int32_t opcode | |||||
| } | } | ||||
| #endif | #endif | ||||
| #ifdef WANT_CSOUND | |||||
| // -------------------------------------------------------------------------- | |||||
| // Csound stuff | |||||
| static int csound_midiInOpen(CSOUND*, void**, const char*) { return 0; } | |||||
| static int csound_midiRead(CSOUND*, void*, unsigned char*, int) { return 0; } | |||||
| static int csound_midiInClose(CSOUND*, void*) { return 0; } | |||||
| static int csound_midiOutOpen(CSOUND*, void**, const char*) { return 0; } | |||||
| static int csound_midiWrite(CSOUND*, void*, const unsigned char*, int) { return 0; } | |||||
| static int csound_midiOutClose(CSOUND*, void*) { return 0; } | |||||
| # ifndef DEBUG | |||||
| static void csound_silence(CSOUND*, int, const char*, va_list) {} | |||||
| # endif | |||||
| #endif | |||||
| #ifdef WANT_LINUXSAMPLER | #ifdef WANT_LINUXSAMPLER | ||||
| // -------------------------------------------------------------------------- | // -------------------------------------------------------------------------- | ||||
| // LinuxSampler stuff | // LinuxSampler stuff | ||||
| @@ -1386,27 +1413,113 @@ void do_vst_check(void*& libHandle, const bool init) | |||||
| #endif | #endif | ||||
| } | } | ||||
| #ifdef WANT_CSOUND | |||||
| static int csound_midiInOpen(CSOUND*, void**, const char*) { return 0; } | |||||
| static int csound_midiRead(CSOUND*, void*, unsigned char*, int) { return 0; } | |||||
| static int csound_midiInClose(CSOUND*, void*) { return 0; } | |||||
| void do_au_check(void*& libHandle, const bool init) | |||||
| { | |||||
| #if 0 //def WANT_AU | |||||
| #else | |||||
| DISCOVERY_OUT("error", "AU support not available"); | |||||
| return; | |||||
| static int csound_midiOutOpen(CSOUND*, void**, const char*) { return 0; } | |||||
| static int csound_midiWrite(CSOUND*, void*, const unsigned char*, int) { return 0; } | |||||
| static int csound_midiOutClose(CSOUND*, void*) { return 0; } | |||||
| // unused | |||||
| (void)libHandle; | |||||
| (void)init; | |||||
| #endif | |||||
| }; | |||||
| #if 1//ndef DEBUG | |||||
| static void csound_silence(CSOUND*, int, const char*, va_list) {} | |||||
| #ifdef HAVE_JUCE | |||||
| void do_juce_check(const char* const filename, const char* const stype, const bool init) | |||||
| { | |||||
| using namespace juce; | |||||
| ScopedPointer<AudioPluginFormat> pluginFormat; | |||||
| if (stype == nullptr) | |||||
| return; | |||||
| #if JUCE_PLUGINHOST_AU && JUCE_MAC | |||||
| else if (std::strcmp(stype, "au") == 0) | |||||
| pluginFormat = new AudioUnitPluginFormat(); | |||||
| #endif | |||||
| #if JUCE_PLUGINHOST_LADSPA && JUCE_LINUX | |||||
| else if (std::strcmp(stype, "ladspa") == 0) | |||||
| pluginFormat = new LADSPAPluginFormat(); | |||||
| #endif | #endif | ||||
| #if JUCE_PLUGINHOST_VST | |||||
| else if (std::strcmp(stype, "vst") == 0) | |||||
| pluginFormat = new VSTPluginFormat(); | |||||
| #endif | |||||
| if (pluginFormat == nullptr) | |||||
| { | |||||
| DISCOVERY_OUT("error", stype << " support not available"); | |||||
| return; | |||||
| } | |||||
| OwnedArray<PluginDescription> results; | |||||
| pluginFormat->findAllTypesForFile(results, filename); | |||||
| for (auto it = results.begin(), end = results.end(); it != end; ++it) | |||||
| { | |||||
| static int iv=0; | |||||
| carla_stderr2("LOOKING FOR PLUGIN %i", iv++); | |||||
| PluginDescription* desc(*it); | |||||
| int hints = 0x0; | |||||
| int audioIns = desc->numInputChannels; | |||||
| int audioOuts = desc->numOutputChannels; | |||||
| int midiIns = 0; | |||||
| int midiOuts = 0; | |||||
| int parameters = 0; | |||||
| int programs = 0; | |||||
| if (desc->isInstrument) | |||||
| hints |= PLUGIN_IS_SYNTH; | |||||
| // if (init) | |||||
| // { | |||||
| // if (AudioPluginInstance* const instance = pluginFormat->createInstanceFromDescription(*desc, kSampleRate, kBufferSize)) | |||||
| // { | |||||
| // instance->refreshParameterList(); | |||||
| // | |||||
| // parameters = instance->getNumParameters(); | |||||
| // programs = instance->getNumPrograms(); | |||||
| // | |||||
| // if (instance->hasEditor()) | |||||
| // hints |= PLUGIN_HAS_CUSTOM_UI; | |||||
| // if (instance->acceptsMidi()) | |||||
| // midiIns = 1; | |||||
| // if (instance->producesMidi()) | |||||
| // midiOuts = 1; | |||||
| // | |||||
| // delete instance; | |||||
| // } | |||||
| // } | |||||
| DISCOVERY_OUT("init", "-----------"); | |||||
| DISCOVERY_OUT("name", desc->name); | |||||
| DISCOVERY_OUT("label", desc->descriptiveName); | |||||
| DISCOVERY_OUT("maker", desc->manufacturerName); | |||||
| DISCOVERY_OUT("copyright", desc->manufacturerName); | |||||
| DISCOVERY_OUT("uniqueId", desc->uid); | |||||
| DISCOVERY_OUT("hints", hints); | |||||
| DISCOVERY_OUT("audio.ins", audioIns); | |||||
| DISCOVERY_OUT("audio.outs", audioOuts); | |||||
| DISCOVERY_OUT("midi.ins", midiIns); | |||||
| DISCOVERY_OUT("midi.outs", midiOuts); | |||||
| DISCOVERY_OUT("parameters.ins", parameters); | |||||
| DISCOVERY_OUT("programs", programs); | |||||
| DISCOVERY_OUT("build", BINARY_NATIVE); | |||||
| DISCOVERY_OUT("end", "------------"); | |||||
| } | |||||
| } | |||||
| #endif | #endif | ||||
| void do_csound_check(const char* const filename, const bool init) | void do_csound_check(const char* const filename, const bool init) | ||||
| { | { | ||||
| #ifdef WANT_CSOUND | #ifdef WANT_CSOUND | ||||
| Csound csound; | Csound csound; | ||||
| #if 1//ndef DEBUG | |||||
| # ifndef DEBUG | |||||
| csound.SetMessageCallback(csound_silence); | csound.SetMessageCallback(csound_silence); | ||||
| #endif | |||||
| # endif | |||||
| csound.SetHostImplementedAudioIO(true, kBufferSize); | csound.SetHostImplementedAudioIO(true, kBufferSize); | ||||
| csound.SetHostImplementedMIDIIO(true); | csound.SetHostImplementedMIDIIO(true); | ||||
| csound.Reset(); | csound.Reset(); | ||||
| @@ -1672,8 +1785,10 @@ int main(int argc, char* argv[]) | |||||
| { | { | ||||
| case PLUGIN_LADSPA: | case PLUGIN_LADSPA: | ||||
| case PLUGIN_DSSI: | case PLUGIN_DSSI: | ||||
| #ifndef HAVE_JUCE | |||||
| case PLUGIN_VST: | case PLUGIN_VST: | ||||
| case PLUGIN_AU: | case PLUGIN_AU: | ||||
| #endif | |||||
| openLib = true; | openLib = true; | ||||
| default: | default: | ||||
| break; | break; | ||||
| @@ -1737,10 +1852,18 @@ int main(int argc, char* argv[]) | |||||
| do_lv2_check(filename, doInit); | do_lv2_check(filename, doInit); | ||||
| break; | break; | ||||
| case PLUGIN_VST: | case PLUGIN_VST: | ||||
| #ifdef HAVE_JUCE | |||||
| do_juce_check(filename, "vst", doInit); | |||||
| #else | |||||
| do_vst_check(handle, doInit); | do_vst_check(handle, doInit); | ||||
| #endif | |||||
| break; | break; | ||||
| case PLUGIN_AU: | case PLUGIN_AU: | ||||
| //do_au_check(handle, doInit); | |||||
| #ifdef HAVE_JUCE | |||||
| do_juce_check(filename, "au", doInit); | |||||
| #else | |||||
| do_au_check(handle, doInit); | |||||
| #endif | |||||
| break; | break; | ||||
| case PLUGIN_CSOUND: | case PLUGIN_CSOUND: | ||||
| do_csound_check(filename, doInit); | do_csound_check(filename, doInit); | ||||
| @@ -1763,3 +1886,36 @@ int main(int argc, char* argv[]) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| #ifdef HAVE_JUCE | |||||
| // -------------------------------------------------------------------------- | |||||
| // we want juce processors but without UI code | |||||
| // this is copied from juce_audio_processors.cpp | |||||
| #include "juce_core/native/juce_BasicNativeHeaders.h" | |||||
| namespace juce | |||||
| { | |||||
| static inline | |||||
| bool arrayContainsPlugin(const OwnedArray<PluginDescription>& list, const PluginDescription& desc) | |||||
| { | |||||
| for (int i = list.size(); --i >= 0;) | |||||
| { | |||||
| if (list.getUnchecked(i)->isDuplicateOf(desc)) | |||||
| return true; | |||||
| } | |||||
| return false; | |||||
| } | |||||
| #include "juce_audio_processors/format/juce_AudioPluginFormat.cpp" | |||||
| #include "juce_audio_processors/processors/juce_AudioProcessor.cpp" | |||||
| #include "juce_audio_processors/processors/juce_PluginDescription.cpp" | |||||
| #include "juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" | |||||
| #include "juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp" | |||||
| #include "juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" | |||||
| } | |||||
| #endif | |||||
| // -------------------------------------------------------------------------- | |||||
| @@ -19,13 +19,13 @@ | |||||
| @see VSTPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_AU | @see VSTPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_AU | ||||
| */ | */ | ||||
| #define JUCE_PLUGINHOST_VST 0 | |||||
| #define JUCE_PLUGINHOST_VST 1 | |||||
| /** Config: JUCE_PLUGINHOST_AU | /** Config: JUCE_PLUGINHOST_AU | ||||
| Enables the AudioUnit plugin hosting classes. This is Mac-only, of course. | Enables the AudioUnit plugin hosting classes. This is Mac-only, of course. | ||||
| @see AudioUnitPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST | @see AudioUnitPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST | ||||
| */ | */ | ||||
| #define JUCE_PLUGINHOST_AU 0 | |||||
| #define JUCE_PLUGINHOST_AU 1 | |||||
| #endif // CARLA_JUCE_AUDIO_PROCESSORS_APPCONFIG_H_INCLUDED | #endif // CARLA_JUCE_AUDIO_PROCESSORS_APPCONFIG_H_INCLUDED | ||||
| @@ -191,7 +191,11 @@ class IdleCallRecursionPreventer | |||||
| { | { | ||||
| public: | public: | ||||
| IdleCallRecursionPreventer() | IdleCallRecursionPreventer() | ||||
| #ifndef JUCE_PLUGIN_HOST_NO_UI | |||||
| : isMessageThread (MessageManager::getInstance()->isThisTheMessageThread()) | : isMessageThread (MessageManager::getInstance()->isThisTheMessageThread()) | ||||
| #else | |||||
| : isMessageThread (false) | |||||
| #endif | |||||
| { | { | ||||
| if (isMessageThread) | if (isMessageThread) | ||||
| ++insideVSTCallback; | ++insideVSTCallback; | ||||
| @@ -237,7 +241,7 @@ static void* NewCFMFromMachO (void* const machofp) noexcept | |||||
| #endif | #endif | ||||
| //============================================================================== | //============================================================================== | ||||
| #if JUCE_LINUX | |||||
| #if JUCE_LINUX && ! defined(JUCE_PLUGIN_HOST_NO_UI) | |||||
| extern Display* display; | extern Display* display; | ||||
| extern XContext windowHandleXContext; | extern XContext windowHandleXContext; | ||||
| @@ -710,9 +714,13 @@ static const int defaultVSTBlockSizeValue = 512; | |||||
| //============================================================================== | //============================================================================== | ||||
| //============================================================================== | //============================================================================== | ||||
| #ifndef JUCE_PLUGIN_HOST_NO_UI | |||||
| class VSTPluginInstance : public AudioPluginInstance, | class VSTPluginInstance : public AudioPluginInstance, | ||||
| private Timer, | private Timer, | ||||
| private AsyncUpdater | private AsyncUpdater | ||||
| #else | |||||
| class VSTPluginInstance : public AudioPluginInstance | |||||
| #endif | |||||
| { | { | ||||
| public: | public: | ||||
| VSTPluginInstance (const ModuleHandle::Ptr& module_) | VSTPluginInstance (const ModuleHandle::Ptr& module_) | ||||
| @@ -782,8 +790,10 @@ public: | |||||
| UseResFile (module->resFileId); | UseResFile (module->resFileId); | ||||
| #endif | #endif | ||||
| #ifndef JUCE_PLUGIN_HOST_NO_UI | |||||
| // Must delete any editors before deleting the plugin instance! | // Must delete any editors before deleting the plugin instance! | ||||
| jassert (getActiveEditor() == 0); | jassert (getActiveEditor() == 0); | ||||
| #endif | |||||
| _fpreset(); // some dodgy plugs fuck around with this | _fpreset(); // some dodgy plugs fuck around with this | ||||
| @@ -1088,7 +1098,9 @@ public: | |||||
| //============================================================================== | //============================================================================== | ||||
| bool hasEditor() const override { return effect != nullptr && (effect->flags & effFlagsHasEditor) != 0; } | bool hasEditor() const override { return effect != nullptr && (effect->flags & effFlagsHasEditor) != 0; } | ||||
| #ifndef JUCE_PLUGIN_HOST_NO_UI | |||||
| AudioProcessorEditor* createEditor() override; | AudioProcessorEditor* createEditor() override; | ||||
| #endif | |||||
| //============================================================================== | //============================================================================== | ||||
| const String getInputChannelName (int index) const override | const String getInputChannelName (int index) const override | ||||
| @@ -1237,6 +1249,7 @@ public: | |||||
| void setCurrentProgramStateInformation (const void* data, int size) override { loadFromFXBFile (data, size); } | void setCurrentProgramStateInformation (const void* data, int size) override { loadFromFXBFile (data, size); } | ||||
| //============================================================================== | //============================================================================== | ||||
| #ifndef JUCE_PLUGIN_HOST_NO_UI | |||||
| void timerCallback() override | void timerCallback() override | ||||
| { | { | ||||
| if (dispatch (effIdle, 0, 0, 0, 0) == 0) | if (dispatch (effIdle, 0, 0, 0, 0) == 0) | ||||
| @@ -1248,6 +1261,7 @@ public: | |||||
| // indicates that something about the plugin has changed.. | // indicates that something about the plugin has changed.. | ||||
| updateHostDisplay(); | updateHostDisplay(); | ||||
| } | } | ||||
| #endif | |||||
| VstIntPtr handleCallback (VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt) | VstIntPtr handleCallback (VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt) | ||||
| { | { | ||||
| @@ -1265,6 +1279,7 @@ public: | |||||
| #pragma warning (pop) | #pragma warning (pop) | ||||
| #endif | #endif | ||||
| #ifndef JUCE_PLUGIN_HOST_NO_UI | |||||
| case audioMasterIdle: | case audioMasterIdle: | ||||
| if (insideVSTCallback == 0 && MessageManager::getInstance()->isThisTheMessageThread()) | if (insideVSTCallback == 0 && MessageManager::getInstance()->isThisTheMessageThread()) | ||||
| { | { | ||||
| @@ -1293,6 +1308,7 @@ public: | |||||
| case audioMasterUpdateDisplay: triggerAsyncUpdate(); break; | case audioMasterUpdateDisplay: triggerAsyncUpdate(); break; | ||||
| case audioMasterIOChanged: setLatencySamples (effect->initialDelay); break; | case audioMasterIOChanged: setLatencySamples (effect->initialDelay); break; | ||||
| case audioMasterNeedIdle: startTimer (50); break; | case audioMasterNeedIdle: startTimer (50); break; | ||||
| #endif | |||||
| case audioMasterGetSampleRate: return (VstIntPtr) (getSampleRate() > 0 ? getSampleRate() : defaultVSTSampleRateValue); | case audioMasterGetSampleRate: return (VstIntPtr) (getSampleRate() > 0 ? getSampleRate() : defaultVSTSampleRateValue); | ||||
| case audioMasterGetBlockSize: return (VstIntPtr) (getBlockSize() > 0 ? getBlockSize() : defaultVSTBlockSizeValue); | case audioMasterGetBlockSize: return (VstIntPtr) (getBlockSize() > 0 ? getBlockSize() : defaultVSTBlockSizeValue); | ||||
| @@ -1378,10 +1394,12 @@ public: | |||||
| case audioMasterGetVendorString: | case audioMasterGetVendorString: | ||||
| case audioMasterGetProductString: | case audioMasterGetProductString: | ||||
| { | { | ||||
| String hostName ("Juce VST Host"); | |||||
| String hostName ("Carla"); | |||||
| #ifndef JUCE_PLUGIN_HOST_NO_UI | |||||
| if (JUCEApplicationBase* app = JUCEApplicationBase::getInstance()) | if (JUCEApplicationBase* app = JUCEApplicationBase::getInstance()) | ||||
| hostName = app->getApplicationName(); | hostName = app->getApplicationName(); | ||||
| #endif | |||||
| hostName.copyToUTF8 ((char*) ptr, (size_t) jmin (kVstMaxVendorStrLen, kVstMaxProductStrLen) - 1); | hostName.copyToUTF8 ((char*) ptr, (size_t) jmin (kVstMaxVendorStrLen, kVstMaxProductStrLen) - 1); | ||||
| break; | break; | ||||
| @@ -1882,6 +1900,7 @@ private: | |||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginInstance) | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginInstance) | ||||
| }; | }; | ||||
| #ifndef JUCE_PLUGIN_HOST_NO_UI | |||||
| //============================================================================== | //============================================================================== | ||||
| static Array <VSTPluginWindow*> activeVSTWindows; | static Array <VSTPluginWindow*> activeVSTWindows; | ||||
| @@ -2588,13 +2607,16 @@ private: | |||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginWindow) | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginWindow) | ||||
| }; | }; | ||||
| #endif | |||||
| #ifndef JUCE_PLUGIN_HOST_NO_UI | |||||
| //============================================================================== | //============================================================================== | ||||
| AudioProcessorEditor* VSTPluginInstance::createEditor() | AudioProcessorEditor* VSTPluginInstance::createEditor() | ||||
| { | { | ||||
| return hasEditor() ? new VSTPluginWindow (*this) | return hasEditor() ? new VSTPluginWindow (*this) | ||||
| : nullptr; | : nullptr; | ||||
| } | } | ||||
| #endif | |||||
| //============================================================================== | //============================================================================== | ||||
| // entry point for all callbacks from the plugin | // entry point for all callbacks from the plugin | ||||
| @@ -37,7 +37,7 @@ | |||||
| #include "../juce_core/native/juce_BasicNativeHeaders.h" | #include "../juce_core/native/juce_BasicNativeHeaders.h" | ||||
| #include "juce_audio_processors.h" | #include "juce_audio_processors.h" | ||||
| #include "../juce_gui_extra/juce_gui_extra.h" | |||||
| //#include "../juce_gui_extra/juce_gui_extra.h" | |||||
| //============================================================================== | //============================================================================== | ||||
| #if JUCE_MAC | #if JUCE_MAC | ||||
| @@ -44,9 +44,11 @@ AudioProcessor::AudioProcessor() | |||||
| AudioProcessor::~AudioProcessor() | AudioProcessor::~AudioProcessor() | ||||
| { | { | ||||
| #ifndef JUCE_PLUGIN_HOST_NO_UI | |||||
| // ooh, nasty - the editor should have been deleted before the filter | // ooh, nasty - the editor should have been deleted before the filter | ||||
| // that it refers to is deleted.. | // that it refers to is deleted.. | ||||
| jassert (activeEditor == nullptr); | jassert (activeEditor == nullptr); | ||||
| #endif | |||||
| #if JUCE_DEBUG | #if JUCE_DEBUG | ||||
| // This will fail if you've called beginParameterChangeGesture() for one | // This will fail if you've called beginParameterChangeGesture() for one | ||||
| @@ -214,6 +216,7 @@ void AudioProcessor::suspendProcessing (const bool shouldBeSuspended) | |||||
| void AudioProcessor::reset() {} | void AudioProcessor::reset() {} | ||||
| void AudioProcessor::processBlockBypassed (AudioSampleBuffer&, MidiBuffer&) {} | void AudioProcessor::processBlockBypassed (AudioSampleBuffer&, MidiBuffer&) {} | ||||
| #ifndef JUCE_PLUGIN_HOST_NO_UI | |||||
| //============================================================================== | //============================================================================== | ||||
| void AudioProcessor::editorBeingDeleted (AudioProcessorEditor* const editor) noexcept | void AudioProcessor::editorBeingDeleted (AudioProcessorEditor* const editor) noexcept | ||||
| { | { | ||||
| @@ -244,6 +247,7 @@ AudioProcessorEditor* AudioProcessor::createEditorIfNeeded() | |||||
| return ed; | return ed; | ||||
| } | } | ||||
| #endif | |||||
| //============================================================================== | //============================================================================== | ||||
| void AudioProcessor::getCurrentProgramStateInformation (juce::MemoryBlock& destData) | void AudioProcessor::getCurrentProgramStateInformation (juce::MemoryBlock& destData) | ||||
| @@ -331,6 +331,7 @@ public: | |||||
| */ | */ | ||||
| void setNonRealtime (bool isNonRealtime) noexcept; | void setNonRealtime (bool isNonRealtime) noexcept; | ||||
| #ifndef JUCE_PLUGIN_HOST_NO_UI | |||||
| //============================================================================== | //============================================================================== | ||||
| /** Creates the filter's UI. | /** Creates the filter's UI. | ||||
| @@ -360,12 +361,14 @@ public: | |||||
| @see hasEditor | @see hasEditor | ||||
| */ | */ | ||||
| virtual AudioProcessorEditor* createEditor() = 0; | virtual AudioProcessorEditor* createEditor() = 0; | ||||
| #endif | |||||
| /** Your filter must override this and return true if it can create an editor component. | /** Your filter must override this and return true if it can create an editor component. | ||||
| @see createEditor | @see createEditor | ||||
| */ | */ | ||||
| virtual bool hasEditor() const = 0; | virtual bool hasEditor() const = 0; | ||||
| #ifndef JUCE_PLUGIN_HOST_NO_UI | |||||
| //============================================================================== | //============================================================================== | ||||
| /** Returns the active editor, if there is one. | /** Returns the active editor, if there is one. | ||||
| Bear in mind this can return nullptr, even if an editor has previously been opened. | Bear in mind this can return nullptr, even if an editor has previously been opened. | ||||
| @@ -376,6 +379,7 @@ public: | |||||
| This may call createEditor() internally to create the component. | This may call createEditor() internally to create the component. | ||||
| */ | */ | ||||
| AudioProcessorEditor* createEditorIfNeeded(); | AudioProcessorEditor* createEditorIfNeeded(); | ||||
| #endif | |||||
| //============================================================================== | //============================================================================== | ||||
| /** This must return the correct value immediately after the object has been | /** This must return the correct value immediately after the object has been | ||||
| @@ -582,7 +586,7 @@ public: | |||||
| //============================================================================== | //============================================================================== | ||||
| /** LV2 specific calls, saving/restore as string. */ | /** LV2 specific calls, saving/restore as string. */ | ||||
| virtual String getStateInformationString () { return String::empty; } | virtual String getStateInformationString () { return String::empty; } | ||||
| virtual void setStateInformationString (const String& data) {} | |||||
| virtual void setStateInformationString (const String&) {} | |||||
| //============================================================================== | //============================================================================== | ||||
| /** Adds a listener that will be called when an aspect of this processor changes. */ | /** Adds a listener that will be called when an aspect of this processor changes. */ | ||||
| @@ -602,9 +606,11 @@ public: | |||||
| /** This is called by the processor to specify its details before being played. */ | /** This is called by the processor to specify its details before being played. */ | ||||
| void setPlayConfigDetails (int numIns, int numOuts, double sampleRate, int blockSize) noexcept; | void setPlayConfigDetails (int numIns, int numOuts, double sampleRate, int blockSize) noexcept; | ||||
| #ifndef JUCE_PLUGIN_HOST_NO_UI | |||||
| //============================================================================== | //============================================================================== | ||||
| /** Not for public use - this is called before deleting an editor component. */ | /** Not for public use - this is called before deleting an editor component. */ | ||||
| void editorBeingDeleted (AudioProcessorEditor*) noexcept; | void editorBeingDeleted (AudioProcessorEditor*) noexcept; | ||||
| #endif | |||||
| /** Not for public use - this is called to initialise the processor before playing. */ | /** Not for public use - this is called to initialise the processor before playing. */ | ||||
| void setSpeakerArrangement (const String& inputs, const String& outputs); | void setSpeakerArrangement (const String& inputs, const String& outputs); | ||||
| @@ -656,7 +662,9 @@ protected: | |||||
| private: | private: | ||||
| Array<AudioProcessorListener*> listeners; | Array<AudioProcessorListener*> listeners; | ||||
| #ifndef JUCE_PLUGIN_HOST_NO_UI | |||||
| Component::SafePointer<AudioProcessorEditor> activeEditor; | Component::SafePointer<AudioProcessorEditor> activeEditor; | ||||
| #endif | |||||
| double sampleRate; | double sampleRate; | ||||
| int blockSize, numInputChannels, numOutputChannels, latencySamples; | int blockSize, numInputChannels, numOutputChannels, latencySamples; | ||||
| bool suspended, nonRealtime; | bool suspended, nonRealtime; | ||||
| @@ -23,6 +23,13 @@ | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // Include fixes | // Include fixes | ||||
| // Define __cdecl if needed | |||||
| #ifndef CARLA_OS_WIN | |||||
| # ifndef __cdecl | |||||
| # define __cdecl | |||||
| # endif | |||||
| #endif | |||||
| // Disable deprecated VST features (NOT) | // Disable deprecated VST features (NOT) | ||||
| #define VST_2_4_EXTENSIONS 1 | #define VST_2_4_EXTENSIONS 1 | ||||
| #define VST_FORCE_DEPRECATED 0 | #define VST_FORCE_DEPRECATED 0 | ||||
| @@ -106,7 +113,7 @@ | |||||
| #define kVstTransportChanged 1 | #define kVstTransportChanged 1 | ||||
| #define kVstVersion 2400 | #define kVstVersion 2400 | ||||
| #define DECLARE_VST_DEPRECATED(idx) idx | #define DECLARE_VST_DEPRECATED(idx) idx | ||||
| #define VSTCALLBACK | |||||
| #define VSTCALLBACK __cdecl | |||||
| struct ERect { | struct ERect { | ||||
| int16_t top, left, bottom, right; | int16_t top, left, bottom, right; | ||||
| }; | }; | ||||