Signed-off-by: falkTX <falktx@falktx.com>tags/22.02
@@ -89,6 +89,8 @@ struct IldaeilModule : Module { | |||||
NUM_LIGHTS | NUM_LIGHTS | ||||
}; | }; | ||||
CardinalPluginContext* const pcontext; | |||||
const NativePluginDescriptor* fCarlaPluginDescriptor = nullptr; | const NativePluginDescriptor* fCarlaPluginDescriptor = nullptr; | ||||
NativePluginHandle fCarlaPluginHandle = nullptr; | NativePluginHandle fCarlaPluginHandle = nullptr; | ||||
@@ -107,6 +109,7 @@ struct IldaeilModule : Module { | |||||
unsigned audioDataFill = 0; | unsigned audioDataFill = 0; | ||||
IldaeilModule() | IldaeilModule() | ||||
: pcontext(reinterpret_cast<CardinalPluginContext*>(APP)) | |||||
{ | { | ||||
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); | ||||
@@ -172,19 +175,19 @@ struct IldaeilModule : Module { | |||||
const NativeTimeInfo* hostGetTimeInfo() const noexcept | const NativeTimeInfo* hostGetTimeInfo() const noexcept | ||||
{ | { | ||||
if (CardinalPluginContext* const pcontext = reinterpret_cast<CardinalPluginContext*>(APP)) | |||||
if (pcontext != nullptr) | |||||
{ | { | ||||
fCarlaTimeInfo.playing = pcontext->playing; | fCarlaTimeInfo.playing = pcontext->playing; | ||||
// fCarlaTimeInfo.frame = timePos.frame; | |||||
// fCarlaTimeInfo.bbt.valid = timePos.bbt.valid; | |||||
fCarlaTimeInfo.frame = pcontext->frame; | |||||
fCarlaTimeInfo.bbt.valid = pcontext->bbtValid; | |||||
fCarlaTimeInfo.bbt.bar = pcontext->bar; | fCarlaTimeInfo.bbt.bar = pcontext->bar; | ||||
fCarlaTimeInfo.bbt.beat = pcontext->beat; | fCarlaTimeInfo.bbt.beat = pcontext->beat; | ||||
fCarlaTimeInfo.bbt.tick = pcontext->tick; | fCarlaTimeInfo.bbt.tick = pcontext->tick; | ||||
// fCarlaTimeInfo.bbt.barStartTick = timePos.bbt.barStartTick; | |||||
fCarlaTimeInfo.bbt.barStartTick = pcontext->barStartTick; | |||||
fCarlaTimeInfo.bbt.beatsPerBar = pcontext->beatsPerBar; | fCarlaTimeInfo.bbt.beatsPerBar = pcontext->beatsPerBar; | ||||
// fCarlaTimeInfo.bbt.beatType = timePos.bbt.beatType; | |||||
fCarlaTimeInfo.bbt.beatType = pcontext->beatType; | |||||
fCarlaTimeInfo.bbt.ticksPerBeat = pcontext->ticksPerBeat; | fCarlaTimeInfo.bbt.ticksPerBeat = pcontext->ticksPerBeat; | ||||
// fCarlaTimeInfo.bbt.beatsPerMinute = timePos.bbt.beatsPerMinute; | |||||
fCarlaTimeInfo.bbt.beatsPerMinute = pcontext->beatsPerMinute; | |||||
} | } | ||||
return &fCarlaTimeInfo; | return &fCarlaTimeInfo; | ||||
@@ -405,7 +408,7 @@ struct IldaeilWidget : ImGuiWidget, Thread { | |||||
IldaeilModule* const module; | IldaeilModule* const module; | ||||
IldaeilWidget(IldaeilModule* const m, const uintptr_t nativeWindowId) | |||||
IldaeilWidget(IldaeilModule* const m) | |||||
: ImGuiWidget(), | : ImGuiWidget(), | ||||
module(m) | module(m) | ||||
{ | { | ||||
@@ -424,7 +427,7 @@ struct IldaeilWidget : ImGuiWidget, Thread { | |||||
const CarlaHostHandle handle = module->fCarlaHostHandle; | const CarlaHostHandle handle = module->fCarlaHostHandle; | ||||
char winIdStr[24]; | char winIdStr[24]; | ||||
std::snprintf(winIdStr, sizeof(winIdStr), "%lx", (ulong)nativeWindowId); | |||||
std::snprintf(winIdStr, sizeof(winIdStr), "%lx", (ulong)module->pcontext->nativeWindowId); | |||||
carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, winIdStr); | carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, winIdStr); | ||||
/* | /* | ||||
carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_UI_SCALE, getScaleFactor()*1000, nullptr); | carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_UI_SCALE, getScaleFactor()*1000, nullptr); | ||||
@@ -626,21 +629,18 @@ struct IldaeilWidget : ImGuiWidget, Thread { | |||||
{ | { | ||||
ImGuiWidget::onContextCreate(e); | ImGuiWidget::onContextCreate(e); | ||||
/* | |||||
if (module == nullptr || module->fCarlaHostHandle == nullptr) | |||||
if (module == nullptr || module->pcontext == nullptr || module->fCarlaHostHandle == nullptr) | |||||
return; | return; | ||||
*/ | |||||
const uintptr_t nativeWindowId = reinterpret_cast<CardinalPluginContext*>(APP)->nativeWindowId; | |||||
char winIdStr[24]; | char winIdStr[24]; | ||||
std::snprintf(winIdStr, sizeof(winIdStr), "%lx", (ulong)nativeWindowId); | |||||
std::snprintf(winIdStr, sizeof(winIdStr), "%lx", (ulong)module->pcontext->nativeWindowId); | |||||
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, winIdStr); | carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, winIdStr); | ||||
} | } | ||||
void onContextDestroy(const ContextDestroyEvent& e) override | void onContextDestroy(const ContextDestroyEvent& e) override | ||||
{ | { | ||||
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0"); | |||||
if (module != nullptr && module->fCarlaHostHandle != nullptr) | |||||
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0"); | |||||
ImGuiWidget::onContextDestroy(e); | ImGuiWidget::onContextDestroy(e); | ||||
} | } | ||||
@@ -1122,11 +1122,13 @@ struct IldaeilModuleWidget : ModuleWidget { | |||||
setModule(module); | setModule(module); | ||||
setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/glBars.svg"))); | setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/glBars.svg"))); | ||||
ildaeilWidget = new IldaeilWidget(static_cast<IldaeilModule*>(module), | |||||
reinterpret_cast<CardinalPluginContext*>(APP)->nativeWindowId); | |||||
ildaeilWidget->box.pos = Vec(2 * RACK_GRID_WIDTH, 0); | |||||
ildaeilWidget->box.size = Vec(box.size.x - 2 * RACK_GRID_WIDTH, box.size.y); | |||||
addChild(ildaeilWidget); | |||||
if (module != nullptr && module->pcontext != nullptr) | |||||
{ | |||||
ildaeilWidget = new IldaeilWidget(module); | |||||
ildaeilWidget->box.pos = Vec(2 * RACK_GRID_WIDTH, 0); | |||||
ildaeilWidget->box.size = Vec(box.size.x - 2 * RACK_GRID_WIDTH, box.size.y); | |||||
addChild(ildaeilWidget); | |||||
} | |||||
addChild(createWidget<ScrewSilver>(Vec(0, 0))); | addChild(createWidget<ScrewSilver>(Vec(0, 0))); | ||||
addChild(createWidget<ScrewSilver>(Vec(0, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); | addChild(createWidget<ScrewSilver>(Vec(0, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); | ||||
@@ -16,6 +16,7 @@ | |||||
*/ | */ | ||||
#include "ImGuiWidget.hpp" | #include "ImGuiWidget.hpp" | ||||
#include "DistrhoUtils.hpp" | |||||
#ifndef DGL_NO_SHARED_RESOURCES | #ifndef DGL_NO_SHARED_RESOURCES | ||||
# include "../../../dpf/dgl/src/Resources.hpp" | # include "../../../dpf/dgl/src/Resources.hpp" | ||||
@@ -24,12 +25,14 @@ | |||||
#include "DearImGui/imgui_impl_opengl2.h" | #include "DearImGui/imgui_impl_opengl2.h" | ||||
struct ImGuiWidget::PrivateData { | struct ImGuiWidget::PrivateData { | ||||
ImGuiContext* context; | |||||
ImGuiContext* context = nullptr; | |||||
bool created = false; | |||||
PrivateData(const double scaleFactor = 1.0) | PrivateData(const double scaleFactor = 1.0) | ||||
{ | { | ||||
IMGUI_CHECKVERSION(); | IMGUI_CHECKVERSION(); | ||||
context = ImGui::CreateContext(); | context = ImGui::CreateContext(); | ||||
ImGui::SetCurrentContext(context); | |||||
ImGuiIO& io(ImGui::GetIO()); | ImGuiIO& io(ImGui::GetIO()); | ||||
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; | io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; | ||||
@@ -77,6 +80,13 @@ struct ImGuiWidget::PrivateData { | |||||
~PrivateData() | ~PrivateData() | ||||
{ | { | ||||
// this should not happen | |||||
if (created) | |||||
{ | |||||
ImGui::SetCurrentContext(context); | |||||
ImGui_ImplOpenGL2_Shutdown(); | |||||
} | |||||
ImGui::DestroyContext(context); | ImGui::DestroyContext(context); | ||||
} | } | ||||
}; | }; | ||||
@@ -92,15 +102,21 @@ ImGuiWidget::~ImGuiWidget() | |||||
void ImGuiWidget::onContextCreate(const ContextCreateEvent& e) | void ImGuiWidget::onContextCreate(const ContextCreateEvent& e) | ||||
{ | { | ||||
OpenGlWidget::onContextCreate(e); | OpenGlWidget::onContextCreate(e); | ||||
DISTRHO_SAFE_ASSERT_RETURN(!imData->created,); | |||||
ImGui::SetCurrentContext(imData->context); | ImGui::SetCurrentContext(imData->context); | ||||
ImGui_ImplOpenGL2_Init(); | ImGui_ImplOpenGL2_Init(); | ||||
imData->created = true; | |||||
} | } | ||||
void ImGuiWidget::onContextDestroy(const ContextDestroyEvent& e) | void ImGuiWidget::onContextDestroy(const ContextDestroyEvent& e) | ||||
{ | { | ||||
ImGui::SetCurrentContext(imData->context); | |||||
ImGui_ImplOpenGL2_Shutdown(); | |||||
if (imData->created) | |||||
{ | |||||
ImGui::SetCurrentContext(imData->context); | |||||
ImGui_ImplOpenGL2_Shutdown(); | |||||
imData->created = false; | |||||
} | |||||
OpenGlWidget::onContextDestroy(e); | OpenGlWidget::onContextDestroy(e); | ||||
} | } | ||||
@@ -115,6 +131,12 @@ void ImGuiWidget::drawFramebuffer() | |||||
io.DisplayFramebufferScale = ImVec2(fbSize.x / box.size.x, fbSize.y / box.size.y); | io.DisplayFramebufferScale = ImVec2(fbSize.x / box.size.x, fbSize.y / box.size.y); | ||||
io.DisplaySize = ImVec2(box.size.x, box.size.y); | io.DisplaySize = ImVec2(box.size.x, box.size.y); | ||||
if (!imData->created) | |||||
{ | |||||
ImGui_ImplOpenGL2_Init(); | |||||
imData->created = true; | |||||
} | |||||
// TODO io.DeltaTime | // TODO io.DeltaTime | ||||
ImGui_ImplOpenGL2_NewFrame(); | ImGui_ImplOpenGL2_NewFrame(); | ||||
@@ -33,8 +33,10 @@ struct CardinalPluginContext : rack::Context { | |||||
uint32_t bufferSize; | uint32_t bufferSize; | ||||
double sampleRate; | double sampleRate; | ||||
float parameters[kModuleParameters]; | float parameters[kModuleParameters]; | ||||
bool playing, reset; | |||||
int32_t bar, beat, beatsPerBar; | |||||
bool playing, reset, bbtValid; | |||||
int32_t bar, beat, beatsPerBar, beatType; | |||||
uint64_t frame; | |||||
double barStartTick, beatsPerMinute; | |||||
double tick, tickClock, ticksPerBeat, ticksPerClock, ticksPerFrame; | double tick, tickClock, ticksPerBeat, ticksPerClock, ticksPerFrame; | ||||
uintptr_t nativeWindowId; | uintptr_t nativeWindowId; | ||||
Plugin* const plugin; | Plugin* const plugin; | ||||
@@ -818,6 +818,8 @@ protected: | |||||
{ | { | ||||
const TimePosition& timePos(getTimePosition()); | const TimePosition& timePos(getTimePosition()); | ||||
context->playing = timePos.playing; | context->playing = timePos.playing; | ||||
context->bbtValid = timePos.bbt.valid; | |||||
context->frame = timePos.frame; | |||||
if (timePos.bbt.valid) | if (timePos.bbt.valid) | ||||
{ | { | ||||
@@ -827,6 +829,9 @@ protected: | |||||
context->bar = timePos.bbt.bar; | context->bar = timePos.bbt.bar; | ||||
context->beat = timePos.bbt.beat; | context->beat = timePos.bbt.beat; | ||||
context->beatsPerBar = timePos.bbt.beatsPerBar; | context->beatsPerBar = timePos.bbt.beatsPerBar; | ||||
context->beatType = timePos.bbt.beatType; | |||||
context->barStartTick = timePos.bbt.barStartTick; | |||||
context->beatsPerMinute = timePos.bbt.beatsPerMinute; | |||||
context->tick = timePos.bbt.tick; | context->tick = timePos.bbt.tick; | ||||
context->ticksPerBeat = timePos.bbt.ticksPerBeat; | context->ticksPerBeat = timePos.bbt.ticksPerBeat; | ||||
context->ticksPerClock = timePos.bbt.ticksPerBeat / timePos.bbt.beatType; | context->ticksPerClock = timePos.bbt.ticksPerBeat / timePos.bbt.beatType; | ||||
@@ -40,8 +40,10 @@ struct CardinalPluginContext : rack::Context { | |||||
uint32_t bufferSize; | uint32_t bufferSize; | ||||
double sampleRate; | double sampleRate; | ||||
float parameters[kModuleParameters]; | float parameters[kModuleParameters]; | ||||
bool playing, reset; | |||||
int32_t bar, beat, beatsPerBar; | |||||
bool playing, reset, bbtValid; | |||||
int32_t bar, beat, beatsPerBar, beatType; | |||||
uint64_t frame; | |||||
double barStartTick, beatsPerMinute; | |||||
double tick, tickClock, ticksPerBeat, ticksPerClock, ticksPerFrame; | double tick, tickClock, ticksPerBeat, ticksPerClock, ticksPerFrame; | ||||
uintptr_t nativeWindowId; | uintptr_t nativeWindowId; | ||||
Plugin* const plugin; | Plugin* const plugin; | ||||
@@ -51,9 +53,14 @@ struct CardinalPluginContext : rack::Context { | |||||
sampleRate(p->getSampleRate()), | sampleRate(p->getSampleRate()), | ||||
playing(false), | playing(false), | ||||
reset(false), | reset(false), | ||||
bar(0), | |||||
beat(0), | |||||
beatsPerBar(0), | |||||
bbtValid(false), | |||||
bar(1), | |||||
beat(1), | |||||
beatsPerBar(4), | |||||
beatType(4), | |||||
frame(0), | |||||
barStartTick(0.0), | |||||
beatsPerMinute(120.0), | |||||
tick(0.0), | tick(0.0), | ||||
tickClock(0.0), | tickClock(0.0), | ||||
ticksPerBeat(0.0), | ticksPerBeat(0.0), | ||||