@@ -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) | |||
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 | |||
ifeq ($(CARLA_PLUGIN_SUPPORT),true) | |||
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 | |||
endif | |||
endif | |||
# -------------------------------------------------------------- | |||
ifeq ($(HAVE_CSOUND),true) | |||
# ifeq ($(HAVE_CSOUND),true) | |||
# 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 | |||
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 | |||
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 | |||
POSIX_BUILD_FLAGS = $(BUILD_CXX_FLAGS) | |||
@@ -20,6 +20,16 @@ | |||
#include "CarlaString.hpp" | |||
#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 | |||
# include "CarlaLadspaUtils.hpp" | |||
#endif | |||
@@ -27,26 +37,26 @@ | |||
# include "CarlaDssiUtils.hpp" | |||
#endif | |||
#ifdef WANT_LV2 | |||
# include <QtCore/QUrl> | |||
# include "CarlaLv2Utils.hpp" | |||
#endif | |||
#ifdef WANT_VST | |||
# include "CarlaVstUtils.hpp" | |||
#endif | |||
#ifdef WANT_CSOUND | |||
# include "juce_core.h" | |||
# include <csound/csound.hpp> | |||
#endif | |||
#ifdef WANT_FLUIDSYNTH | |||
# include <fluidsynth.h> | |||
#endif | |||
#ifdef WANT_LINUXSAMPLER | |||
# include <QtCore/QFileInfo> | |||
# include "linuxsampler/EngineFactory.h" | |||
#endif | |||
#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; | |||
@@ -263,6 +273,23 @@ intptr_t VSTCALLBACK vstHostCallback(AEffect* const effect, const int32_t opcode | |||
} | |||
#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 | |||
// -------------------------------------------------------------------------- | |||
// LinuxSampler stuff | |||
@@ -1386,27 +1413,113 @@ void do_vst_check(void*& libHandle, const bool init) | |||
#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 | |||
#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 | |||
void do_csound_check(const char* const filename, const bool init) | |||
{ | |||
#ifdef WANT_CSOUND | |||
Csound csound; | |||
#if 1//ndef DEBUG | |||
# ifndef DEBUG | |||
csound.SetMessageCallback(csound_silence); | |||
#endif | |||
# endif | |||
csound.SetHostImplementedAudioIO(true, kBufferSize); | |||
csound.SetHostImplementedMIDIIO(true); | |||
csound.Reset(); | |||
@@ -1672,8 +1785,10 @@ int main(int argc, char* argv[]) | |||
{ | |||
case PLUGIN_LADSPA: | |||
case PLUGIN_DSSI: | |||
#ifndef HAVE_JUCE | |||
case PLUGIN_VST: | |||
case PLUGIN_AU: | |||
#endif | |||
openLib = true; | |||
default: | |||
break; | |||
@@ -1737,10 +1852,18 @@ int main(int argc, char* argv[]) | |||
do_lv2_check(filename, doInit); | |||
break; | |||
case PLUGIN_VST: | |||
#ifdef HAVE_JUCE | |||
do_juce_check(filename, "vst", doInit); | |||
#else | |||
do_vst_check(handle, doInit); | |||
#endif | |||
break; | |||
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; | |||
case PLUGIN_CSOUND: | |||
do_csound_check(filename, doInit); | |||
@@ -1763,3 +1886,36 @@ int main(int argc, char* argv[]) | |||
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 | |||
*/ | |||
#define JUCE_PLUGINHOST_VST 0 | |||
#define JUCE_PLUGINHOST_VST 1 | |||
/** Config: JUCE_PLUGINHOST_AU | |||
Enables the AudioUnit plugin hosting classes. This is Mac-only, of course. | |||
@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 |
@@ -191,7 +191,11 @@ class IdleCallRecursionPreventer | |||
{ | |||
public: | |||
IdleCallRecursionPreventer() | |||
#ifndef JUCE_PLUGIN_HOST_NO_UI | |||
: isMessageThread (MessageManager::getInstance()->isThisTheMessageThread()) | |||
#else | |||
: isMessageThread (false) | |||
#endif | |||
{ | |||
if (isMessageThread) | |||
++insideVSTCallback; | |||
@@ -237,7 +241,7 @@ static void* NewCFMFromMachO (void* const machofp) noexcept | |||
#endif | |||
//============================================================================== | |||
#if JUCE_LINUX | |||
#if JUCE_LINUX && ! defined(JUCE_PLUGIN_HOST_NO_UI) | |||
extern Display* display; | |||
extern XContext windowHandleXContext; | |||
@@ -710,9 +714,13 @@ static const int defaultVSTBlockSizeValue = 512; | |||
//============================================================================== | |||
//============================================================================== | |||
#ifndef JUCE_PLUGIN_HOST_NO_UI | |||
class VSTPluginInstance : public AudioPluginInstance, | |||
private Timer, | |||
private AsyncUpdater | |||
#else | |||
class VSTPluginInstance : public AudioPluginInstance | |||
#endif | |||
{ | |||
public: | |||
VSTPluginInstance (const ModuleHandle::Ptr& module_) | |||
@@ -782,8 +790,10 @@ public: | |||
UseResFile (module->resFileId); | |||
#endif | |||
#ifndef JUCE_PLUGIN_HOST_NO_UI | |||
// Must delete any editors before deleting the plugin instance! | |||
jassert (getActiveEditor() == 0); | |||
#endif | |||
_fpreset(); // some dodgy plugs fuck around with this | |||
@@ -1088,7 +1098,9 @@ public: | |||
//============================================================================== | |||
bool hasEditor() const override { return effect != nullptr && (effect->flags & effFlagsHasEditor) != 0; } | |||
#ifndef JUCE_PLUGIN_HOST_NO_UI | |||
AudioProcessorEditor* createEditor() override; | |||
#endif | |||
//============================================================================== | |||
const String getInputChannelName (int index) const override | |||
@@ -1237,6 +1249,7 @@ public: | |||
void setCurrentProgramStateInformation (const void* data, int size) override { loadFromFXBFile (data, size); } | |||
//============================================================================== | |||
#ifndef JUCE_PLUGIN_HOST_NO_UI | |||
void timerCallback() override | |||
{ | |||
if (dispatch (effIdle, 0, 0, 0, 0) == 0) | |||
@@ -1248,6 +1261,7 @@ public: | |||
// indicates that something about the plugin has changed.. | |||
updateHostDisplay(); | |||
} | |||
#endif | |||
VstIntPtr handleCallback (VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt) | |||
{ | |||
@@ -1265,6 +1279,7 @@ public: | |||
#pragma warning (pop) | |||
#endif | |||
#ifndef JUCE_PLUGIN_HOST_NO_UI | |||
case audioMasterIdle: | |||
if (insideVSTCallback == 0 && MessageManager::getInstance()->isThisTheMessageThread()) | |||
{ | |||
@@ -1293,6 +1308,7 @@ public: | |||
case audioMasterUpdateDisplay: triggerAsyncUpdate(); break; | |||
case audioMasterIOChanged: setLatencySamples (effect->initialDelay); break; | |||
case audioMasterNeedIdle: startTimer (50); break; | |||
#endif | |||
case audioMasterGetSampleRate: return (VstIntPtr) (getSampleRate() > 0 ? getSampleRate() : defaultVSTSampleRateValue); | |||
case audioMasterGetBlockSize: return (VstIntPtr) (getBlockSize() > 0 ? getBlockSize() : defaultVSTBlockSizeValue); | |||
@@ -1378,10 +1394,12 @@ public: | |||
case audioMasterGetVendorString: | |||
case audioMasterGetProductString: | |||
{ | |||
String hostName ("Juce VST Host"); | |||
String hostName ("Carla"); | |||
#ifndef JUCE_PLUGIN_HOST_NO_UI | |||
if (JUCEApplicationBase* app = JUCEApplicationBase::getInstance()) | |||
hostName = app->getApplicationName(); | |||
#endif | |||
hostName.copyToUTF8 ((char*) ptr, (size_t) jmin (kVstMaxVendorStrLen, kVstMaxProductStrLen) - 1); | |||
break; | |||
@@ -1882,6 +1900,7 @@ private: | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginInstance) | |||
}; | |||
#ifndef JUCE_PLUGIN_HOST_NO_UI | |||
//============================================================================== | |||
static Array <VSTPluginWindow*> activeVSTWindows; | |||
@@ -2588,13 +2607,16 @@ private: | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginWindow) | |||
}; | |||
#endif | |||
#ifndef JUCE_PLUGIN_HOST_NO_UI | |||
//============================================================================== | |||
AudioProcessorEditor* VSTPluginInstance::createEditor() | |||
{ | |||
return hasEditor() ? new VSTPluginWindow (*this) | |||
: nullptr; | |||
} | |||
#endif | |||
//============================================================================== | |||
// entry point for all callbacks from the plugin | |||
@@ -37,7 +37,7 @@ | |||
#include "../juce_core/native/juce_BasicNativeHeaders.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 | |||
@@ -44,9 +44,11 @@ AudioProcessor::AudioProcessor() | |||
AudioProcessor::~AudioProcessor() | |||
{ | |||
#ifndef JUCE_PLUGIN_HOST_NO_UI | |||
// ooh, nasty - the editor should have been deleted before the filter | |||
// that it refers to is deleted.. | |||
jassert (activeEditor == nullptr); | |||
#endif | |||
#if JUCE_DEBUG | |||
// 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::processBlockBypassed (AudioSampleBuffer&, MidiBuffer&) {} | |||
#ifndef JUCE_PLUGIN_HOST_NO_UI | |||
//============================================================================== | |||
void AudioProcessor::editorBeingDeleted (AudioProcessorEditor* const editor) noexcept | |||
{ | |||
@@ -244,6 +247,7 @@ AudioProcessorEditor* AudioProcessor::createEditorIfNeeded() | |||
return ed; | |||
} | |||
#endif | |||
//============================================================================== | |||
void AudioProcessor::getCurrentProgramStateInformation (juce::MemoryBlock& destData) | |||
@@ -331,6 +331,7 @@ public: | |||
*/ | |||
void setNonRealtime (bool isNonRealtime) noexcept; | |||
#ifndef JUCE_PLUGIN_HOST_NO_UI | |||
//============================================================================== | |||
/** Creates the filter's UI. | |||
@@ -360,12 +361,14 @@ public: | |||
@see hasEditor | |||
*/ | |||
virtual AudioProcessorEditor* createEditor() = 0; | |||
#endif | |||
/** Your filter must override this and return true if it can create an editor component. | |||
@see createEditor | |||
*/ | |||
virtual bool hasEditor() const = 0; | |||
#ifndef JUCE_PLUGIN_HOST_NO_UI | |||
//============================================================================== | |||
/** Returns the active editor, if there is one. | |||
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. | |||
*/ | |||
AudioProcessorEditor* createEditorIfNeeded(); | |||
#endif | |||
//============================================================================== | |||
/** This must return the correct value immediately after the object has been | |||
@@ -582,7 +586,7 @@ public: | |||
//============================================================================== | |||
/** LV2 specific calls, saving/restore as string. */ | |||
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. */ | |||
@@ -602,9 +606,11 @@ public: | |||
/** This is called by the processor to specify its details before being played. */ | |||
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. */ | |||
void editorBeingDeleted (AudioProcessorEditor*) noexcept; | |||
#endif | |||
/** Not for public use - this is called to initialise the processor before playing. */ | |||
void setSpeakerArrangement (const String& inputs, const String& outputs); | |||
@@ -656,7 +662,9 @@ protected: | |||
private: | |||
Array<AudioProcessorListener*> listeners; | |||
#ifndef JUCE_PLUGIN_HOST_NO_UI | |||
Component::SafePointer<AudioProcessorEditor> activeEditor; | |||
#endif | |||
double sampleRate; | |||
int blockSize, numInputChannels, numOutputChannels, latencySamples; | |||
bool suspended, nonRealtime; | |||
@@ -23,6 +23,13 @@ | |||
// ----------------------------------------------------------------------- | |||
// Include fixes | |||
// Define __cdecl if needed | |||
#ifndef CARLA_OS_WIN | |||
# ifndef __cdecl | |||
# define __cdecl | |||
# endif | |||
#endif | |||
// Disable deprecated VST features (NOT) | |||
#define VST_2_4_EXTENSIONS 1 | |||
#define VST_FORCE_DEPRECATED 0 | |||
@@ -106,7 +113,7 @@ | |||
#define kVstTransportChanged 1 | |||
#define kVstVersion 2400 | |||
#define DECLARE_VST_DEPRECATED(idx) idx | |||
#define VSTCALLBACK | |||
#define VSTCALLBACK __cdecl | |||
struct ERect { | |||
int16_t top, left, bottom, right; | |||
}; | |||