Signed-off-by: falkTX <falktx@falktx.com>pull/1658/merge
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #ifndef CARLA_UTILS_H_INCLUDED | |||
| #define CARLA_UTILS_H_INCLUDED | |||
| @@ -341,19 +327,13 @@ typedef struct _CarlaCachedPluginInfo { | |||
| /*! | |||
| * Get how many cached plugins are available. | |||
| * Internal and LV2 plugin formats are cached and need to be discovered via this function. | |||
| * Internal, LV2 and SFZ plugin formats are cached and can be discovered via this function. | |||
| * Do not call this for any other plugin formats. | |||
| * | |||
| * @note if this carla build uses JUCE, then you must call carla_juce_init beforehand | |||
| * @note for AU plugins, you cannot call this outside the main thread | |||
| */ | |||
| CARLA_PLUGIN_EXPORT uint carla_get_cached_plugin_count(PluginType ptype, const char* pluginPath); | |||
| /*! | |||
| * Get information about a cached plugin. | |||
| * | |||
| * @note if this carla build uses JUCE, then you must call carla_juce_init beforehand | |||
| * @note for AU plugins, you cannot call this outside the main thread | |||
| */ | |||
| CARLA_PLUGIN_EXPORT const CarlaCachedPluginInfo* carla_get_cached_plugin_info(PluginType ptype, uint index); | |||
| @@ -368,7 +348,7 @@ CARLA_PLUGIN_EXPORT const CarlaCachedPluginInfo* carla_get_cached_plugin_info(Pl | |||
| CARLA_PLUGIN_EXPORT const char* carla_get_complete_license_text(void); | |||
| /*! | |||
| * Get the juce version used in the current Carla build. | |||
| * @deprecated do not use | |||
| */ | |||
| CARLA_PLUGIN_EXPORT const char* carla_get_juce_version(void); | |||
| @@ -397,23 +377,17 @@ CARLA_PLUGIN_EXPORT const char* carla_get_library_folder(void); | |||
| * JUCE */ | |||
| /*! | |||
| * Initialize data structures and GUI support for JUCE. | |||
| * This is only needed when carla builds use JUCE and you call cached-plugin related APIs. | |||
| * | |||
| * Idle must then be called at somewhat regular intervals, though in practice there is no reason for it yet. | |||
| * | |||
| * Make sure to call carla_juce_cleanup after you are done with APIs that need JUCE. | |||
| * @deprecated do not use | |||
| */ | |||
| CARLA_PLUGIN_EXPORT void carla_juce_init(void); | |||
| /*! | |||
| * Give idle time to JUCE stuff. | |||
| * Currently only used for Linux. | |||
| * @deprecated do not use | |||
| */ | |||
| CARLA_PLUGIN_EXPORT void carla_juce_idle(void); | |||
| /*! | |||
| * Cleanup the JUCE stuff that was initialized by carla_juce_init. | |||
| * @deprecated do not use | |||
| */ | |||
| CARLA_PLUGIN_EXPORT void carla_juce_cleanup(void); | |||
| @@ -1642,7 +1642,33 @@ public: | |||
| if (std::strcmp(format, "AU") == 0) | |||
| { | |||
| fileOrIdentifier = label; | |||
| // compat with new scanning | |||
| if (std::strlen(label) == 14 && label[4] == ',' && label[9] == ',') | |||
| { | |||
| fileOrIdentifier = "AudioUnit:"; | |||
| /**/ if (std::strncmp(label, "aumu", 4) == 0) | |||
| fileOrIdentifier += "Synths/"; | |||
| else if (std::strncmp(label, "aumf", 4) == 0) | |||
| fileOrIdentifier += "Effects/"; | |||
| else if (std::strncmp(label, "aufx", 4) == 0) | |||
| fileOrIdentifier += "Effects/"; | |||
| else if (std::strncmp(label, "augn", 4) == 0) | |||
| fileOrIdentifier += "Generators/"; | |||
| else if (std::strncmp(label, "aupn", 4) == 0) | |||
| fileOrIdentifier += "Panners/"; | |||
| else if (std::strncmp(label, "aumx", 4) == 0) | |||
| fileOrIdentifier += "Mixers/"; | |||
| else if (std::strncmp(label, "aumi", 4) == 0) | |||
| fileOrIdentifier += "MidiEffects/"; | |||
| fileOrIdentifier += label; | |||
| } | |||
| // old style label | |||
| else | |||
| { | |||
| fileOrIdentifier = label; | |||
| } | |||
| } | |||
| else | |||
| { | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #include "CarlaUtils.h" | |||
| @@ -22,11 +8,6 @@ | |||
| #include "CarlaBackendUtils.hpp" | |||
| #include "CarlaLv2Utils.hpp" | |||
| #if defined(USING_JUCE) && defined(CARLA_OS_MAC) | |||
| # include "AppConfig.h" | |||
| # include "juce_audio_processors/juce_audio_processors.h" | |||
| #endif | |||
| #ifndef STATIC_PLUGIN_TARGET | |||
| # define HAVE_SFZ | |||
| # include "water/containers/Array.h" | |||
| @@ -603,67 +584,6 @@ static const CarlaCachedPluginInfo* get_cached_plugin_lv2(Lv2WorldClass& lv2Worl | |||
| // ------------------------------------------------------------------------------------------------------------------- | |||
| #if defined(USING_JUCE) && defined(CARLA_OS_MAC) | |||
| static juce::StringArray gCachedAuPluginResults; | |||
| static void findAUs() | |||
| { | |||
| if (gCachedAuPluginResults.size() != 0) | |||
| return; | |||
| juce::AudioUnitPluginFormat auFormat; | |||
| gCachedAuPluginResults = auFormat.searchPathsForPlugins(juce::FileSearchPath(), false, false); | |||
| } | |||
| static const CarlaCachedPluginInfo* get_cached_plugin_au(const juce::String pluginId) | |||
| { | |||
| static CarlaCachedPluginInfo info; | |||
| static CarlaString sname, slabel, smaker; | |||
| info.valid = false; | |||
| juce::AudioUnitPluginFormat auFormat; | |||
| juce::OwnedArray<juce::PluginDescription> results; | |||
| auFormat.findAllTypesForFile(results, pluginId); | |||
| CARLA_SAFE_ASSERT_RETURN(results.size() > 0, &info); | |||
| CARLA_SAFE_ASSERT(results.size() == 1); | |||
| juce::PluginDescription* const desc(results[0]); | |||
| CARLA_SAFE_ASSERT_RETURN(desc != nullptr, &info); | |||
| info.category = CB::getPluginCategoryFromName(desc->category.toRawUTF8()); | |||
| info.hints = 0x0; | |||
| info.valid = true; | |||
| if (desc->isInstrument) | |||
| info.hints |= CB::PLUGIN_IS_SYNTH; | |||
| if (true) | |||
| info.hints |= CB::PLUGIN_HAS_CUSTOM_UI; | |||
| info.audioIns = static_cast<uint32_t>(desc->numInputChannels); | |||
| info.audioOuts = static_cast<uint32_t>(desc->numOutputChannels); | |||
| info.cvIns = 0; | |||
| info.cvOuts = 0; | |||
| info.midiIns = desc->isInstrument ? 1 : 0; | |||
| info.midiOuts = 0; | |||
| info.parameterIns = 0; | |||
| info.parameterOuts = 0; | |||
| sname = desc->name.toRawUTF8(); | |||
| slabel = desc->fileOrIdentifier.toRawUTF8(); | |||
| smaker = desc->manufacturerName.toRawUTF8(); | |||
| info.name = sname; | |||
| info.label = slabel; | |||
| info.maker = smaker; | |||
| info.copyright = gCachedPluginsNullCharPtr; | |||
| return &info; | |||
| } | |||
| #endif | |||
| // ------------------------------------------------------------------------------------------------------------------- | |||
| #ifdef HAVE_SFZ | |||
| static const CarlaCachedPluginInfo* get_cached_plugin_sfz(const water::File& file) | |||
| { | |||
| @@ -796,12 +716,6 @@ uint carla_get_cached_plugin_count(CB::PluginType ptype, const char* pluginPath) | |||
| return lv2World.getPluginCount(); | |||
| } | |||
| #if defined(USING_JUCE) && defined(CARLA_OS_MAC) | |||
| case CB::PLUGIN_AU: | |||
| findAUs(); | |||
| return static_cast<uint>(gCachedAuPluginResults.size()); | |||
| #endif | |||
| #ifdef HAVE_SFZ | |||
| case CB::PLUGIN_SFZ: | |||
| findSFZs(pluginPath); | |||
| @@ -847,12 +761,6 @@ const CarlaCachedPluginInfo* carla_get_cached_plugin_info(CB::PluginType ptype, | |||
| return get_cached_plugin_lv2(lv2World, lilvPlugin); | |||
| } | |||
| #if defined(USING_JUCE) && defined(CARLA_OS_MAC) | |||
| case CB::PLUGIN_AU: | |||
| CARLA_SAFE_ASSERT_BREAK(index < static_cast<uint>(gCachedAuPluginResults.size())); | |||
| return get_cached_plugin_au(gCachedAuPluginResults.strings.getUnchecked(static_cast<int>(index))); | |||
| #endif | |||
| #ifdef HAVE_SFZ | |||
| case CB::PLUGIN_SFZ: | |||
| CARLA_SAFE_ASSERT_BREAK(index < gSFZs.size()); | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #include "CarlaUtils.h" | |||
| #include "CarlaString.hpp" | |||
| @@ -31,10 +17,6 @@ | |||
| # pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" | |||
| #endif | |||
| #if defined(USING_JUCE) && !defined(BUILD_BRIDGE) | |||
| # include "carla_juce/carla_juce.h" | |||
| #endif | |||
| #ifdef USING_RTAUDIO | |||
| # include "rtaudio/RtAudio.h" | |||
| # include "rtmidi/RtMidi.h" | |||
| @@ -126,19 +108,11 @@ const char* carla_get_juce_version() | |||
| { | |||
| carla_debug("carla_get_juce_version()"); | |||
| static CarlaString retVersion; | |||
| #if defined(USING_JUCE) && !defined(BUILD_BRIDGE) | |||
| if (retVersion.isEmpty()) | |||
| { | |||
| if (const char* const version = CarlaJUCE::getVersion()) | |||
| retVersion = version+6; | |||
| else | |||
| retVersion = "Unknown"; | |||
| } | |||
| #ifdef USING_JUCE | |||
| return "JUCE v7.0.1"; | |||
| #else | |||
| return "Unknown"; | |||
| #endif | |||
| return retVersion; | |||
| } | |||
| const char* const* carla_get_supported_file_extensions() | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #include "CarlaUtils.h" | |||
| @@ -25,23 +11,23 @@ | |||
| void carla_juce_init() | |||
| { | |||
| #ifdef USING_JUCE | |||
| #ifdef USING_JUCE | |||
| CarlaJUCE::initialiseJuce_GUI(); | |||
| #endif | |||
| #endif | |||
| } | |||
| void carla_juce_idle() | |||
| { | |||
| #ifdef USING_JUCE | |||
| #ifdef USING_JUCE | |||
| CarlaJUCE::idleJuce_GUI(); | |||
| #endif | |||
| #endif | |||
| } | |||
| void carla_juce_cleanup() | |||
| { | |||
| #ifdef USING_JUCE | |||
| #ifdef USING_JUCE | |||
| CarlaJUCE::shutdownJuce_GUI(); | |||
| #endif | |||
| #endif | |||
| } | |||
| // ------------------------------------------------------------------------------------------------------------------- | |||
| @@ -13,6 +13,9 @@ BUILD_CXX_FLAGS += $(FLUIDSYNTH_FLAGS) | |||
| BUILD_CXX_FLAGS += $(MAGIC_LIBS) | |||
| BUILD_CXX_FLAGS += $(YSFX_FLAGS) | |||
| # FIXME remove this after getting rid of juce | |||
| BUILD_CXX_FLAGS += -UUSING_JUCE | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| OBJS = \ | |||
| @@ -37,18 +40,6 @@ ifeq ($(HAVE_YSFX),true) | |||
| LIBS += $(MODULEDIR)/ysfx.a | |||
| endif | |||
| ifeq ($(USING_JUCE),true) | |||
| LIBS += $(MODULEDIR)/carla_juce.a | |||
| LIBS += $(MODULEDIR)/juce_audio_basics.a | |||
| LIBS += $(MODULEDIR)/juce_audio_processors.a | |||
| LIBS += $(MODULEDIR)/juce_core.a | |||
| LIBS += $(MODULEDIR)/juce_data_structures.a | |||
| LIBS += $(MODULEDIR)/juce_events.a | |||
| LIBS += $(MODULEDIR)/juce_graphics.a | |||
| LIBS += $(MODULEDIR)/juce_gui_basics.a | |||
| LIBS += $(MODULEDIR)/juce_gui_extra.a | |||
| endif | |||
| LINK_FLAGS += $(JACKBRIDGE_LIBS) | |||
| LINK_FLAGS += $(LILV_LIBS) | |||
| LINK_FLAGS += $(WATER_LIBS) | |||
| @@ -67,17 +58,6 @@ LINK_FLAGS += -pthread | |||
| endif | |||
| endif | |||
| ifeq ($(USING_JUCE),true) | |||
| LINK_FLAGS += $(JUCE_AUDIO_BASICS_LIBS) | |||
| LINK_FLAGS += $(JUCE_AUDIO_PROCESSORS_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) | |||
| LINK_FLAGS += $(JUCE_GUI_EXTRA_LIBS) | |||
| endif | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| all: $(TARGETS) | |||
| @@ -100,12 +80,10 @@ $(BINDIR)/libcarla_utils$(LIB_EXT): $(OBJS) $(LIBS) | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| ifeq ($(MACOS),true) | |||
| ifeq ($(USING_JUCE),true) | |||
| $(OBJDIR)/CachedPlugins.cpp.o: BUILD_CXX_FLAGS += -std=gnu++14 | |||
| endif | |||
| $(OBJDIR)/CarlaUtils.cpp.o: BUILD_CXX_FLAGS += -ObjC++ | |||
| $(OBJDIR)/Windows.cpp.o: BUILD_CXX_FLAGS += -ObjC++ | |||
| endif | |||
| $(OBJDIR)/%.cpp.o: %.cpp | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #include "CarlaUtils.h" | |||
| @@ -760,7 +746,6 @@ CarlaPluginDiscoveryHandle carla_plugin_discovery_start(const char* const discov | |||
| } | |||
| case CB::PLUGIN_INTERNAL: | |||
| case CB::PLUGIN_AU: | |||
| return new CarlaPluginDiscovery(discoveryTool, btype, ptype, discoveryCb, checkCacheCb, callbackPtr); | |||
| case CB::PLUGIN_LADSPA: | |||
| @@ -808,6 +793,11 @@ CarlaPluginDiscoveryHandle carla_plugin_discovery_start(const char* const discov | |||
| wildcard = "*.vst3"; | |||
| break; | |||
| case CB::PLUGIN_AU: | |||
| directories = true; | |||
| wildcard = "*.component"; | |||
| break; | |||
| case CB::PLUGIN_CLAP: | |||
| wildcard = "*.clap"; | |||
| #ifdef CARLA_OS_MAC | |||
| @@ -8,13 +8,6 @@ CWD=.. | |||
| MODULENAME=carla-discovery | |||
| include $(CWD)/Makefile.mk | |||
| # Workaround GCC bug | |||
| ifeq ($(TESTBUILD),true) | |||
| ifeq ($(USING_JUCE),true) | |||
| BUILD_CXX_FLAGS += -Wno-undef | |||
| endif | |||
| endif | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| BINDIR := $(CWD)/../bin | |||
| @@ -46,10 +39,6 @@ BUILD_CXX_FLAGS += -pthread | |||
| LINK_FLAGS += -pthread | |||
| endif | |||
| ifeq ($(USING_JUCE),true) | |||
| BUILD_CXX_FLAGS += -std=gnu++14 | |||
| endif | |||
| 32BIT_FLAGS += -DBUILD_BRIDGE -DBUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| 64BIT_FLAGS += -DBUILD_BRIDGE -DBUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| ARM32_FLAGS += -DBUILD_BRIDGE -DBUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| @@ -97,27 +86,6 @@ LIBS_win32 += $(MODULEDIR)/jackbridge.win32e.a | |||
| LIBS_win64 += $(MODULEDIR)/jackbridge.win64e.a | |||
| endif | |||
| ifeq ($(USING_JUCE),true) | |||
| LIBS_native += $(MODULEDIR)/carla_juce.a | |||
| LIBS_native += $(MODULEDIR)/juce_audio_basics.a | |||
| LIBS_native += $(MODULEDIR)/juce_audio_processors.a | |||
| LIBS_native += $(MODULEDIR)/juce_core.a | |||
| LIBS_native += $(MODULEDIR)/juce_data_structures.a | |||
| LIBS_native += $(MODULEDIR)/juce_events.a | |||
| LIBS_native += $(MODULEDIR)/juce_graphics.a | |||
| LIBS_native += $(MODULEDIR)/juce_gui_basics.a | |||
| LIBS_native += $(MODULEDIR)/juce_gui_extra.a | |||
| LINK_FLAGS += $(JUCE_AUDIO_BASICS_LIBS) | |||
| LINK_FLAGS += $(JUCE_AUDIO_PROCESSORS_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) | |||
| LINK_FLAGS += $(JUCE_GUI_EXTRA_LIBS) | |||
| endif # USING_JUCE | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| OBJS_native = $(OBJDIR)/$(MODULENAME).cpp.o | |||
| @@ -36,7 +36,6 @@ | |||
| #ifdef BUILD_BRIDGE | |||
| # undef HAVE_FLUIDSYNTH | |||
| # undef HAVE_YSFX | |||
| # undef USING_JUCE | |||
| #endif | |||
| #ifdef HAVE_FLUIDSYNTH | |||
| @@ -54,22 +53,6 @@ | |||
| # include "../backend/utils/CachedPlugins.cpp" | |||
| #endif | |||
| #ifdef USING_JUCE | |||
| # include "carla_juce/carla_juce.h" | |||
| # pragma GCC diagnostic ignored "-Wdouble-promotion" | |||
| # pragma GCC diagnostic ignored "-Wduplicated-branches" | |||
| # pragma GCC diagnostic ignored "-Weffc++" | |||
| # pragma GCC diagnostic ignored "-Wfloat-equal" | |||
| # include "juce_audio_processors/juce_audio_processors.h" | |||
| # if JUCE_PLUGINHOST_VST | |||
| # define USING_JUCE_FOR_VST2 | |||
| # endif | |||
| # if JUCE_PLUGINHOST_VST3 | |||
| # define USING_JUCE_FOR_VST3 | |||
| # endif | |||
| # pragma GCC diagnostic pop | |||
| #endif | |||
| // must be last | |||
| #ifdef BUILDING_CARLA_FOR_WINE | |||
| # include "../jackbridge/JackBridge.hpp" | |||
| @@ -230,11 +213,6 @@ static void do_cached_check(const PluginType type) | |||
| } | |||
| } | |||
| #ifdef USING_JUCE | |||
| if (type == PLUGIN_AU) | |||
| CarlaJUCE::initialiseJuce_GUI(); | |||
| #endif | |||
| const uint count = carla_get_cached_plugin_count(type, plugPath); | |||
| for (uint i=0; i<count; ++i) | |||
| @@ -244,11 +222,6 @@ static void do_cached_check(const PluginType type) | |||
| print_cached_plugin(pinfo); | |||
| } | |||
| #ifdef USING_JUCE | |||
| if (type == PLUGIN_AU) | |||
| CarlaJUCE::shutdownJuce_GUI(); | |||
| #endif | |||
| } | |||
| #endif // ! BUILD_BRIDGE | |||
| @@ -889,7 +862,6 @@ static void do_lv2_check(const char* const bundle, const bool doInit) | |||
| } | |||
| #endif // ! BUILD_BRIDGE | |||
| #ifndef USING_JUCE_FOR_VST2 | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| // VST2 | |||
| @@ -1452,12 +1424,10 @@ static bool do_vst2_check(lib_t& libHandle, const char* const filename, const bo | |||
| (void)filename; | |||
| #endif | |||
| } | |||
| #endif // ! USING_JUCE_FOR_VST2 | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| // VST3 | |||
| #ifndef USING_JUCE_FOR_VST3 | |||
| struct carla_v3_host_application : v3_host_application_cpp { | |||
| carla_v3_host_application() | |||
| { | |||
| @@ -2033,7 +2003,6 @@ static bool do_vst3_check(lib_t& libHandle, const char* const filename, const bo | |||
| v3_exit(); | |||
| return false; | |||
| } | |||
| #endif // ! USING_JUCE_FOR_VST3 | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| // AU | |||
| @@ -2259,7 +2228,9 @@ static bool do_au_check(const char* const filename, const bool doInit) | |||
| { | |||
| hints |= PLUGIN_HAS_CUSTOM_UI; | |||
| #ifndef BUILD_BRIDGE | |||
| /* FIXME only enable this after doing custom AU hosting | |||
| hints |= PLUGIN_HAS_CUSTOM_EMBED_UI; | |||
| */ | |||
| #endif | |||
| } | |||
| @@ -2326,7 +2297,7 @@ static bool do_au_check(const char* const filename, const bool doInit) | |||
| return false; | |||
| } | |||
| #endif | |||
| #endif // CARLA_OS_MAC | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| // CLAP | |||
| @@ -2596,172 +2567,6 @@ static bool do_clap_check(lib_t& libHandle, const char* const filename, const bo | |||
| return false; | |||
| } | |||
| #ifdef USING_JUCE | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| // JUCE | |||
| // find all available plugin audio ports | |||
| static void findMaxTotalChannels(juce::AudioProcessor* const filter, int& maxTotalIns, int& maxTotalOuts) | |||
| { | |||
| filter->enableAllBuses(); | |||
| const int numInputBuses = filter->getBusCount(true); | |||
| const int numOutputBuses = filter->getBusCount(false); | |||
| if (numInputBuses > 1 || numOutputBuses > 1) | |||
| { | |||
| maxTotalIns = maxTotalOuts = 0; | |||
| for (int i = 0; i < numInputBuses; ++i) | |||
| maxTotalIns += filter->getChannelCountOfBus(true, i); | |||
| for (int i = 0; i < numOutputBuses; ++i) | |||
| maxTotalOuts += filter->getChannelCountOfBus(false, i); | |||
| } | |||
| else | |||
| { | |||
| maxTotalIns = numInputBuses > 0 ? filter->getBus(true, 0)->getMaxSupportedChannels(64) : 0; | |||
| maxTotalOuts = numOutputBuses > 0 ? filter->getBus(false, 0)->getMaxSupportedChannels(64) : 0; | |||
| } | |||
| } | |||
| static bool do_juce_check(const char* const filename_, const char* const stype, const bool doInit) | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(stype != nullptr && stype[0] != 0, false) // FIXME | |||
| carla_debug("do_juce_check(%s, %s, %s)", filename_, stype, bool2str(doInit)); | |||
| CarlaJUCE::initialiseJuce_GUI(); | |||
| juce::String filename; | |||
| #ifdef CARLA_OS_WIN | |||
| // Fix for wine usage | |||
| if (juce::File("Z:\\usr\\").isDirectory() && filename_[0] == '/') | |||
| { | |||
| filename = filename_; | |||
| filename.replace("/", "\\"); | |||
| filename = "Z:" + filename; | |||
| } | |||
| else | |||
| #endif | |||
| { | |||
| filename = juce::File(filename_).getFullPathName(); | |||
| } | |||
| CarlaScopedPointer<juce::AudioPluginFormat> pluginFormat; | |||
| /* */ if (std::strcmp(stype, "VST2") == 0) | |||
| { | |||
| #if JUCE_PLUGINHOST_VST | |||
| pluginFormat = new juce::VSTPluginFormat(); | |||
| #else | |||
| DISCOVERY_OUT("error", "VST2 support not available"); | |||
| return false; | |||
| #endif | |||
| } | |||
| else if (std::strcmp(stype, "VST3") == 0) | |||
| { | |||
| #if JUCE_PLUGINHOST_VST3 | |||
| pluginFormat = new juce::VST3PluginFormat(); | |||
| #else | |||
| DISCOVERY_OUT("error", "VST3 support not available"); | |||
| return false; | |||
| #endif | |||
| } | |||
| else if (std::strcmp(stype, "AU") == 0) | |||
| { | |||
| #if JUCE_PLUGINHOST_AU | |||
| pluginFormat = new juce::AudioUnitPluginFormat(); | |||
| #else | |||
| DISCOVERY_OUT("error", "AU support not available"); | |||
| return false; | |||
| #endif | |||
| } | |||
| if (pluginFormat == nullptr) | |||
| { | |||
| DISCOVERY_OUT("error", stype << " support not available"); | |||
| return false; | |||
| } | |||
| #ifdef CARLA_OS_WIN | |||
| CARLA_CUSTOM_SAFE_ASSERT_RETURN("Plugin file/folder does not exist", juce::File(filename).exists(), false); | |||
| #endif | |||
| CARLA_SAFE_ASSERT_RETURN(pluginFormat->fileMightContainThisPluginType(filename), false); | |||
| juce::OwnedArray<juce::PluginDescription> results; | |||
| pluginFormat->findAllTypesForFile(results, filename); | |||
| if (results.size() == 0) | |||
| { | |||
| #if defined(CARLA_OS_MAC) && defined(__aarch64__) | |||
| if (std::strcmp(stype, "VST2") == 0 || std::strcmp(stype, "VST3") == 0) | |||
| return true; | |||
| #endif | |||
| DISCOVERY_OUT("error", "No plugins found"); | |||
| return false; | |||
| } | |||
| for (juce::PluginDescription **it = results.begin(), **end = results.end(); it != end; ++it) | |||
| { | |||
| juce::PluginDescription* const desc(*it); | |||
| uint hints = 0x0; | |||
| int audioIns = desc->numInputChannels; | |||
| int audioOuts = desc->numOutputChannels; | |||
| int midiIns = 0; | |||
| int midiOuts = 0; | |||
| int parameters = 0; | |||
| if (desc->isInstrument) | |||
| { | |||
| hints |= PLUGIN_IS_SYNTH; | |||
| midiIns = 1; | |||
| } | |||
| if (doInit) | |||
| { | |||
| if (std::unique_ptr<juce::AudioPluginInstance> instance | |||
| = pluginFormat->createInstanceFromDescription(*desc, kSampleRate, kBufferSize)) | |||
| { | |||
| CarlaJUCE::idleJuce_GUI(); | |||
| findMaxTotalChannels(instance.get(), audioIns, audioOuts); | |||
| instance->refreshParameterList(); | |||
| parameters = instance->getParameters().size(); | |||
| if (instance->hasEditor()) | |||
| hints |= PLUGIN_HAS_CUSTOM_UI; | |||
| if (instance->acceptsMidi()) | |||
| midiIns = 1; | |||
| if (instance->producesMidi()) | |||
| midiOuts = 1; | |||
| } | |||
| } | |||
| DISCOVERY_OUT("init", "------------"); | |||
| DISCOVERY_OUT("build", BINARY_NATIVE); | |||
| DISCOVERY_OUT("hints", hints); | |||
| DISCOVERY_OUT("category", getPluginCategoryAsString(getPluginCategoryFromName(desc->category.toRawUTF8()))); | |||
| DISCOVERY_OUT("name", desc->descriptiveName); | |||
| DISCOVERY_OUT("label", desc->name); | |||
| DISCOVERY_OUT("maker", desc->manufacturerName); | |||
| DISCOVERY_OUT("uniqueId", desc->uniqueId); | |||
| 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("end", "------------"); | |||
| } | |||
| CarlaJUCE::idleJuce_GUI(); | |||
| CarlaJUCE::shutdownJuce_GUI(); | |||
| return false; | |||
| } | |||
| #endif // USING_JUCE_FOR_VST2 | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| // fluidsynth (dls, sf2, sfz) | |||
| @@ -3102,25 +2907,15 @@ int main(int argc, const char* argv[]) | |||
| #endif | |||
| case PLUGIN_VST2: | |||
| #if defined(USING_JUCE) && JUCE_PLUGINHOST_VST | |||
| retryAsX64lugin = do_juce_check(filename, "VST2", doInit); | |||
| #else | |||
| retryAsX64lugin = do_vst2_check(handle, filename, doInit); | |||
| #endif | |||
| break; | |||
| case PLUGIN_VST3: | |||
| #if defined(USING_JUCE) && JUCE_PLUGINHOST_VST3 | |||
| retryAsX64lugin = do_juce_check(filename, "VST3", doInit); | |||
| #else | |||
| retryAsX64lugin = do_vst3_check(handle, filename, doInit); | |||
| #endif | |||
| break; | |||
| case PLUGIN_AU: | |||
| #if defined(USING_JUCE) && JUCE_PLUGINHOST_AU | |||
| do_juce_check(filename, "AU", doInit); | |||
| #elif defined(CARLA_OS_MAC) | |||
| #ifdef CARLA_OS_MAC | |||
| retryAsX64lugin = do_au_check(filename, doInit); | |||
| #else | |||
| DISCOVERY_OUT("error", "AU support not available"); | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #pragma once | |||
| @@ -61,7 +47,11 @@ typedef struct { | |||
| uint parameterOuts; | |||
| } PluginListDialogResults; | |||
| #ifdef __cplusplus | |||
| class PluginListDialog; | |||
| #else | |||
| struct PluginListDialog; | |||
| #endif | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| @@ -262,9 +262,6 @@ class CarlaUtils(): | |||
| self.lib.carla_get_complete_license_text.argtypes = None | |||
| self.lib.carla_get_complete_license_text.restype = c_char_p | |||
| self.lib.carla_get_juce_version.argtypes = None | |||
| self.lib.carla_get_juce_version.restype = c_char_p | |||
| self.lib.carla_get_supported_file_extensions.argtypes = None | |||
| self.lib.carla_get_supported_file_extensions.restype = POINTER(c_char_p) | |||
| @@ -328,15 +325,6 @@ class CarlaUtils(): | |||
| self.lib.carla_pipe_client_destroy.argtypes = [CarlaPipeClientHandle] | |||
| self.lib.carla_pipe_client_destroy.restype = None | |||
| self.lib.carla_juce_init.argtypes = None | |||
| self.lib.carla_juce_init.restype = None | |||
| self.lib.carla_juce_idle.argtypes = None | |||
| self.lib.carla_juce_idle.restype = None | |||
| self.lib.carla_juce_cleanup.argtypes = None | |||
| self.lib.carla_juce_cleanup.restype = None | |||
| self.lib.carla_get_desktop_scale_factor.argtypes = None | |||
| self.lib.carla_get_desktop_scale_factor.restype = c_double | |||
| @@ -399,10 +387,6 @@ class CarlaUtils(): | |||
| def get_complete_license_text(self): | |||
| return charPtrToString(self.lib.carla_get_complete_license_text()) | |||
| # Get the juce version used in the current Carla build. | |||
| def get_juce_version(self): | |||
| return charPtrToString(self.lib.carla_get_juce_version()) | |||
| # Get the list of supported file extensions in carla_load_file(). | |||
| def get_supported_file_extensions(self): | |||
| return charPtrPtrToStringList(self.lib.carla_get_supported_file_extensions()) | |||
| @@ -484,15 +468,6 @@ class CarlaUtils(): | |||
| def pipe_client_destroy(self, handle): | |||
| self.lib.carla_pipe_client_destroy(handle) | |||
| def juce_init(self): | |||
| self.lib.carla_juce_init() | |||
| def juce_idle(self): | |||
| self.lib.carla_juce_idle() | |||
| def juce_cleanup(self): | |||
| self.lib.carla_juce_cleanup() | |||
| def get_desktop_scale_factor(self): | |||
| return float(self.lib.carla_get_desktop_scale_factor()) | |||
| @@ -1,8 +1,5 @@ | |||
| /* | |||
| * Carla plugin host | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * SPDX-License-Identifier: GPL-2.0-or-later | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #include "pluginlistdialog.hpp" | |||
| #include "pluginrefreshdialog.hpp" | |||
| @@ -65,6 +62,9 @@ struct PluginPaths { | |||
| QCarlaString vst2; | |||
| QCarlaString vst3; | |||
| QCarlaString clap; | |||
| #ifdef CARLA_OS_MAC | |||
| QCarlaString au; | |||
| #endif | |||
| #ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
| QCarlaString jsfx; | |||
| QCarlaString sf2; | |||
| @@ -261,6 +261,12 @@ struct PluginPaths { | |||
| #endif | |||
| } | |||
| #ifdef CARLA_OS_MAC | |||
| au = HOME + "/Library/Audio/Plug-Ins/Components"; | |||
| au += ":/Library/Audio/Plug-Ins/Components"; | |||
| au += ":/System/Library/Components"; | |||
| #endif | |||
| #ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
| if (const char *const envJSFX = std::getenv("JSFX_PATH")) | |||
| { | |||
| @@ -780,13 +786,13 @@ struct PluginListDialog::PrivateData { | |||
| std::vector<PluginInfo> vst2; | |||
| std::vector<PluginInfo> vst3; | |||
| std::vector<PluginInfo> clap; | |||
| #ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
| #ifdef CARLA_OS_MAC | |||
| std::vector<PluginInfo> au; | |||
| #endif | |||
| #ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
| std::vector<PluginInfo> jsfx; | |||
| std::vector<PluginInfo> kits; | |||
| #endif | |||
| #endif | |||
| QMap<QString, QList<PluginInfo>> cache; | |||
| QList<PluginFavorite> favorites; | |||
| @@ -803,14 +809,14 @@ struct PluginListDialog::PrivateData { | |||
| case PLUGIN_VST2: vst2.push_back(pinfo); return true; | |||
| case PLUGIN_VST3: vst3.push_back(pinfo); return true; | |||
| case PLUGIN_CLAP: clap.push_back(pinfo); return true; | |||
| #ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
| #ifdef CARLA_OS_MAC | |||
| case PLUGIN_AU: au.push_back(pinfo); return true; | |||
| #endif | |||
| #ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
| case PLUGIN_JSFX: jsfx.push_back(pinfo); return true; | |||
| case PLUGIN_SF2: | |||
| case PLUGIN_SFZ: kits.push_back(pinfo); return true; | |||
| #endif | |||
| #endif | |||
| default: return false; | |||
| } | |||
| } | |||
| @@ -1111,6 +1117,11 @@ void PluginListDialog::setPluginPath(const PluginType ptype, const char* const p | |||
| case PLUGIN_CLAP: | |||
| p->paths.clap = path; | |||
| break; | |||
| #ifdef CARLA_OS_MAC | |||
| case PLUGIN_AU: | |||
| p->paths.au = path; | |||
| break; | |||
| #endif | |||
| #ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
| case PLUGIN_LADSPA: | |||
| p->paths.ladspa = path; | |||
| @@ -1245,17 +1256,14 @@ void PluginListDialog::timerEvent(QTimerEvent* const event) | |||
| p->discovery.ptype = PLUGIN_CLAP; | |||
| break; | |||
| case PLUGIN_CLAP: | |||
| #ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
| #ifdef CARLA_OS_MAC | |||
| if (p->discovery.btype == BINARY_POSIX32 || p->discovery.btype == BINARY_POSIX64) | |||
| { | |||
| ui.label->setText(tr("Discovering AU plugins...")); | |||
| p->discovery.ptype = PLUGIN_AU; | |||
| break; | |||
| } | |||
| [[fallthrough]]; | |||
| ui.label->setText(tr("Discovering AU plugins...")); | |||
| path = p->paths.au; | |||
| p->discovery.ptype = PLUGIN_AU; | |||
| break; | |||
| case PLUGIN_AU: | |||
| #endif | |||
| #ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
| if (p->discovery.btype == BINARY_NATIVE && p->paths.jsfx.isNotEmpty()) | |||
| { | |||
| ui.label->setText(tr("Discovering JSFX plugins...")); | |||
| @@ -1422,18 +1430,18 @@ void PluginListDialog::addPluginsToTable() | |||
| for (const PluginInfo& plugin : p->plugins.clap) | |||
| addPluginToTable(plugin); | |||
| #ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
| #ifdef CARLA_OS_MAC | |||
| for (const PluginInfo& plugin : p->plugins.au) | |||
| addPluginToTable(plugin); | |||
| #endif | |||
| #ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
| for (const PluginInfo& plugin : p->plugins.jsfx) | |||
| addPluginToTable(plugin); | |||
| for (const PluginInfo& plugin : p->plugins.kits) | |||
| addPluginToTable(plugin); | |||
| #endif | |||
| #endif | |||
| CARLA_SAFE_ASSERT_INT2(p->lastTableWidgetIndex == ui.tableWidget->rowCount(), | |||
| p->lastTableWidgetIndex, ui.tableWidget->rowCount()); | |||
| @@ -1936,13 +1944,13 @@ void PluginListDialog::refreshPluginsStart() | |||
| p->plugins.vst2.clear(); | |||
| p->plugins.vst3.clear(); | |||
| p->plugins.clap.clear(); | |||
| #ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
| #ifdef CARLA_OS_MAC | |||
| p->plugins.au.clear(); | |||
| #endif | |||
| #ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
| p->plugins.jsfx.clear(); | |||
| p->plugins.kits.clear(); | |||
| #endif | |||
| #endif | |||
| p->discovery.dialog->b_start->setEnabled(false); | |||
| p->discovery.dialog->b_skip->setEnabled(true); | |||
| p->discovery.ignoreCache = p->discovery.dialog->ch_all->isChecked(); | |||
| @@ -1,8 +1,5 @@ | |||
| /* | |||
| * Carla plugin host | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * SPDX-License-Identifier: GPL-2.0-or-later | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #pragma once | |||
| @@ -19,6 +16,7 @@ | |||
| #endif | |||
| #include <QtWidgets/QDialog> | |||
| #include "ui_pluginlistdialog.h" | |||
| #ifdef __clang__ | |||
| # pragma clang diagnostic pop | |||
| @@ -26,8 +24,6 @@ | |||
| # pragma GCC diagnostic pop | |||
| #endif | |||
| #include "ui_pluginlistdialog.h" | |||
| class QSafeSettings; | |||
| typedef struct _CarlaPluginDiscoveryInfo CarlaPluginDiscoveryInfo; | |||
| typedef struct _HostSettings HostSettings; | |||