Store entire time info in context; More ImGui/Ildaeil fixups
Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
parent
a6a4745186
commit
af80d41aef
5 changed files with 68 additions and 30 deletions
|
|
@ -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.frame = pcontext->frame;
|
||||||
// fCarlaTimeInfo.bbt.valid = timePos.bbt.valid;
|
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->pcontext == nullptr || module->fCarlaHostHandle == nullptr)
|
||||||
if (module == 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),
|
if (module != nullptr && module->pcontext != nullptr)
|
||||||
reinterpret_cast<CardinalPluginContext*>(APP)->nativeWindowId);
|
{
|
||||||
ildaeilWidget->box.pos = Vec(2 * RACK_GRID_WIDTH, 0);
|
ildaeilWidget = new IldaeilWidget(module);
|
||||||
ildaeilWidget->box.size = Vec(box.size.x - 2 * RACK_GRID_WIDTH, box.size.y);
|
ildaeilWidget->box.pos = Vec(2 * RACK_GRID_WIDTH, 0);
|
||||||
addChild(ildaeilWidget);
|
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);
|
if (imData->created)
|
||||||
ImGui_ImplOpenGL2_Shutdown();
|
{
|
||||||
|
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;
|
bool playing, reset, bbtValid;
|
||||||
int32_t bar, beat, beatsPerBar;
|
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;
|
bool playing, reset, bbtValid;
|
||||||
int32_t bar, beat, beatsPerBar;
|
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),
|
bbtValid(false),
|
||||||
beat(0),
|
bar(1),
|
||||||
beatsPerBar(0),
|
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),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue