commit cc30a221c7f5924752b8c03c6e24aed0b3d841d9
parent fe68e6ac98da35c5acdbaf4fc19a48014f49827e
Author: falkTX <falktx@gmail.com>
Date: Mon, 26 May 2014 00:26:03 +0100
Update parameter outputs in JACK targets
Diffstat:
2 files changed, 53 insertions(+), 12 deletions(-)
diff --git a/distrho/src/DistrhoPluginJack.cpp b/distrho/src/DistrhoPluginJack.cpp
@@ -36,7 +36,7 @@ static const setStateFunc setStateCallback = nullptr;
// -----------------------------------------------------------------------
-class PluginJack
+class PluginJack : public IdleCallback
{
public:
PluginJack(jack_client_t* const client)
@@ -67,6 +67,23 @@ public:
fPortMidiIn = jack_port_register(fClient, "midi-in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
#endif
+ if (const uint32_t count = fPlugin.getParameterCount())
+ {
+ fLastOutputValues = new float[count];
+
+ for (uint32_t i=0; i < count; ++i)
+ {
+ if (fPlugin.isParameterOutput(i))
+ fLastOutputValues[i] = fPlugin.getParameterValue(i);
+ else
+ fLastOutputValues[i] = 0.0f;
+ }
+ }
+ else
+ {
+ fLastOutputValues = nullptr;
+ }
+
jack_set_buffer_size_callback(fClient, jackBufferSizeCallback, this);
jack_set_sample_rate_callback(fClient, jackSampleRateCallback, this);
jack_set_process_callback(fClient, jackProcessCallback, this);
@@ -79,7 +96,7 @@ public:
else
fUI.setTitle(DISTRHO_PLUGIN_NAME);
- fUI.exec();
+ fUI.exec(this);
}
~PluginJack()
@@ -116,6 +133,27 @@ public:
// -------------------------------------------------------------------
protected:
+ void idleCallback() override
+ {
+ float value;
+
+ for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i)
+ {
+ if (! fPlugin.isParameterOutput(i))
+ continue;
+
+ value = fPlugin.getParameterValue(i);
+
+ if (fLastOutputValues[i] == value)
+ continue;
+
+ fLastOutputValues[i] = value;
+ fUI.parameterChanged(i, value);
+ }
+
+ fUI.exec_idle();
+ }
+
void jackBufferSize(const jack_nframes_t nframes)
{
fPlugin.setBufferSize(nframes, true);
@@ -266,6 +304,9 @@ private:
TimePos fTimePos;
#endif
+ // Temporary data
+ float* fLastOutputValues;
+
// -------------------------------------------------------------------
// Callbacks
diff --git a/distrho/src/DistrhoUIInternal.hpp b/distrho/src/DistrhoUIInternal.hpp
@@ -175,7 +175,7 @@ private:
// -----------------------------------------------------------------------
// UI exporter class
-class UIExporter : public IdleCallback
+class UIExporter
{
public:
UIExporter(void* const ptr, const intptr_t winId,
@@ -267,15 +267,22 @@ public:
// -------------------------------------------------------------------
- void exec()
+ void exec(IdleCallback* const cb)
{
+ DISTRHO_SAFE_ASSERT_RETURN(cb != nullptr,);
DISTRHO_SAFE_ASSERT_RETURN(fUi != nullptr,);
- glWindow.addIdleCallback(this);
+ glWindow.addIdleCallback(cb);
glWindow.setVisible(true);
glApp.exec();
}
+ void exec_idle()
+ {
+ if (glWindow.isReady())
+ fUi->d_uiIdle();
+ }
+
bool idle()
{
DISTRHO_SAFE_ASSERT_RETURN(fUi != nullptr, false);
@@ -321,13 +328,6 @@ public:
return ! glApp.isQuiting();
}
-protected:
- void idleCallback() override
- {
- if (glWindow.isReady())
- fUi->d_uiIdle();
- }
-
private:
// -------------------------------------------------------------------
// DGL Application and Window for this widget