diff --git a/source/backend/CarlaBackend.h b/source/backend/CarlaBackend.h index 2f85059e1..486ca9363 100644 --- a/source/backend/CarlaBackend.h +++ b/source/backend/CarlaBackend.h @@ -1363,17 +1363,6 @@ typedef struct { */ const double* sampleRates; -#ifdef __cplusplus - /*! - * Clear data. - */ - void clear() noexcept - { - hints = 0x0; - bufferSizes = nullptr; - sampleRates = nullptr; - } -#endif } EngineDriverDeviceInfo; /** @} */ diff --git a/source/backend/Makefile.mk b/source/backend/Makefile.mk index e3b49f594..5f0b34344 100644 --- a/source/backend/Makefile.mk +++ b/source/backend/Makefile.mk @@ -18,9 +18,13 @@ ifeq ($(HAVE_FFMPEG),true) BUILD_CXX_FLAGS += -DHAVE_FFMPEG endif -# ifeq ($(HAVE_JUCE),true) -# BUILD_CXX_FLAGS += -DHAVE_JUCE -# endif +ifeq ($(HAVE_JUCE),true) +BUILD_CXX_FLAGS += -DHAVE_JUCE +endif + +ifeq ($(HAVE_OPENGL),true) +BUILD_CXX_FLAGS += -DHAVE_OPENGL +endif # -------------------------------------------------------------- diff --git a/source/backend/engine/CarlaEngine.cpp b/source/backend/engine/CarlaEngine.cpp index c5eac8804..26ad2cca3 100644 --- a/source/backend/engine/CarlaEngine.cpp +++ b/source/backend/engine/CarlaEngine.cpp @@ -30,10 +30,6 @@ #include "CarlaStateUtils.hpp" #include "CarlaMIDI.h" -#include -#include -#include - #ifdef HAVE_JUCE # include "juce_audio_basics.h" using juce::FloatVectorOperations; @@ -41,16 +37,16 @@ using juce::FloatVectorOperations; # include #endif +#include +#include +#include + CARLA_BACKEND_START_NAMESPACE #if 0 } // Fix editor indentation #endif -// Engine helper macro, sets lastError and returns false/NULL -#define CARLA_SAFE_ASSERT_RETURN_ERR(cond, err) if (cond) pass(); else { carla_safe_assert(#cond, __FILE__, __LINE__); setLastError(err); return false; } -#define CARLA_SAFE_ASSERT_RETURN_ERRN(cond, err) if (cond) pass(); else { carla_safe_assert(#cond, __FILE__, __LINE__); setLastError(err); return nullptr; } - // ----------------------------------------------------------------------- // Fallback data diff --git a/source/backend/engine/CarlaEngineInternal.hpp b/source/backend/engine/CarlaEngineInternal.hpp index 199acad38..260fad24e 100644 --- a/source/backend/engine/CarlaEngineInternal.hpp +++ b/source/backend/engine/CarlaEngineInternal.hpp @@ -33,6 +33,12 @@ CARLA_BACKEND_START_NAMESPACE // ----------------------------------------------------------------------- +// Engine helper macro, sets lastError and returns false/NULL +#define CARLA_SAFE_ASSERT_RETURN_ERR(cond, err) if (cond) pass(); else { carla_safe_assert(#cond, __FILE__, __LINE__); setLastError(err); return false; } +#define CARLA_SAFE_ASSERT_RETURN_ERRN(cond, err) if (cond) pass(); else { carla_safe_assert(#cond, __FILE__, __LINE__); setLastError(err); return nullptr; } + +// ----------------------------------------------------------------------- + static inline const char* EngineType2Str(const EngineType type) { diff --git a/source/backend/engine/CarlaEngineJack.cpp b/source/backend/engine/CarlaEngineJack.cpp index e2f0e090c..6c4e1fcb6 100644 --- a/source/backend/engine/CarlaEngineJack.cpp +++ b/source/backend/engine/CarlaEngineJack.cpp @@ -22,14 +22,14 @@ #include "List.hpp" #include "jackbridge/JackBridge.hpp" -#include -#include - #ifdef HAVE_JUCE # include "juce_audio_basics.h" using juce::FloatVectorOperations; #endif +#include +#include + #define URI_CANVAS_ICON "http://kxstudio.sf.net/ns/canvas/icon" CARLA_BACKEND_START_NAMESPACE @@ -1960,11 +1960,11 @@ private: bool portIsCV = (jackPortFlags & JackPortIsControlVoltage); unsigned int canvasPortFlags = 0x0; - canvasPortFlags |= portIsInput ? PATCHBAY_PORT_IS_INPUT : PATCHBAY_PORT_IS_OUTPUT; - canvasPortFlags |= portIsAudio ? PATCHBAY_PORT_IS_AUDIO : PATCHBAY_PORT_IS_MIDI; + canvasPortFlags |= portIsInput ? PATCHBAY_PORT_IS_INPUT : 0x0; + canvasPortFlags |= portIsAudio ? PATCHBAY_PORT_TYPE_AUDIO : PATCHBAY_PORT_TYPE_MIDI; if (portIsAudio && portIsCV) - canvasPortFlags |= PATCHBAY_PORT_IS_CV; + canvasPortFlags |= PATCHBAY_PORT_TYPE_CV; PortNameToId portNameToId(groupId, fLastPortId++, portName, fullPortName); fUsedPortNames.append(portNameToId); diff --git a/source/backend/engine/CarlaEngineJuce.cpp b/source/backend/engine/CarlaEngineJuce.cpp index 0bc537ee2..beaea6a87 100644 --- a/source/backend/engine/CarlaEngineJuce.cpp +++ b/source/backend/engine/CarlaEngineJuce.cpp @@ -22,9 +22,11 @@ #include "CarlaEngineInternal.hpp" #include "CarlaBackendUtils.hpp" #include "CarlaMIDI.h" -#include "RtList.hpp" -#include "juce_audio_basics.h" +// #include "RtList.hpp" + +#include "juce_audio_devices.h" +using namespace juce; CARLA_BACKEND_START_NAMESPACE @@ -33,12 +35,23 @@ CARLA_BACKEND_START_NAMESPACE #endif // ------------------------------------------------------------------------------------------------------------------- -// Juce Engine static const char** gRetNames = nullptr; +static OwnedArray gJuceDeviceTypes; + +static void initJuceDevices() +{ + static AudioDeviceManager manager; + + if (gJuceDeviceTypes.size() == 0) + manager.createAudioDeviceTypes(gJuceDeviceTypes); +} + +// ------------------------------------------------------------------------------------------------------------------- +// Juce Engine class CarlaEngineJuce : public CarlaEngine/*, - public juce::AudioIODeviceCallback*/ + public AudioIODeviceCallback*/ { public: CarlaEngineJuce() @@ -121,7 +134,7 @@ protected: private: //juce::AudioIODeviceType* fDeviceType; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJuce) + //JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJuce) }; // ----------------------------------------- @@ -133,54 +146,138 @@ CarlaEngine* CarlaEngine::newJuce(const AudioApi /*api*/) size_t CarlaEngine::getJuceApiCount() { - return 0; + initJuceDevices(); + + return gJuceDeviceTypes.size(); } -const char* CarlaEngine::getJuceApiName(const unsigned int /*index*/) +const char* CarlaEngine::getJuceApiName(const unsigned int index) { - return nullptr; + initJuceDevices(); + + if ((int)index >= gJuceDeviceTypes.size()) + return nullptr; + + AudioIODeviceType* const deviceType(gJuceDeviceTypes[index]); + + if (deviceType == nullptr) + return nullptr; + + return deviceType->getTypeName().toRawUTF8(); } -const char* const* CarlaEngine::getJuceApiDeviceNames(const unsigned int /*index*/) +const char* const* CarlaEngine::getJuceApiDeviceNames(const unsigned int index) { -#if 0 - juce::ScopedPointer deviceType; + initJuceDevices(); - switch(index) - { - case 0: - deviceType = juce::AudioIODeviceType::createAudioIODeviceType_JACK(); - break; - default: - //setLastError(""); + if ((int)index >= gJuceDeviceTypes.size()) return nullptr; - } + + AudioIODeviceType* const deviceType(gJuceDeviceTypes[index]); if (deviceType == nullptr) - { - //setLastError(""); return nullptr; - } deviceType->scanForDevices(); - const juce::StringArray devNames(deviceType->getDeviceNames()); - const int devNameCount(devNames.size()); + StringArray deviceNames(deviceType->getDeviceNames()); + const int deviceNameCount(deviceNames.size()); - if (devNameCount <= 0) + if (deviceNameCount <= 0) return nullptr; - gRetNames = new const char*[devNameCount+1]; + if (gRetNames != nullptr) + { + for (int i=0; gRetNames[i] != nullptr; ++i) + delete[] gRetNames[i]; + delete[] gRetNames; + } + + gRetNames = new const char*[deviceNameCount+1]; - for (unsigned int i=0; i < devNameCount; ++i) - gRetNames[i] = carla_strdup(devNames[i].toRawUTF8()); + for (int i=0; i < deviceNameCount; ++i) + gRetNames[i] = carla_strdup(deviceNames[i].toRawUTF8()); - gRetNames[devNameCount] = nullptr; -#endif + gRetNames[deviceNameCount] = nullptr; return gRetNames; } +const EngineDriverDeviceInfo* CarlaEngine::getJuceDeviceInfo(const unsigned int index, const char* const deviceName) +{ + initJuceDevices(); + + if ((int)index >= gJuceDeviceTypes.size()) + return nullptr; + + AudioIODeviceType* const deviceType(gJuceDeviceTypes[index]); + + if (deviceType == nullptr) + return nullptr; + + deviceType->scanForDevices(); + + ScopedPointer device(deviceType->createDevice(deviceName, deviceName)); + + if (device == nullptr) + return nullptr; + + static EngineDriverDeviceInfo devInfo = { 0x0, nullptr, nullptr }; + static uint32_t dummyBufferSizes[11] = { 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 0 }; + static double dummySampleRates[14] = { 22050.0, 32000.0, 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0, 0.0 }; + + // reset + devInfo.hints = ENGINE_DRIVER_DEVICE_VARIABLE_BUFFER_SIZE | ENGINE_DRIVER_DEVICE_VARIABLE_SAMPLE_RATE; + + // cleanup + if (devInfo.bufferSizes != nullptr && devInfo.bufferSizes != dummyBufferSizes) + { + delete[] devInfo.bufferSizes; + devInfo.bufferSizes = nullptr; + } + + if (devInfo.sampleRates != nullptr && devInfo.sampleRates != dummySampleRates) + { + delete[] devInfo.sampleRates; + devInfo.sampleRates = nullptr; + } + + if (device->hasControlPanel()) + devInfo.hints |= ENGINE_DRIVER_DEVICE_HAS_CONTROL_PANEL; + + if (size_t bufferSizesCount = device->getNumBufferSizesAvailable()) + { + uint32_t* const bufferSizes(new uint32_t[bufferSizesCount+1]); + + for (size_t i=0; i < bufferSizesCount; ++i) + bufferSizes[i] = device->getBufferSizeSamples(i); + bufferSizes[bufferSizesCount] = 0; + + devInfo.bufferSizes = bufferSizes; + } + else + { + devInfo.bufferSizes = dummyBufferSizes; + } + + if (size_t sampleRatesCount = device->getNumSampleRates()) + { + double* const sampleRates(new double[sampleRatesCount+1]); + + for (size_t i=0; i < sampleRatesCount; ++i) + sampleRates[i] = device->getSampleRate(i); + sampleRates[sampleRatesCount] = 0.0; + + devInfo.sampleRates = sampleRates; + } + else + { + devInfo.sampleRates = dummySampleRates; + } + + return &devInfo; +} + // ----------------------------------------- CARLA_BACKEND_END_NAMESPACE diff --git a/source/backend/engine/CarlaEngineRtAudio.cpp b/source/backend/engine/CarlaEngineRtAudio.cpp index 9e73e7335..7df979b0d 100644 --- a/source/backend/engine/CarlaEngineRtAudio.cpp +++ b/source/backend/engine/CarlaEngineRtAudio.cpp @@ -24,8 +24,7 @@ #include "rtmidi/RtMidi.h" #ifdef USE_JUCE -#include "juce_audio_basics.h" - +# include "juce_audio_basics.h" using juce::FloatVectorOperations; #endif @@ -94,10 +93,6 @@ public: fAudio(api), fAudioBufIn(nullptr), fAudioBufOut(nullptr), -#ifdef CARLA_PROPER_CPP11_SUPPORT - fAudioBufRackIn{nullptr}, - fAudioBufRackOut{nullptr}, -#endif fAudioCountIn(0), fAudioCountOut(0), fAudioIsInterleaved(false), @@ -108,10 +103,8 @@ public: { carla_debug("CarlaEngineRtAudio::CarlaEngineRtAudio(%i)", api); -#ifndef CARLA_PROPER_CPP11_SUPPORT - fAudioBufRackIn[0] = fAudioBufRackIn[1] = nullptr; + fAudioBufRackIn[0] = fAudioBufRackIn[1] = nullptr; fAudioBufRackOut[0] = fAudioBufRackOut[1] = nullptr; -#endif // just to make sure pData->options.forceStereo = true; @@ -148,7 +141,7 @@ public: CARLA_ASSERT(fAudioCountIn == 0); CARLA_ASSERT(fAudioCountOut == 0); CARLA_ASSERT(! fAudioIsReady); - CARLA_ASSERT(clientName != nullptr); + CARLA_ASSERT(clientName != nullptr && clientName[0] != '\0'); carla_debug("CarlaEngineRtAudio::init(\"%s\")", clientName); RtAudio::StreamParameters iParams, oParams; @@ -396,13 +389,13 @@ public: return "OSS"; case RtAudio::UNIX_JACK: #if defined(CARLA_OS_WIN) - return "JACK with WinMM"; + return "JACK with WinMM"; #elif defined(CARLA_OS_MAC) - return "JACK with CoreMidi"; + return "JACK with CoreMidi"; #elif defined(CARLA_OS_LINUX) - return "JACK with ALSA-MIDI"; + return "JACK with ALSA-MIDI"; #else - return "JACK (RtAudio)"; + return "JACK (RtAudio)"; #endif case RtAudio::MACOSX_CORE: return "CoreAudio"; @@ -1503,15 +1496,6 @@ const char* const* CarlaEngine::getRtAudioApiDeviceNames(const unsigned int inde RtAudio rtAudio(api); - if (gRetNames != nullptr) - { - int i=0; - while (gRetNames[i] != nullptr) - delete[] gRetNames[i++]; - delete[] gRetNames; - gRetNames = nullptr; - } - const unsigned int devCount(rtAudio.getDeviceCount()); if (devCount == 0) @@ -1529,6 +1513,13 @@ const char* const* CarlaEngine::getRtAudioApiDeviceNames(const unsigned int inde const unsigned int realDevCount(devNames.count()); + if (gRetNames != nullptr) + { + for (int i=0; gRetNames[i] != nullptr; ++i) + delete[] gRetNames[i]; + delete[] gRetNames; + } + gRetNames = new const char*[realDevCount+1]; for (unsigned int i=0; i < realDevCount; ++i) @@ -1570,9 +1561,9 @@ const EngineDriverDeviceInfo* CarlaEngine::getRtAudioDeviceInfo(const unsigned i if (i == devCount) return nullptr; - static EngineDriverDeviceInfo devInfo; - static uint32_t dummyBufferSizes[11] = { 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 0 }; - static double dummySampleRates[14] = { 22050.0, 32000.0, 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0, 0.0 }; + static EngineDriverDeviceInfo devInfo = { 0x0, nullptr, nullptr }; + static uint32_t dummyBufferSizes[11] = { 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 0 }; + static double dummySampleRates[14] = { 22050.0, 32000.0, 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0, 0.0 }; // reset devInfo.hints = 0x0; @@ -1587,7 +1578,7 @@ const EngineDriverDeviceInfo* CarlaEngine::getRtAudioDeviceInfo(const unsigned i if (size_t sampleRatesCount = rtAudioDevInfo.sampleRates.size()) { - double* sampleRates(new double[sampleRatesCount+1]); + double* const sampleRates(new double[sampleRatesCount+1]); for (size_t i=0; i < sampleRatesCount; ++i) sampleRates[i] = rtAudioDevInfo.sampleRates[i]; diff --git a/source/backend/engine/Makefile b/source/backend/engine/Makefile index 6bf11c93f..49da4c026 100644 --- a/source/backend/engine/Makefile +++ b/source/backend/engine/Makefile @@ -23,10 +23,10 @@ OBJS = $(OBJSp) \ CarlaEngineJack.cpp.o \ CarlaEngineRtAudio.cpp.o -# ifeq ($(HAVE_JUCE),true) -# OBJS += \ -# CarlaEngineJuce.cpp.o -# endif +ifeq ($(HAVE_JUCE),true) +OBJS += \ + CarlaEngineJuce.cpp.o +endif HEADERS = \ ../CarlaBackend.h ../CarlaEngine.hpp ../CarlaPlugin.hpp \ diff --git a/source/backend/plugin/JucePlugin.cpp b/source/backend/plugin/JucePlugin.cpp index 7da02dddb..5cc5c2420 100644 --- a/source/backend/plugin/JucePlugin.cpp +++ b/source/backend/plugin/JucePlugin.cpp @@ -19,12 +19,13 @@ #ifdef HAVE_JUCE -#include "JuceHeader.h" +//#include "JuceHeader.h" -using juce::VSTPluginFormat; +//using juce::VSTPluginFormat; CARLA_BACKEND_START_NAMESPACE +#if 0 class JucePlugin : public CarlaPlugin { public: @@ -58,6 +59,7 @@ private: CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(JucePlugin) }; +#endif CARLA_BACKEND_END_NAMESPACE @@ -69,7 +71,7 @@ CarlaPlugin* CarlaPlugin::newJuce(const Initializer& init) { carla_debug("CarlaPlugin::newJuce({%p, \"%s\", \"%s\", \"%s\"})", init.engine, init.filename, init.name, init.label); -#ifdef HAVE_JUCE +#if 0 //def HAVE_JUCE JucePlugin* const plugin(new JucePlugin(init.engine, init.id)); //if (! plugin->init(init.filename, init.name, init.label)) diff --git a/source/backend/standalone/Makefile b/source/backend/standalone/Makefile index 14dd07c3f..e55e9ca4b 100644 --- a/source/backend/standalone/Makefile +++ b/source/backend/standalone/Makefile @@ -10,10 +10,21 @@ include ../Makefile.mk # Common LINK_FLAGS += $(shell pkg-config --libs liblo) + LINK_FLAGS += $(QTCORE_LIBS) LINK_FLAGS += $(QTXML_LIBS) LINK_FLAGS += $(RTMEMPOOL_LIBS) +ifeq ($(HAVE_JUCE),true) +LINK_FLAGS += $(JUCE_AUDIO_BASICS_LIBS) +LINK_FLAGS += $(JUCE_AUDIO_DEVICES_LIBS) +LINK_FLAGS += $(JUCE_CORE_LIBS) +# LINK_FLAGS += $(JUCE_DATA_STRUCTURES_LIBS) +LINK_FLAGS += $(JUCE_EVENTS_LIBS) +# LINK_FLAGS += $(JUCE_GRAPHICS_LIBS) +# LINK_FLAGS += $(JUCE_GUI_BASICS_LIBS) +endif + # -------------------------------------------------------------- # Engine @@ -22,13 +33,6 @@ LINK_FLAGS += $(RTMIDI_LIBS) LINK_FLAGS += $(JACKBRIDGE_LIBS) -# LINK_FLAGS += $(JUCE_AUDIO_BASICS_LIBS) -# LINK_FLAGS += $(JUCE_CORE_LIBS) -# LINK_FLAGS += $(JUCE_DATA_STRUCTURES_LIBS) -# LINK_FLAGS += $(JUCE_EVENTS_LIBS) -# LINK_FLAGS += $(JUCE_GRAPHICS_LIBS) -# LINK_FLAGS += $(JUCE_GUI_BASICS_LIBS) - # -------------------------------------------------------------- # Plugin @@ -79,24 +83,28 @@ LIBS += ../libcarla_plugin.a LIBS += ../../modules/carla_native.a LIBS += ../../modules/jackbridge.a -# LIBS += ../../modules/juce_audio_basics.a -# LIBS += ../../modules/juce_core.a -# LIBS += ../../modules/juce_data_structures.a -# LIBS += ../../modules/juce_events.a -# LIBS += ../../modules/juce_graphics.a -# LIBS += ../../modules/juce_gui_basics.a LIBS += ../../modules/rtaudio.a LIBS += ../../modules/rtmidi.a LIBS += ../../modules/rtmempool.a -ifeq ($(HAVE_OPENGL),true) -LIBS += ../../modules/dgl.a -endif - ifeq ($(CARLA_PLUGIN_SUPPORT),true) LIBS += ../../modules/lilv.a endif +ifeq ($(HAVE_JUCE),true) +LIBS += ../../modules/juce_audio_basics.a +LIBS += ../../modules/juce_audio_devices.a +LIBS += ../../modules/juce_core.a +# LIBS += ../../modules/juce_data_structures.a +LIBS += ../../modules/juce_events.a +# LIBS += ../../modules/juce_graphics.a +# LIBS += ../../modules/juce_gui_basics.a +endif + +ifeq ($(HAVE_OPENGL),true) +LIBS += ../../modules/dgl.a +endif + # -------------------------------------------------------------- OBJS = \