Continue biset changes, plugin-accessible cardinal context
Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
parent
8e17cf4ece
commit
7948f66eb4
26 changed files with 223 additions and 259 deletions
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue