Continue biset changes, plugin-accessible cardinal context

Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
falkTX 2024-04-11 10:34:10 +02:00 committed by Filipe Coelho
parent 8e17cf4ece
commit 7948f66eb4
26 changed files with 223 additions and 259 deletions

View file

@ -101,8 +101,6 @@ void destroyStaticPlugins();
const std::string CARDINAL_VERSION = "24.04";
START_NAMESPACE_DISTRHO
// -----------------------------------------------------------------------------------------------------------
#ifndef HEADLESS
@ -126,6 +124,51 @@ void handleHostParameterDrag(const CardinalPluginContext* pcontext, uint index,
// --------------------------------------------------------------------------------------------------------------------
CardinalPluginContext::CardinalPluginContext(Plugin* const p)
: bufferSize(p != nullptr ? p->getBufferSize() : 0),
processCounter(0),
sampleRate(p != nullptr ? p->getSampleRate() : 0.0),
#if CARDINAL_VARIANT_MAIN
variant(kCardinalVariantMain),
#elif CARDINAL_VARIANT_MINI
variant(kCardinalVariantMini),
#elif CARDINAL_VARIANT_FX
variant(kCardinalVariantFX),
#elif CARDINAL_VARIANT_NATIVE
variant(kCardinalVariantNative),
#elif CARDINAL_VARIANT_SYNTH
variant(kCardinalVariantSynth),
#else
#error cardinal variant not set
#endif
bypassed(false),
playing(false),
reset(false),
bbtValid(false),
bar(1),
beat(1),
beatsPerBar(4),
beatType(4),
frame(0),
barStartTick(0.0),
beatsPerMinute(120.0),
tick(0.0),
tickClock(0.0),
ticksPerBeat(0.0),
ticksPerClock(0.0),
ticksPerFrame(0.0),
nativeWindowId(0),
dataIns(nullptr),
dataOuts(nullptr),
midiEvents(nullptr),
midiEventCount(0),
plugin(p),
tlw(nullptr),
ui(nullptr)
{
std::memset(parameters, 0, sizeof(parameters));
}
#ifndef HEADLESS
bool CardinalPluginContext::addIdleCallback(IdleCallback* const cb) const
{
@ -224,6 +267,86 @@ void CardinalPluginContext::writeMidiMessage(const rack::midi::Message& message,
// -----------------------------------------------------------------------------------------------------------
namespace rack {
namespace midi {
struct InputQueue::Internal {
CardinalPluginContext* const pcontext = static_cast<CardinalPluginContext*>(APP);
const CardinalDISTRHO::MidiEvent* midiEvents = nullptr;
uint32_t midiEventsLeft = 0;
uint32_t lastProcessCounter = 0;
int64_t lastBlockFrame = 0;
};
InputQueue::InputQueue() {
internal = new Internal;
}
InputQueue::~InputQueue() {
delete internal;
}
bool InputQueue::tryPop(Message* const messageOut, int64_t maxFrame)
{
const uint32_t processCounter = internal->pcontext->processCounter;
const bool processCounterChanged = internal->lastProcessCounter != processCounter;
if (processCounterChanged)
{
internal->lastBlockFrame = pcontext->engine->getBlockFrame();
internal->lastProcessCounter = processCounter;
internal->midiEvents = pcontext->midiEvents;
internal->midiEventsLeft = pcontext->midiEventCount;
}
if (internal->midiEventsLeft == 0 || maxFrame < internal->lastBlockFrame)
return false;
const uint32_t frame = maxFrame - internal->lastBlockFrame;
if (frame > internal->midiEvents->frame)
return false;
const CardinalDISTRHO::MidiEvent& midiEvent(*internal->midiEvents);
const uint8_t* data;
if (midiEvent.size > CardinalDISTRHO::MidiEvent::kDataSize)
{
data = midiEvent.dataExt;
messageOut->bytes.resize(midiEvent.size);
}
else
{
data = midiEvent.data;
}
messageOut->frame = frame;
std::memcpy(messageOut->bytes.data(), data, midiEvent.size);
++internal->midiEvents;
--internal->midiEventsLeft;
return true;
}
json_t* InputQueue::toJson() const
{
return nullptr;
}
void InputQueue::fromJson(json_t* rootJ)
{
}
}
}
// -----------------------------------------------------------------------------------------------------------
START_NAMESPACE_DISTRHO
// -----------------------------------------------------------------------------------------------------------
#ifdef HAVE_LIBLO
static void osc_error_handler(int num, const char* msg, const char* path)
{

View file

@ -12,6 +12,8 @@
extern const std::string CARDINAL_VERSION;
struct CardinalPluginContext;
// -----------------------------------------------------------------------------------------------------------
namespace rack {
@ -84,7 +86,6 @@ START_NAMESPACE_DISTRHO
class CardinalBasePlugin;
class CardinalBaseUI;
struct CardinalPluginContext;
struct Initializer
{

View file

@ -36,29 +36,14 @@
#ifndef HEADLESS
# include "DistrhoUI.hpp"
#else
# include "Base.hpp"
START_NAMESPACE_DGL
class TopLevelWidget;
template <class BaseWidget> class NanoBaseWidget;
typedef NanoBaseWidget<TopLevelWidget> NanoTopLevelWidget;
END_NAMESPACE_DGL
#endif
#include "plugincontext.hpp"
START_NAMESPACE_DISTRHO
// -----------------------------------------------------------------------------------------------------------
static constexpr const uint kModuleParameterCount = 24;
enum CardinalVariant {
kCardinalVariantMain,
kCardinalVariantMini,
kCardinalVariantFX,
kCardinalVariantNative,
kCardinalVariantSynth,
};
enum CardinalParameters {
kCardinalParameterCountAtModules = kModuleParameterCount,
kCardinalParameterBypass = kCardinalParameterCountAtModules,
@ -126,82 +111,6 @@ static_assert(kCardinalParameterCountAtWindow == kModuleParameterCount + kWindow
static_assert(DISTRHO_PLUGIN_NUM_INPUTS == kCardinalParameterCountAtMiniBuffers - kCardinalParameterStartMiniBuffers, "valid parameter indexes");
#endif
class UI;
// -----------------------------------------------------------------------------------------------------------
struct CardinalPluginContext : rack::Context {
uint32_t bufferSize, processCounter;
double sampleRate;
float parameters[kModuleParameterCount];
CardinalVariant variant;
bool bypassed, playing, reset, bbtValid;
int32_t bar, beat, beatsPerBar, beatType;
uint64_t frame;
double barStartTick, beatsPerMinute;
double tick, tickClock, ticksPerBeat, ticksPerClock, ticksPerFrame;
uintptr_t nativeWindowId;
const float* const* dataIns;
float** dataOuts;
const MidiEvent* midiEvents;
uint32_t midiEventCount;
Plugin* const plugin;
NanoTopLevelWidget* tlw;
UI* ui;
CardinalPluginContext(Plugin* const p)
: bufferSize(p != nullptr ? p->getBufferSize() : 0),
processCounter(0),
sampleRate(p != nullptr ? p->getSampleRate() : 0.0),
#if CARDINAL_VARIANT_MAIN
variant(kCardinalVariantMain),
#elif CARDINAL_VARIANT_MINI
variant(kCardinalVariantMini),
#elif CARDINAL_VARIANT_FX
variant(kCardinalVariantFX),
#elif CARDINAL_VARIANT_NATIVE
variant(kCardinalVariantNative),
#elif CARDINAL_VARIANT_SYNTH
variant(kCardinalVariantSynth),
#else
#error cardinal variant not set
#endif
bypassed(false),
playing(false),
reset(false),
bbtValid(false),
bar(1),
beat(1),
beatsPerBar(4),
beatType(4),
frame(0),
barStartTick(0.0),
beatsPerMinute(120.0),
tick(0.0),
tickClock(0.0),
ticksPerBeat(0.0),
ticksPerClock(0.0),
ticksPerFrame(0.0),
nativeWindowId(0),
dataIns(nullptr),
dataOuts(nullptr),
midiEvents(nullptr),
midiEventCount(0),
plugin(p),
tlw(nullptr),
ui(nullptr)
{
std::memset(parameters, 0, sizeof(parameters));
}
void writeMidiMessage(const rack::midi::Message& message, uint8_t channel);
#ifndef HEADLESS
bool addIdleCallback(IdleCallback* cb) const;
void removeIdleCallback(IdleCallback* cb) const;
#endif
};
// -----------------------------------------------------------------------------------------------------------
#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS