Signed-off-by: falkTX <falktx@falktx.com>tags/22.02
@@ -64,3 +64,6 @@ | |||||
[submodule "plugins/DrumKit"] | [submodule "plugins/DrumKit"] | ||||
path = plugins/DrumKit | path = plugins/DrumKit | ||||
url = https://github.com/SVModular/DrumKit.git | url = https://github.com/SVModular/DrumKit.git | ||||
[submodule "carla"] | |||||
path = carla | |||||
url = https://github.com/falkTX/Carla.git |
@@ -6,7 +6,7 @@ | |||||
include dpf/Makefile.base.mk | include dpf/Makefile.base.mk | ||||
all: cardinal deps dgl plugins gen resources | |||||
all: cardinal carla deps dgl plugins gen resources | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Build config | # Build config | ||||
@@ -62,6 +62,11 @@ endif | |||||
cardinal: deps dgl plugins | cardinal: deps dgl plugins | ||||
$(MAKE) all -C src | $(MAKE) all -C src | ||||
carla: | |||||
$(MAKE) -C carla plugin \ | |||||
CAN_GENERATE_LV2_TTL=false \ | |||||
STATIC_PLUGIN_TARGET=true | |||||
deps: | deps: | ||||
ifneq ($(SYSDEPS),true) | ifneq ($(SYSDEPS),true) | ||||
$(MAKE) all -C deps | $(MAKE) all -C deps | ||||
@@ -116,4 +121,4 @@ install: | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
.PHONY: deps plugins | |||||
.PHONY: carla deps plugins |
@@ -0,0 +1 @@ | |||||
Subproject commit 14e9ec85fa2866c423e8a7c36490272ec49fb924 |
@@ -21,7 +21,6 @@ | |||||
# include "../../../dpf/dgl/src/Resources.hpp" | # include "../../../dpf/dgl/src/Resources.hpp" | ||||
#endif | #endif | ||||
#include "DearImGui/imgui.h" | |||||
#include "DearImGui/imgui_impl_opengl2.h" | #include "DearImGui/imgui_impl_opengl2.h" | ||||
struct ImGuiWidget::PrivateData { | struct ImGuiWidget::PrivateData { | ||||
@@ -115,13 +114,10 @@ void ImGuiWidget::drawFramebuffer() | |||||
// glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); | // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); | ||||
ImGui::SetCurrentContext(imData->context); | ImGui::SetCurrentContext(imData->context); | ||||
ImGui_ImplOpenGL2_NewFrame(); | ImGui_ImplOpenGL2_NewFrame(); | ||||
ImGui::NewFrame(); | ImGui::NewFrame(); | ||||
ImGui::SetNextWindowPos(ImVec2(0, 0)); | |||||
ImGui::SetNextWindowSize(ImVec2(box.size.x, box.size.y)); | |||||
ImGui::ShowDemoWindow(); | |||||
drawImGui(); | |||||
ImGui::Render(); | ImGui::Render(); | ||||
@@ -140,8 +136,30 @@ void ImGuiWidget::onHover(const HoverEvent& e) | |||||
ImGui::SetCurrentContext(imData->context); | ImGui::SetCurrentContext(imData->context); | ||||
ImGuiIO& io(ImGui::GetIO()); | ImGuiIO& io(ImGui::GetIO()); | ||||
io.MousePos.x = e.pos.x; | |||||
io.MousePos.y = e.pos.y; | |||||
io.MousePos.x = e.pos.x + e.mouseDelta.x; | |||||
io.MousePos.y = e.pos.y + e.mouseDelta.y; | |||||
} | |||||
void ImGuiWidget::onDragHover(const DragHoverEvent& e) | |||||
{ | |||||
ImGui::SetCurrentContext(imData->context); | |||||
ImGuiIO& io(ImGui::GetIO()); | |||||
io.MousePos.x = e.pos.x + e.mouseDelta.x; | |||||
io.MousePos.y = e.pos.y + e.mouseDelta.y; | |||||
} | |||||
void ImGuiWidget::onHoverScroll(const HoverScrollEvent& e) | |||||
{ | |||||
ImGui::SetCurrentContext(imData->context); | |||||
ImGuiIO& io(ImGui::GetIO()); | |||||
io.MouseWheel += e.scrollDelta.y * 0.01f; | |||||
io.MouseWheelH += e.scrollDelta.x * 0.01f; | |||||
if (io.WantCaptureMouse) | |||||
e.consume(this); | |||||
} | } | ||||
void ImGuiWidget::onButton(const ButtonEvent& e) | void ImGuiWidget::onButton(const ButtonEvent& e) | ||||
@@ -153,13 +171,75 @@ void ImGuiWidget::onButton(const ButtonEvent& e) | |||||
switch (e.button) | switch (e.button) | ||||
{ | { | ||||
case GLFW_MOUSE_BUTTON_LEFT: | case GLFW_MOUSE_BUTTON_LEFT: | ||||
io.MouseDown[0] = e.action; | |||||
io.MouseDown[0] = e.action == GLFW_PRESS; | |||||
break; | break; | ||||
case GLFW_MOUSE_BUTTON_MIDDLE: | case GLFW_MOUSE_BUTTON_MIDDLE: | ||||
io.MouseDown[1] = e.action; | |||||
io.MouseDown[1] = e.action == GLFW_PRESS; | |||||
break; | break; | ||||
case GLFW_MOUSE_BUTTON_RIGHT: | case GLFW_MOUSE_BUTTON_RIGHT: | ||||
io.MouseDown[2] = e.action; | |||||
io.MouseDown[2] = e.action == GLFW_PRESS; | |||||
break; | |||||
} | |||||
io.KeyCtrl = e.mods & GLFW_MOD_CTRL; | |||||
io.KeyShift = e.mods & GLFW_MOD_SHIFT; | |||||
io.KeyAlt = e.mods & GLFW_MOD_ALT; | |||||
io.KeySuper = e.mods & GLFW_MOD_SUPER; | |||||
if (io.WantCaptureMouse) | |||||
e.consume(this); | |||||
} | |||||
void ImGuiWidget::onSelectKey(const SelectKeyEvent& e) | |||||
{ | |||||
ImGui::SetCurrentContext(imData->context); | |||||
ImGuiIO& io(ImGui::GetIO()); | |||||
io.KeyCtrl = e.mods & GLFW_MOD_CTRL; | |||||
io.KeyShift = e.mods & GLFW_MOD_SHIFT; | |||||
io.KeyAlt = e.mods & GLFW_MOD_ALT; | |||||
io.KeySuper = e.mods & GLFW_MOD_SUPER; | |||||
printf("onSelectKey %i %i\n", e.key, e.scancode); | |||||
// d_stdout("onKeyboard %u %u", event.key, event.keycode); | |||||
/* | |||||
if (event.key <= kKeyDelete) | |||||
io.KeysDown[event.key] = event.press; | |||||
else if (event.key >= kKeyF1 && event.key <= kKeyPause) | |||||
io.KeysDown[0xff + event.key - kKeyF1] = event.press; | |||||
*/ | |||||
if (io.WantCaptureKeyboard) | |||||
e.consume(this); | |||||
} | |||||
void ImGuiWidget::onSelectText(const SelectTextEvent& e) | |||||
{ | |||||
ImGui::SetCurrentContext(imData->context); | |||||
ImGuiIO& io(ImGui::GetIO()); | |||||
switch (e.codepoint) | |||||
{ | |||||
/* | |||||
case kKeyBackspace: | |||||
case kKeyEscape: | |||||
case kKeyDelete: | |||||
*/ | |||||
case '\n': | |||||
case '\r': | |||||
case '\t': | |||||
break; | |||||
default: | |||||
// d_stdout("input %u %u %lu '%s'", event.keycode, event.character, std::strlen(event.string), event.string); | |||||
char character[2] = { (char)e.codepoint, 0 }; | |||||
io.AddInputCharactersUTF8(character); | |||||
break; | break; | ||||
} | } | ||||
if (io.WantCaptureKeyboard) | |||||
e.consume(this); | |||||
} | } |
@@ -18,6 +18,7 @@ | |||||
#pragma once | #pragma once | ||||
#include "plugin.hpp" | #include "plugin.hpp" | ||||
#include "DearImGui/imgui.h" | |||||
struct ImGuiWidget : OpenGlWidget { | struct ImGuiWidget : OpenGlWidget { | ||||
struct PrivateData; | struct PrivateData; | ||||
@@ -25,8 +26,20 @@ struct ImGuiWidget : OpenGlWidget { | |||||
ImGuiWidget(float width, float height); | ImGuiWidget(float width, float height); | ||||
~ImGuiWidget() override; | ~ImGuiWidget() override; | ||||
void drawFramebuffer() override; | |||||
virtual void drawImGui() | |||||
{ | |||||
ImGui::SetNextWindowPos(ImVec2(0, 0)); | |||||
ImGui::SetNextWindowSize(ImVec2(box.size.x, box.size.y)); | |||||
ImGui::ShowDemoWindow(); | |||||
} | |||||
private: | |||||
void drawFramebuffer() override; | |||||
void onHover(const HoverEvent& e) override; | void onHover(const HoverEvent& e) override; | ||||
void onDragHover(const DragHoverEvent& e) override; | |||||
void onHoverScroll(const HoverScrollEvent& e) override; | |||||
void onButton(const ButtonEvent& e) override; | void onButton(const ButtonEvent& e) override; | ||||
void onSelectKey(const SelectKeyEvent& e) override; | |||||
void onSelectText(const SelectTextEvent& e) override; | |||||
}; | }; |
@@ -36,6 +36,7 @@ struct CardinalPluginContext : rack::Context { | |||||
bool playing, reset; | bool playing, reset; | ||||
int32_t bar, beat, beatsPerBar; | int32_t bar, beat, beatsPerBar; | ||||
double tick, tickClock, ticksPerBeat, ticksPerClock, ticksPerFrame; | double tick, tickClock, ticksPerBeat, ticksPerClock, ticksPerFrame; | ||||
uintptr_t nativeWindowId; | |||||
Plugin* const plugin; | Plugin* const plugin; | ||||
CardinalPluginContext(Plugin* const p); | CardinalPluginContext(Plugin* const p); | ||||
}; | }; | ||||
@@ -676,7 +676,13 @@ $(BUILD_DIR)/Cardinal/%.cpp.o: Cardinal/%.cpp | |||||
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | ||||
@echo "Compiling $<" | @echo "Compiling $<" | ||||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | ||||
-DpluginInstance=pluginInstance__Cardinal | |||||
-DpluginInstance=pluginInstance__Cardinal \ | |||||
-DREAL_BUILD \ | |||||
-DSTATIC_PLUGIN_TARGET \ | |||||
-I../carla/source/backend \ | |||||
-I../carla/source/includes \ | |||||
-I../carla/source/modules \ | |||||
-I../carla/source/utils | |||||
$(BUILD_DIR)/AmalgamatedHarmonics/%.cpp.o: AmalgamatedHarmonics/%.cpp | $(BUILD_DIR)/AmalgamatedHarmonics/%.cpp.o: AmalgamatedHarmonics/%.cpp | ||||
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | ||||
@@ -98,6 +98,8 @@ public: | |||||
fContext(getRackContextFromPlugin(getPluginInstancePointer())), | fContext(getRackContextFromPlugin(getPluginInstancePointer())), | ||||
fResizeHandle(this) | fResizeHandle(this) | ||||
{ | { | ||||
fContext->nativeWindowId = getWindow().getNativeWindowHandle(); | |||||
if (isResizable()) | if (isResizable()) | ||||
fResizeHandle.hide(); | fResizeHandle.hide(); | ||||
@@ -13,6 +13,58 @@ PREFIX ?= /usr/local | |||||
DESTDIR ?= | DESTDIR ?= | ||||
SYSDEPS ?= false | SYSDEPS ?= false | ||||
# -------------------------------------------------------------- | |||||
# Carla stuff | |||||
CWD = ../../carla/source | |||||
include $(CWD)/Makefile.deps.mk | |||||
CARLA_BUILD_DIR = ../../carla/build | |||||
ifeq ($(DEBUG),true) | |||||
CARLA_BUILD_TYPE = Debug | |||||
else | |||||
CARLA_BUILD_TYPE = Release | |||||
endif | |||||
CARLA_EXTRA_LIBS = $(CARLA_BUILD_DIR)/plugin/$(CARLA_BUILD_TYPE)/carla-host-plugin.cpp.o | |||||
# ifneq ($(MACOS),true) | |||||
# CARLA_EXTRA_LIBS += -Wl,--start-group -Wl,--whole-archive | |||||
# endif | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/carla_engine_plugin.a | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/carla_plugin.a | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/native-plugins.a | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/audio_decoder.a | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/jackbridge.min.a | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/lilv.a | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/rtmempool.a | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/sfzero.a | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/water.a | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/zita-resampler.a | |||||
# CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/eel2.a | |||||
# CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/jsusfx.a | |||||
ifeq ($(USING_JUCE),true) | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/juce_audio_basics.a | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/juce_audio_processors.a | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/juce_core.a | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/juce_data_structures.a | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/juce_events.a | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/juce_graphics.a | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/juce_gui_basics.a | |||||
ifeq ($(USING_JUCE_GUI_EXTRA),true) | |||||
CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/juce_gui_extra.a | |||||
endif | |||||
endif | |||||
# ifneq ($(MACOS),true) | |||||
# CARLA_EXTRA_LIBS += -Wl,--no-whole-archive -Wl,--end-group | |||||
# endif | |||||
# FIXME patch fluidsynth package | |||||
ifeq ($(WINDOWS),true) | |||||
STATIC_CARLA_PLUGIN_LIBS += -ldsound -lwinmm | |||||
endif | |||||
CARLA_EXTRA_LIBS += $(STATIC_CARLA_PLUGIN_LIBS) | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Import base definitions | # Import base definitions | ||||
@@ -37,22 +89,25 @@ endif | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Extra libraries to link against | # Extra libraries to link against | ||||
EXTRA_LIBS = ../../plugins/plugins.a | |||||
EXTRA_LIBS += ../rack.a | |||||
RACK_EXTRA_LIBS = ../../plugins/plugins.a | |||||
RACK_EXTRA_LIBS += ../rack.a | |||||
ifneq ($(SYSDEPS),true) | ifneq ($(SYSDEPS),true) | ||||
EXTRA_LIBS += ../Rack/dep/lib/libjansson.a | |||||
EXTRA_LIBS += ../Rack/dep/lib/libsamplerate.a | |||||
EXTRA_LIBS += ../Rack/dep/lib/libspeexdsp.a | |||||
RACK_EXTRA_LIBS += ../Rack/dep/lib/libjansson.a | |||||
RACK_EXTRA_LIBS += ../Rack/dep/lib/libsamplerate.a | |||||
RACK_EXTRA_LIBS += ../Rack/dep/lib/libspeexdsp.a | |||||
ifeq ($(WINDOWS),true) | ifeq ($(WINDOWS),true) | ||||
EXTRA_LIBS += ../Rack/dep/lib/libarchive_static.a | |||||
RACK_EXTRA_LIBS += ../Rack/dep/lib/libarchive_static.a | |||||
else | else | ||||
EXTRA_LIBS += ../Rack/dep/lib/libarchive.a | |||||
RACK_EXTRA_LIBS += ../Rack/dep/lib/libarchive.a | |||||
endif | endif | ||||
EXTRA_LIBS += ../Rack/dep/lib/libzstd.a | |||||
RACK_EXTRA_LIBS += ../Rack/dep/lib/libzstd.a | |||||
endif | endif | ||||
EXTRA_DEPENDENCIES = $(EXTRA_LIBS) | |||||
# -------------------------------------------------------------- | |||||
EXTRA_DEPENDENCIES = $(RACK_EXTRA_LIBS) | |||||
EXTRA_LIBS = $(CARLA_EXTRA_LIBS) $(RACK_EXTRA_LIBS) | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Do some magic | # Do some magic | ||||
@@ -43,6 +43,7 @@ struct CardinalPluginContext : rack::Context { | |||||
bool playing, reset; | bool playing, reset; | ||||
int32_t bar, beat, beatsPerBar; | int32_t bar, beat, beatsPerBar; | ||||
double tick, tickClock, ticksPerBeat, ticksPerClock, ticksPerFrame; | double tick, tickClock, ticksPerBeat, ticksPerClock, ticksPerFrame; | ||||
uintptr_t nativeWindowId; | |||||
Plugin* const plugin; | Plugin* const plugin; | ||||
CardinalPluginContext(Plugin* const p) | CardinalPluginContext(Plugin* const p) | ||||
@@ -58,6 +59,7 @@ struct CardinalPluginContext : rack::Context { | |||||
ticksPerBeat(0.0), | ticksPerBeat(0.0), | ||||
ticksPerClock(0.0), | ticksPerClock(0.0), | ||||
ticksPerFrame(0.0), | ticksPerFrame(0.0), | ||||
nativeWindowId(0), | |||||
plugin(p) | plugin(p) | ||||
{ | { | ||||
std::memset(parameters, 0, sizeof(parameters)); | std::memset(parameters, 0, sizeof(parameters)); | ||||
@@ -82,6 +82,7 @@ | |||||
"version": "2.0", | "version": "2.0", | ||||
"params": [], | "params": [], | ||||
"leftModuleId": 3, | "leftModuleId": 3, | ||||
"rightModuleId": 5, | |||||
"pos": [ | "pos": [ | ||||
21, | 21, | ||||
0 | 0 | ||||
@@ -94,10 +95,23 @@ | |||||
"version": "2.0", | "version": "2.0", | ||||
"params": [], | "params": [], | ||||
"leftModuleId": 4, | "leftModuleId": 4, | ||||
"rightModuleId": 6, | |||||
"pos": [ | "pos": [ | ||||
30, | 30, | ||||
0 | 0 | ||||
] | ] | ||||
}, | |||||
{ | |||||
"id": 6, | |||||
"plugin": "Cardinal", | |||||
"model": "Ildaeil", | |||||
"version": "2.0", | |||||
"params": [], | |||||
"leftModuleId": 4, | |||||
"pos": [ | |||||
38, | |||||
0 | |||||
] | |||||
} | } | ||||
], | ], | ||||
"cables": [], | "cables": [], | ||||