Browse Source

Make juce/carla vst save cross-compatible; Builds entire juce on linux

Signed-off-by: falkTX <falktx@gmail.com>
tags/v2.1-alpha1-winvst
parent
commit
ea88d9169d
13 changed files with 88 additions and 64 deletions
  1. +0
    -2
      Makefile
  2. +4
    -1
      source/Makefile.mk
  3. +0
    -4
      source/backend/Makefile
  4. +57
    -12
      source/backend/plugin/CarlaPluginJuce.cpp
  5. +4
    -3
      source/backend/plugin/CarlaPluginVST2.cpp
  6. +0
    -4
      source/backend/utils/Makefile
  7. +0
    -2
      source/bridges-plugin/Makefile
  8. +0
    -2
      source/discovery/Makefile
  9. +7
    -16
      source/modules/AppConfig.h
  10. +3
    -0
      source/modules/juce_graphics/Makefile
  11. +12
    -10
      source/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp
  12. +0
    -4
      source/plugin/Makefile
  13. +1
    -4
      source/utils/JucePluginWindow.hpp

+ 0
- 2
Makefile View File

@@ -63,10 +63,8 @@ ALL_LIBS += $(MODULEDIR)/juce_audio_processors.a
ALL_LIBS += $(MODULEDIR)/juce_core.a
ALL_LIBS += $(MODULEDIR)/juce_data_structures.a
ALL_LIBS += $(MODULEDIR)/juce_events.a
ifeq ($(MACOS_OR_WIN32),true)
ALL_LIBS += $(MODULEDIR)/juce_graphics.a
ALL_LIBS += $(MODULEDIR)/juce_gui_basics.a
endif
ifeq ($(MACOS),true)
ALL_LIBS += $(MODULEDIR)/juce_gui_extra.a
endif


+ 4
- 1
source/Makefile.mk View File

@@ -452,8 +452,11 @@ LILV_LIBS = -ldl -lm -lrt
RTMEMPOOL_LIBS = -lpthread -lrt
WATER_LIBS = -ldl -lpthread -lrt
ifeq ($(USING_JUCE),true)
JUCE_CORE_LIBS = -ldl -lpthread -lrt
JUCE_AUDIO_DEVICES_LIBS = $(shell pkg-config $(PKG_CONFIG_FLAGS) --libs alsa)
JUCE_CORE_LIBS = -ldl -lpthread -lrt
JUCE_EVENTS_LIBS = $(shell pkg-config $(PKG_CONFIG_FLAGS) --libs x11)
JUCE_GRAPHICS_LIBS = $(shell pkg-config $(PKG_CONFIG_FLAGS) --libs freetype2)
JUCE_GUI_BASICS_LIBS = $(shell pkg-config $(PKG_CONFIG_FLAGS) --libs x11 xext)
else
ifeq ($(HAVE_ALSA),true)
RTAUDIO_FLAGS += $(shell pkg-config $(PKG_CONFIG_FLAGS) --cflags alsa) -D__LINUX_ALSA__


+ 0
- 4
source/backend/Makefile View File

@@ -44,10 +44,8 @@ STANDALONE_LIBS += $(MODULEDIR)/juce_audio_processors.a
STANDALONE_LIBS += $(MODULEDIR)/juce_core.a
STANDALONE_LIBS += $(MODULEDIR)/juce_data_structures.a
STANDALONE_LIBS += $(MODULEDIR)/juce_events.a
ifeq ($(MACOS_OR_WIN32),true)
STANDALONE_LIBS += $(MODULEDIR)/juce_graphics.a
STANDALONE_LIBS += $(MODULEDIR)/juce_gui_basics.a
endif
ifeq ($(MACOS),true)
STANDALONE_LIBS += $(MODULEDIR)/juce_gui_extra.a
endif
@@ -76,10 +74,8 @@ STANDALONE_LINK_FLAGS += $(JUCE_AUDIO_PROCESSORS_LIBS)
STANDALONE_LINK_FLAGS += $(JUCE_CORE_LIBS)
STANDALONE_LINK_FLAGS += $(JUCE_DATA_STRUCTURES_LIBS)
STANDALONE_LINK_FLAGS += $(JUCE_EVENTS_LIBS)
ifeq ($(MACOS_OR_WIN32),true)
STANDALONE_LINK_FLAGS += $(JUCE_GRAPHICS_LIBS)
STANDALONE_LINK_FLAGS += $(JUCE_GUI_BASICS_LIBS)
endif
ifeq ($(MACOS),true)
STANDALONE_LINK_FLAGS += $(JUCE_GUI_EXTRA_LIBS)
endif


+ 57
- 12
source/backend/plugin/CarlaPluginJuce.cpp View File

@@ -53,10 +53,8 @@ public:
fAudioBuffer(),
fMidiBuffer(),
fPosInfo(),
fChunk()
#if defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN)
, fWindow()
#endif
fChunk(),
fWindow()
{
carla_debug("CarlaPluginJuce::CarlaPluginJuce(%p, %i)", engine, id);

@@ -234,7 +232,6 @@ public:
// -------------------------------------------------------------------
// Set data (internal stuff)

#if defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN)
void setName(const char* const newName) override
{
CarlaPlugin::setName(newName);
@@ -246,7 +243,6 @@ public:
fWindow->setName(uiName);
}
}
#endif

// -------------------------------------------------------------------
// Set data (plugin-specific stuff)
@@ -269,10 +265,30 @@ public:
CARLA_SAFE_ASSERT_RETURN(data != nullptr,);
CARLA_SAFE_ASSERT_RETURN(dataSize > 0,);

if (isJuceSaveFormat(data, dataSize))
{
const ScopedSingleProcessLocker spl(this, true);
fInstance->setStateInformation(data, static_cast<int>(dataSize));
}
else
{
carla_stdout("NOTE: Loading plugin state in Carla compatibiity mode");
uint8_t* const dataCompat = new uint8_t[dataSize + 160];
std::memset(dataCompat, 0, 160);
std::memcpy(dataCompat+160, data, dataSize);

int32_t* const set = (int32_t*)dataCompat;

dataCompat[39] = dataSize;

set[0] = (int32_t)juce::ByteOrder::littleEndianInt("CcnK");
set[2] = (int32_t)juce::ByteOrder::littleEndianInt("FBCh");
set[3] = fxbSwap(1);
set[39] = fxbSwap(dataSize);

const ScopedSingleProcessLocker spl(this, true);
fInstance->setStateInformation(dataCompat, static_cast<int>(dataSize+160));
}

#if defined(HAVE_LIBLO) && ! defined(BUILD_BRIDGE)
const bool sendOsc(pData->engine->isOscControlRegistered());
@@ -302,7 +318,6 @@ public:
// -------------------------------------------------------------------
// Set ui stuff

#if defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN)
void showCustomUI(const bool yesNo) override
{
CARLA_SAFE_ASSERT_RETURN(fInstance != nullptr,);
@@ -346,7 +361,6 @@ public:

CarlaPlugin::uiIdle();
}
#endif

// -------------------------------------------------------------------
// Plugin state
@@ -542,13 +556,11 @@ public:
if (fDesc.isInstrument)
pData->hints |= PLUGIN_IS_SYNTH;

#if defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN)
if (fInstance->hasEditor())
{
pData->hints |= PLUGIN_HAS_CUSTOM_UI;
pData->hints |= PLUGIN_NEEDS_UI_MAIN_THREAD;
}
#endif

if (aOuts > 0 && (aIns == aOuts || aIns == 1))
pData->hints |= PLUGIN_CAN_DRYWET;
@@ -1224,6 +1236,8 @@ public:
fInstance->setPlayHead(this);
fInstance->addListener(this);

fFormatName = format;

// ---------------------------------------------------------------
// get info

@@ -1279,10 +1293,41 @@ private:
juce::MidiBuffer fMidiBuffer;
CurrentPositionInfo fPosInfo;
juce::MemoryBlock fChunk;
juce::String fFormatName;

#if defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN)
ScopedPointer<JucePluginWindow> fWindow;
#endif

bool isJuceSaveFormat(const void* const data, const std::size_t dataSize)
{
if (fFormatName != "VST2")
return true;
if (dataSize < 160)
return false;

const int32_t* const set = (const int32_t*)data;

if (! compareMagic(set[0], "CcnK"))
return false;
if (! compareMagic(set[2], "FBCh"))
return false;
if (fxbSwap(set[3]) > 1)
return false;

const int32_t chunkSize = fxbSwap(set[39]);

return static_cast<std::size_t>(chunkSize + 160) == dataSize;
}

static bool compareMagic(int32_t magic, const char* name) noexcept
{
return magic == (int32_t)juce::ByteOrder::littleEndianInt (name)
|| magic == (int32_t)juce::ByteOrder::bigEndianInt (name);
}

static int32_t fxbSwap(const int32_t x) noexcept
{
return (int32_t)juce::ByteOrder::swapIfLittleEndian ((uint32_t) x);
}

CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPluginJuce)
};


+ 4
- 3
source/backend/plugin/CarlaPluginVST2.cpp View File

@@ -1,6 +1,6 @@
/*
* Carla VST Plugin
* Copyright (C) 2011-2018 Filipe Coelho <falktx@falktx.com>
* Copyright (C) 2011-2019 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
@@ -397,7 +397,7 @@ public:
CARLA_SAFE_ASSERT_RETURN(data != nullptr,);
CARLA_SAFE_ASSERT_RETURN(dataSize > 0,);

if (loadOldSaveFormat(data, dataSize))
if (loadJuceSaveFormat(data, dataSize))
return;

if (fLastChunk != nullptr)
@@ -2476,7 +2476,7 @@ private:
return (int32_t)ByteOrder::swapIfLittleEndian ((uint32_t) x);
}

bool loadOldSaveFormat(const void* const data, const std::size_t dataSize)
bool loadJuceSaveFormat(const void* const data, const std::size_t dataSize)
{
if (dataSize < 28)
return false;
@@ -2496,6 +2496,7 @@ private:
if (static_cast<std::size_t>(chunkSize + 160) > dataSize)
return false;

carla_stdout("NOTE: Loading plugin state in Juce compatibiity mode");
setChunkData(&set[40], static_cast<std::size_t>(chunkSize));
return true;
}


+ 0
- 4
source/backend/utils/Makefile View File

@@ -29,10 +29,8 @@ LIBS += $(MODULEDIR)/juce_audio_processors.a
LIBS += $(MODULEDIR)/juce_core.a
LIBS += $(MODULEDIR)/juce_data_structures.a
LIBS += $(MODULEDIR)/juce_events.a
ifeq ($(MACOS_OR_WIN32),true)
LIBS += $(MODULEDIR)/juce_graphics.a
LIBS += $(MODULEDIR)/juce_gui_basics.a
endif
ifeq ($(MACOS),true)
LIBS += $(MODULEDIR)/juce_gui_extra.a
endif
@@ -55,10 +53,8 @@ LINK_FLAGS += $(JUCE_AUDIO_PROCESSORS_LIBS)
LINK_FLAGS += $(JUCE_CORE_LIBS)
LINK_FLAGS += $(JUCE_DATA_STRUCTURES_LIBS)
LINK_FLAGS += $(JUCE_EVENTS_LIBS)
ifeq ($(MACOS_OR_WIN32),true)
LINK_FLAGS += $(JUCE_GRAPHICS_LIBS)
LINK_FLAGS += $(JUCE_GUI_BASICS_LIBS)
endif
ifeq ($(MACOS),true)
LINK_FLAGS += $(JUCE_GUI_EXTRA_LIBS)
endif


+ 0
- 2
source/bridges-plugin/Makefile View File

@@ -99,7 +99,6 @@ LIBS_win32 += $(MODULEDIR)/juce_events.win32.a
LIBS_win64 += $(MODULEDIR)/juce_events.win64.a
LINK_FLAGS += $(JUCE_EVENTS_LIBS)

ifeq ($(MACOS_OR_WIN32),true)
LIBS_native += $(MODULEDIR)/juce_graphics.a
LIBS_posix32 += $(MODULEDIR)/juce_graphics.posix32.a
LIBS_posix64 += $(MODULEDIR)/juce_graphics.posix64.a
@@ -113,7 +112,6 @@ LIBS_posix64 += $(MODULEDIR)/juce_gui_basics.posix64.a
LIBS_win32 += $(MODULEDIR)/juce_gui_basics.win32.a
LIBS_win64 += $(MODULEDIR)/juce_gui_basics.win64.a
LINK_FLAGS += $(JUCE_GUI_BASICS_LIBS)
endif

ifeq ($(MACOS),true)
LIBS_native += $(MODULEDIR)/juce_gui_extra.a


+ 0
- 2
source/discovery/Makefile View File

@@ -101,7 +101,6 @@ LIBS_win32 += $(MODULEDIR)/juce_events.win32.a
LIBS_win64 += $(MODULEDIR)/juce_events.win64.a
LINK_FLAGS += $(JUCE_EVENTS_LIBS)

ifeq ($(MACOS_OR_WIN32),true)
LIBS_native += $(MODULEDIR)/juce_graphics.a
LIBS_posix32 += $(MODULEDIR)/juce_graphics.posix32.a
LIBS_posix64 += $(MODULEDIR)/juce_graphics.posix64.a
@@ -115,7 +114,6 @@ LIBS_posix64 += $(MODULEDIR)/juce_gui_basics.posix64.a
LIBS_win32 += $(MODULEDIR)/juce_gui_basics.win32.a
LIBS_win64 += $(MODULEDIR)/juce_gui_basics.win64.a
LINK_FLAGS += $(JUCE_GUI_BASICS_LIBS)
endif # MACOS_OR_WIN32

ifeq ($(MACOS),true)
LIBS_native += $(MODULEDIR)/juce_gui_extra.a


+ 7
- 16
source/modules/AppConfig.h View File

@@ -49,6 +49,8 @@
#define JUCE_MODULE_AVAILABLE_juce_core 1
#define JUCE_MODULE_AVAILABLE_juce_data_structures 1
#define JUCE_MODULE_AVAILABLE_juce_events 1
#define JUCE_MODULE_AVAILABLE_juce_graphics 1
#define JUCE_MODULE_AVAILABLE_juce_gui_basics 1
// always disabled
#define JUCE_MODULE_AVAILABLE_juce_audio_formats 0
@@ -59,15 +61,7 @@
#define JUCE_MODULE_AVAILABLE_juce_video 0
// conditional
#if defined(APPCONFIG_OS_MAC) || defined(APPCONFIG_OS_WIN)
# define JUCE_MODULE_AVAILABLE_juce_graphics 1
# define JUCE_MODULE_AVAILABLE_juce_gui_basics 1
#else
# define JUCE_MODULE_AVAILABLE_juce_graphics 0
# define JUCE_MODULE_AVAILABLE_juce_gui_basics 0
#endif
#if defined(APPCONFIG_OS_MAC)
#ifdef APPCONFIG_OS_MAC
# define JUCE_MODULE_AVAILABLE_juce_gui_extra 1
#else
# define JUCE_MODULE_AVAILABLE_juce_gui_extra 0
@@ -89,9 +83,10 @@
#define JUCE_STRING_UTF_TYPE 8
#define JUCE_USE_VFORK 1
#if ! (defined(APPCONFIG_OS_MAC) || defined(APPCONFIG_OS_WIN))
#ifdef APPCONFIG_OS_LINUX
# define JUCE_DISABLE_NATIVE_FILECHOOSERS 1
# define JUCE_MODAL_LOOPS_PERMITTED 0
# define JUCE_AUDIOPROCESSOR_NO_GUI 1
// # define JUCE_AUDIOPROCESSOR_NO_GUI 1
#endif
// --------------------------------------------------------------------------------------------------------------------
@@ -218,11 +213,7 @@
@see VSTPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_AU
*/
#if defined(APPCONFIG_OS_MAC) || defined(APPCONFIG_OS_WIN)
# define JUCE_PLUGINHOST_VST 1
#else
# define JUCE_PLUGINHOST_VST 0
#endif
#define JUCE_PLUGINHOST_VST 1
/** Config: JUCE_PLUGINHOST_VST3
Enables the VST3 audio plugin hosting classes. This requires the Steinberg VST3 SDK to be


+ 3
- 0
source/modules/juce_graphics/Makefile View File

@@ -12,6 +12,9 @@ include ../Makefile.mk

BUILD_CXX_FLAGS += $(JUCE_GRAPHICS_FLAGS) -I..

ifeq ($(LINUX),true)
BUILD_CXX_FLAGS += $(shell pkg-config --cflags freetype2)
endif
ifeq ($(WIN32),true)
BUILD_CXX_FLAGS += -Wno-missing-field-initializers -Wno-strict-overflow
endif


+ 12
- 10
source/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp View File

@@ -27,16 +27,6 @@
namespace juce
{
static bool exeIsAvailable (const char* const executable)
{
ChildProcess child;
const bool ok = child.start ("which " + String (executable))
&& child.readAllProcessOutput().trim().isNotEmpty();
child.waitForProcessToFinish (60 * 1000);
return ok;
}
bool FileChooser::isPlatformDialogAvailable()
{
#if JUCE_DISABLE_NATIVE_FILECHOOSERS
@@ -47,6 +37,17 @@ bool FileChooser::isPlatformDialogAvailable()
#endif
}
#if ! JUCE_DISABLE_NATIVE_FILECHOOSERS
static bool exeIsAvailable (const char* const executable)
{
ChildProcess child;
const bool ok = child.start ("which " + String (executable))
&& child.readAllProcessOutput().trim().isNotEmpty();
child.waitForProcessToFinish (60 * 1000);
return ok;
}
static uint64 getTopWindowID() noexcept
{
if (TopLevelWindow* top = TopLevelWindow::getActiveTopLevelWindow())
@@ -209,5 +210,6 @@ void FileChooser::showPlatformDialog (Array<File>& results,
previousWorkingDirectory.setAsCurrentWorkingDirectory();
}
#endif
} // namespace juce

+ 0
- 4
source/plugin/Makefile View File

@@ -65,10 +65,8 @@ LIBS += $(MODULEDIR)/juce_audio_processors.a
LIBS += $(MODULEDIR)/juce_core.a
LIBS += $(MODULEDIR)/juce_data_structures.a
LIBS += $(MODULEDIR)/juce_events.a
ifeq ($(MACOS_OR_WIN32),true)
LIBS += $(MODULEDIR)/juce_graphics.a
LIBS += $(MODULEDIR)/juce_gui_basics.a
endif
ifeq ($(MACOS),true)
LIBS += $(MODULEDIR)/juce_gui_extra.a
endif
@@ -95,10 +93,8 @@ LINK_FLAGS += $(JUCE_AUDIO_PROCESSORS_LIBS)
LINK_FLAGS += $(JUCE_CORE_LIBS)
LINK_FLAGS += $(JUCE_DATA_STRUCTURES_LIBS)
LINK_FLAGS += $(JUCE_EVENTS_LIBS)
ifeq ($(MACOS_OR_WIN32),true)
LINK_FLAGS += $(JUCE_GRAPHICS_LIBS)
LINK_FLAGS += $(JUCE_GUI_BASICS_LIBS)
endif
ifeq ($(MACOS),true)
LINK_FLAGS += $(JUCE_GUI_EXTRA_LIBS)
endif


+ 1
- 4
source/utils/JucePluginWindow.hpp View File

@@ -33,10 +33,6 @@

namespace juce {

#if JUCE_LINUX && defined(HAVE_X11)
extern Display* display;
#endif

class JucePluginWindow : public DialogWindow
{
public:
@@ -103,6 +99,7 @@ private:
return;

#if JUCE_LINUX && defined(HAVE_X11)
Display* const display = XWindowSystem::getInstance()->displayRef();
CARLA_SAFE_ASSERT_RETURN(display != nullptr,);

::Window window = (::Window)getWindowHandle();


Loading…
Cancel
Save