Browse Source

Allow building for platforms without VST3 UI, add wasm CI test

Signed-off-by: falkTX <falktx@falktx.com>
pull/1780/head
falkTX 2 years ago
parent
commit
9c1cad5387
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
8 changed files with 101 additions and 19 deletions
  1. +33
    -0
      .github/workflows/build.yml
  2. +7
    -1
      Makefile
  3. +7
    -1
      source/backend/plugin/CarlaPluginCLAP.cpp
  4. +39
    -4
      source/backend/plugin/CarlaPluginVST3.cpp
  5. +9
    -4
      source/backend/utils/System.cpp
  6. +2
    -7
      source/discovery/Makefile
  7. +2
    -0
      source/discovery/carla-discovery.cpp
  8. +2
    -2
      source/includes/travesty/view.h

+ 33
- 0
.github/workflows/build.yml View File

@@ -51,3 +51,36 @@ jobs:
run: make -j $(nproc) run: make -j $(nproc)
- name: make posix32 - name: make posix32
run: make posix32 -j $(nproc) run: make posix32 -j $(nproc)

wasm:
runs-on: ubuntu-22.04
env:
EMSCRIPTEN_VERSION: 3.1.27
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
- name: Set up cache
id: cache
uses: actions/cache@v3
with:
path: |
~/emsdk
key: emsdk-v1
- name: Set up dependencies
run: |
[ -d ~/emsdk ] || git clone https://github.com/emscripten-core/emsdk.git ~/emsdk
cd ~/emsdk && ./emsdk install ${{ env.EMSCRIPTEN_VERSION }} && ./emsdk activate ${{ env.EMSCRIPTEN_VERSION }}
- name: make
env:
AR: emar
CC: emcc
CXX: em++
NM: emnm
RANLIB: emranlib
STRIP: emstrip
PKG_CONFIG: false
run: |
source ~/emsdk/emsdk_env.sh
make features
make -j $(nproc)

+ 7
- 1
Makefile View File

@@ -29,7 +29,13 @@ VERSION := 2.6.0-alpha1


# --------------------------------------------------------------------------------------------------------------------- # ---------------------------------------------------------------------------------------------------------------------


all: backend discovery bridges-plugin bridges-ui frontend interposer libjack plugin theme
TARGETS = backend discovery bridges-ui frontend theme

ifneq ($(WASM),true)
TARGETS += bridges-plugin interposer libjack plugin
endif

all: $(TARGETS)


# --------------------------------------------------------------------------------------------------------------------- # ---------------------------------------------------------------------------------------------------------------------
# Binaries (native) # Binaries (native)


+ 7
- 1
source/backend/plugin/CarlaPluginCLAP.cpp View File

@@ -1163,7 +1163,13 @@ public:
#elif defined(HAVE_X11) #elif defined(HAVE_X11)
fUI.window = CarlaPluginUI::newX11(this, opts.frontendWinId, opts.pluginsAreStandalone, resizable, false); fUI.window = CarlaPluginUI::newX11(this, opts.frontendWinId, opts.pluginsAreStandalone, resizable, false);
#else #else
#error why is CLAP_WINDOW_API_NATIVE defined??
pData->engine->callback(true, true,
ENGINE_CALLBACK_UI_STATE_CHANGED,
pData->id,
-1,
0, 0, 0.0f,
"Unsupported UI type");
return;
#endif #endif


#ifndef CARLA_OS_MAC #ifndef CARLA_OS_MAC


+ 39
- 4
source/backend/plugin/CarlaPluginVST3.cpp View File

@@ -40,7 +40,7 @@
#include "water/files/File.h" #include "water/files/File.h"
#include "water/misc/Time.h" #include "water/misc/Time.h"


#ifdef _POSIX_VERSION
#if defined(V3_VIEW_PLATFORM_TYPE_NATIVE) && defined(_POSIX_VERSION)
# ifdef CARLA_OS_LINUX # ifdef CARLA_OS_LINUX
# define CARLA_VST3_POSIX_EPOLL # define CARLA_VST3_POSIX_EPOLL
# include <sys/epoll.h> # include <sys/epoll.h>
@@ -97,11 +97,15 @@ void strncpy_utf8(char* const dst, const int16_t* const src, const size_t length


struct v3HostCallback { struct v3HostCallback {
virtual ~v3HostCallback() {} virtual ~v3HostCallback() {}
// v3_component_handler
virtual v3_result v3BeginEdit(v3_param_id) = 0; virtual v3_result v3BeginEdit(v3_param_id) = 0;
virtual v3_result v3PerformEdit(v3_param_id, double) = 0; virtual v3_result v3PerformEdit(v3_param_id, double) = 0;
virtual v3_result v3EndEdit(v3_param_id) = 0; virtual v3_result v3EndEdit(v3_param_id) = 0;
virtual v3_result v3RestartComponent(int32_t) = 0; virtual v3_result v3RestartComponent(int32_t) = 0;
#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
// v3_plugin_frame
virtual v3_result v3ResizeView(struct v3_plugin_view**, struct v3_view_rect*) = 0; virtual v3_result v3ResizeView(struct v3_plugin_view**, struct v3_view_rect*) = 0;
#endif
}; };


// -------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------
@@ -926,6 +930,7 @@ private:


// -------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------


#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
struct HostTimer { struct HostTimer {
v3_timer_handler** handler; v3_timer_handler** handler;
uint64_t periodInMs; uint64_t periodInMs;
@@ -1050,6 +1055,7 @@ private:
CARLA_DECLARE_NON_COPYABLE(carla_v3_run_loop) CARLA_DECLARE_NON_COPYABLE(carla_v3_run_loop)
CARLA_PREVENT_HEAP_ALLOCATION CARLA_PREVENT_HEAP_ALLOCATION
}; };
#endif // V3_VIEW_PLATFORM_TYPE_NATIVE


// -------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------


@@ -1116,6 +1122,7 @@ private:


// -------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------


#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
struct carla_v3_plugin_frame : v3_plugin_frame_cpp { struct carla_v3_plugin_frame : v3_plugin_frame_cpp {
v3HostCallback* const callback; v3HostCallback* const callback;
carla_v3_run_loop loop; carla_v3_run_loop loop;
@@ -1159,11 +1166,14 @@ private:
CARLA_DECLARE_NON_COPYABLE(carla_v3_plugin_frame) CARLA_DECLARE_NON_COPYABLE(carla_v3_plugin_frame)
CARLA_PREVENT_HEAP_ALLOCATION CARLA_PREVENT_HEAP_ALLOCATION
}; };
#endif


// -------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------


class CarlaPluginVST3 : public CarlaPlugin, class CarlaPluginVST3 : public CarlaPlugin,
#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
private CarlaPluginUI::Callback, private CarlaPluginUI::Callback,
#endif
private v3HostCallback private v3HostCallback
{ {
public: public:
@@ -1181,12 +1191,13 @@ public:
fV3ApplicationPtr(&fV3Application), fV3ApplicationPtr(&fV3Application),
fComponentHandler(this), fComponentHandler(this),
fComponentHandlerPtr(&fComponentHandler), fComponentHandlerPtr(&fComponentHandler),
#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
fPluginFrame(this), fPluginFrame(this),
fPluginFramePtr(&fPluginFrame), fPluginFramePtr(&fPluginFrame),
#endif
fV3ClassInfo(), fV3ClassInfo(),
fV3(), fV3(),
fEvents(),
fUI()
fEvents()
{ {
carla_debug("CarlaPluginVST3::CarlaPluginVST3(%p, %i)", engine, id); carla_debug("CarlaPluginVST3::CarlaPluginVST3(%p, %i)", engine, id);


@@ -1199,6 +1210,7 @@ public:


runIdleCallbacksAsNeeded(false); runIdleCallbacksAsNeeded(false);


#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
fPluginFrame.loop.timers.clear(); fPluginFrame.loop.timers.clear();
#ifdef _POSIX_VERSION #ifdef _POSIX_VERSION
fPluginFrame.loop.posixfds.clear(); fPluginFrame.loop.posixfds.clear();
@@ -1223,6 +1235,7 @@ public:
v3_cpp_obj_unref(fV3.view); v3_cpp_obj_unref(fV3.view);
fV3.view = nullptr; fV3.view = nullptr;
} }
#endif


pData->singleMutex.lock(); pData->singleMutex.lock();
pData->masterMutex.lock(); pData->masterMutex.lock();
@@ -1583,6 +1596,7 @@ public:
// ---------------------------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------------------------
// Set ui stuff // Set ui stuff


#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
void setCustomUITitle(const char* const title) noexcept override void setCustomUITitle(const char* const title) noexcept override
{ {
if (fUI.window != nullptr) if (fUI.window != nullptr)
@@ -1799,6 +1813,7 @@ public:


return nullptr; return nullptr;
} }
#endif // V3_VIEW_PLATFORM_TYPE_NATIVE


void runIdleCallbacksAsNeeded(const bool isIdleCallback) void runIdleCallbacksAsNeeded(const bool isIdleCallback)
{ {
@@ -1810,6 +1825,7 @@ public:


fRestartFlags = flags; fRestartFlags = flags;


#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
#ifdef _POSIX_VERSION #ifdef _POSIX_VERSION
LinkedList<HostPosixFileDescriptor>& posixfds(fPluginFrame.loop.posixfds); LinkedList<HostPosixFileDescriptor>& posixfds(fPluginFrame.loop.posixfds);


@@ -1852,7 +1868,7 @@ public:
} }
} }
} }
#endif
#endif // _POSIX_VERSION


LinkedList<HostTimer>& timers(fPluginFrame.loop.timers); LinkedList<HostTimer>& timers(fPluginFrame.loop.timers);


@@ -1870,6 +1886,7 @@ public:
} }
} }
} }
#endif // V3_VIEW_PLATFORM_TYPE_NATIVE
} }


void idle() override void idle() override
@@ -1885,6 +1902,7 @@ public:
if (!kEngineHasIdleOnMainThread) if (!kEngineHasIdleOnMainThread)
runIdleCallbacksAsNeeded(true); runIdleCallbacksAsNeeded(true);


#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
if (fUI.window != nullptr) if (fUI.window != nullptr)
fUI.window->idle(); fUI.window->idle();


@@ -1905,6 +1923,7 @@ public:
fUI.isResizingFromPlugin = false; fUI.isResizingFromPlugin = false;
carla_stdout("Plugin resize stopped"); carla_stdout("Plugin resize stopped");
} }
#endif


CarlaPlugin::uiIdle(); CarlaPlugin::uiIdle();
} }
@@ -2285,6 +2304,7 @@ public:
if (v3category == PLUGIN_CATEGORY_SYNTH) if (v3category == PLUGIN_CATEGORY_SYNTH)
pData->hints |= PLUGIN_IS_SYNTH; pData->hints |= PLUGIN_IS_SYNTH;


#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
if (fV3.view != nullptr && if (fV3.view != nullptr &&
v3_cpp_obj(fV3.view)->is_platform_type_supported(fV3.view, V3_VIEW_PLATFORM_TYPE_NATIVE) == V3_TRUE) v3_cpp_obj(fV3.view)->is_platform_type_supported(fV3.view, V3_VIEW_PLATFORM_TYPE_NATIVE) == V3_TRUE)
{ {
@@ -2292,6 +2312,7 @@ public:
pData->hints |= PLUGIN_HAS_CUSTOM_EMBED_UI; pData->hints |= PLUGIN_HAS_CUSTOM_EMBED_UI;
pData->hints |= PLUGIN_NEEDS_UI_MAIN_THREAD; pData->hints |= PLUGIN_NEEDS_UI_MAIN_THREAD;
} }
#endif


if (aOuts > 0 && (aIns == aOuts || aIns == 1)) if (aOuts > 0 && (aIns == aOuts || aIns == 1))
pData->hints |= PLUGIN_CAN_DRYWET; pData->hints |= PLUGIN_CAN_DRYWET;
@@ -3450,6 +3471,7 @@ protected:
return V3_OK; return V3_OK;
} }


#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
v3_result v3ResizeView(struct v3_plugin_view** const view, struct v3_view_rect* const rect) override v3_result v3ResizeView(struct v3_plugin_view** const view, struct v3_view_rect* const rect) override
{ {
CARLA_SAFE_ASSERT_RETURN(fV3.view != nullptr, V3_INVALID_ARG); CARLA_SAFE_ASSERT_RETURN(fV3.view != nullptr, V3_INVALID_ARG);
@@ -3556,6 +3578,7 @@ protected:
} }
} }
} }
#endif // V3_VIEW_PLATFORM_TYPE_NATIVE


private: private:
#ifdef CARLA_OS_MAC #ifdef CARLA_OS_MAC
@@ -3576,8 +3599,10 @@ private:
carla_v3_component_handler fComponentHandler; carla_v3_component_handler fComponentHandler;
carla_v3_component_handler* const fComponentHandlerPtr; carla_v3_component_handler* const fComponentHandlerPtr;


#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
carla_v3_plugin_frame fPluginFrame; carla_v3_plugin_frame fPluginFrame;
carla_v3_plugin_frame* const fPluginFramePtr; carla_v3_plugin_frame* const fPluginFramePtr;
#endif


// v3_class_info_2 is ABI compatible with v3_class_info // v3_class_info_2 is ABI compatible with v3_class_info
union ClassInfo { union ClassInfo {
@@ -3595,7 +3620,9 @@ private:
v3_audio_processor** processor; v3_audio_processor** processor;
v3_connection_point** connComponent; v3_connection_point** connComponent;
v3_connection_point** connController; v3_connection_point** connController;
#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
v3_plugin_view** view; v3_plugin_view** view;
#endif
bool shouldTerminateComponent; bool shouldTerminateComponent;
bool shouldTerminateController; bool shouldTerminateController;


@@ -3609,7 +3636,9 @@ private:
processor(nullptr), processor(nullptr),
connComponent(nullptr), connComponent(nullptr),
connController(nullptr), connController(nullptr),
#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
view(nullptr), view(nullptr),
#endif
shouldTerminateComponent(false), shouldTerminateComponent(false),
shouldTerminateController(false) {} shouldTerminateController(false) {}


@@ -3746,17 +3775,21 @@ private:
v3_cpp_obj(connController)->connect(connController, connComponent); v3_cpp_obj(connController)->connect(connController, connComponent);
} }


#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
// create view // create view
view = v3_cpp_obj(controller)->create_view(controller, "editor"); view = v3_cpp_obj(controller)->create_view(controller, "editor");
carla_stdout("has view %p", view); carla_stdout("has view %p", view);
#endif


return true; return true;
} }


bool exit() bool exit()
{ {
#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
// must be deleted by now // must be deleted by now
CARLA_SAFE_ASSERT(view == nullptr); CARLA_SAFE_ASSERT(view == nullptr);
#endif


if (connComponent != nullptr && connController != nullptr) if (connComponent != nullptr && connController != nullptr)
{ {
@@ -3938,6 +3971,7 @@ private:
CARLA_DECLARE_NON_COPYABLE(Events) CARLA_DECLARE_NON_COPYABLE(Events)
} fEvents; } fEvents;


#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
struct UI { struct UI {
bool isAttached; bool isAttached;
bool isEmbed; bool isEmbed;
@@ -3972,6 +4006,7 @@ private:


CARLA_DECLARE_NON_COPYABLE(UI) CARLA_DECLARE_NON_COPYABLE(UI)
} fUI; } fUI;
#endif


CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPluginVST3) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPluginVST3)
}; };


+ 9
- 4
source/backend/utils/System.cpp View File

@@ -1,6 +1,6 @@
/* /*
* Carla Plugin Host * Carla Plugin Host
* Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com>
* Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as * modify it under the terms of the GNU General Public License as
@@ -19,26 +19,31 @@


#ifndef CARLA_OS_WASM #ifndef CARLA_OS_WASM
# include "CarlaThread.hpp" # include "CarlaThread.hpp"
#else
# include "CarlaUtils.hpp"
#endif #endif


// ------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------


void carla_fflush(bool err)
void carla_fflush(const bool err)
{ {
std::fflush(err ? stderr : stdout); std::fflush(err ? stderr : stdout);
} }


void carla_fputs(bool err, const char* string)
void carla_fputs(const bool err, const char* const string)
{ {
std::fputs(string, err ? stderr : stdout); std::fputs(string, err ? stderr : stdout);
} }


void carla_set_process_name(const char* name)
void carla_set_process_name(const char* const name)
{ {
carla_debug("carla_set_process_name(\"%s\")", name); carla_debug("carla_set_process_name(\"%s\")", name);


#ifndef CARLA_OS_WASM #ifndef CARLA_OS_WASM
CarlaThread::setCurrentThreadName(name); CarlaThread::setCurrentThreadName(name);
#else
// unused
(void)name;
#endif #endif
} }




+ 2
- 7
source/discovery/Makefile View File

@@ -181,14 +181,9 @@ win64: $(BINDIR)/$(MODULENAME)-win64.exe


# --------------------------------------------------------------------------------------------------------------------- # ---------------------------------------------------------------------------------------------------------------------


$(BINDIR)/$(MODULENAME)-native: $(OBJS_native) $(LIBS_native)
$(BINDIR)/$(MODULENAME)-native$(APP_EXT): $(OBJS_native) $(LIBS_native)
-@mkdir -p $(BINDIR) -@mkdir -p $(BINDIR)
@echo "Linking $(MODULENAME)-native"
$(SILENT)$(CXX) $(OBJS_native) $(LIBS_START) $(LIBS_native) $(LIBS_END) $(LINK_FLAGS) $(NATIVE_LINK_FLAGS) -o $@

$(BINDIR)/$(MODULENAME)-native.exe: $(OBJS_native) $(LIBS_native)
-@mkdir -p $(BINDIR)
@echo "Linking $(MODULENAME)-native.exe"
@echo "Linking $(MODULENAME)-native$(APP_EXT)"
$(SILENT)$(CXX) $(OBJS_native) $(LIBS_START) $(LIBS_native) $(LIBS_END) $(LINK_FLAGS) $(NATIVE_LINK_FLAGS) -o $@ $(SILENT)$(CXX) $(OBJS_native) $(LIBS_START) $(LIBS_native) $(LIBS_END) $(LINK_FLAGS) $(NATIVE_LINK_FLAGS) -o $@


$(BINDIR)/$(MODULENAME)-arm32: $(OBJS_arm32) $(LIBS_arm32) $(BINDIR)/$(MODULENAME)-arm32: $(OBJS_arm32) $(LIBS_arm32)


+ 2
- 0
source/discovery/carla-discovery.cpp View File

@@ -1778,6 +1778,7 @@ static bool do_vst3_check(lib_t& libHandle, const char* const filename, const bo
CARLA_SAFE_ASSERT_CONTINUE(cvIns <= MAX_DISCOVERY_CV_IO); CARLA_SAFE_ASSERT_CONTINUE(cvIns <= MAX_DISCOVERY_CV_IO);
CARLA_SAFE_ASSERT_CONTINUE(cvOuts <= MAX_DISCOVERY_CV_IO); CARLA_SAFE_ASSERT_CONTINUE(cvOuts <= MAX_DISCOVERY_CV_IO);


#ifdef V3_VIEW_PLATFORM_TYPE_NATIVE
if (v3_plugin_view** const view = v3_cpp_obj(controller)->create_view(controller, "editor")) if (v3_plugin_view** const view = v3_cpp_obj(controller)->create_view(controller, "editor"))
{ {
if (v3_cpp_obj(view)->is_platform_type_supported(view, V3_VIEW_PLATFORM_TYPE_NATIVE) == V3_TRUE) if (v3_cpp_obj(view)->is_platform_type_supported(view, V3_VIEW_PLATFORM_TYPE_NATIVE) == V3_TRUE)
@@ -1785,6 +1786,7 @@ static bool do_vst3_check(lib_t& libHandle, const char* const filename, const bo


v3_cpp_obj_unref(view); v3_cpp_obj_unref(view);
} }
#endif


if (factory2 != nullptr && std::strstr(classInfo.v2.sub_categories, "Instrument") != nullptr) if (factory2 != nullptr && std::strstr(classInfo.v2.sub_categories, "Instrument") != nullptr)
hints |= PLUGIN_IS_SYNTH; hints |= PLUGIN_IS_SYNTH;


+ 2
- 2
source/includes/travesty/view.h View File

@@ -1,6 +1,6 @@
/* /*
* travesty, pure C VST3-compatible interface * travesty, pure C VST3-compatible interface
* Copyright (C) 2021-2022 Filipe Coelho <falktx@falktx.com>
* Copyright (C) 2021-2023 Filipe Coelho <falktx@falktx.com>
* *
* Permission to use, copy, modify, and/or distribute this software for any purpose with * Permission to use, copy, modify, and/or distribute this software for any purpose with
* or without fee is hereby granted, provided that the above copyright notice and this * or without fee is hereby granted, provided that the above copyright notice and this
@@ -37,7 +37,7 @@ struct v3_view_rect {
# define V3_VIEW_PLATFORM_TYPE_NATIVE V3_VIEW_PLATFORM_TYPE_NSVIEW # define V3_VIEW_PLATFORM_TYPE_NATIVE V3_VIEW_PLATFORM_TYPE_NSVIEW
#elif defined(_WIN32) #elif defined(_WIN32)
# define V3_VIEW_PLATFORM_TYPE_NATIVE V3_VIEW_PLATFORM_TYPE_HWND # define V3_VIEW_PLATFORM_TYPE_NATIVE V3_VIEW_PLATFORM_TYPE_HWND
#else
#elif !defined(__EMSCRIPTEN__)
# define V3_VIEW_PLATFORM_TYPE_NATIVE V3_VIEW_PLATFORM_TYPE_X11 # define V3_VIEW_PLATFORM_TYPE_NATIVE V3_VIEW_PLATFORM_TYPE_X11
#endif #endif




Loading…
Cancel
Save