DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

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:
Mdistrho/src/DistrhoPluginJack.cpp | 45+++++++++++++++++++++++++++++++++++++++++++--
Mdistrho/src/DistrhoUIInternal.hpp | 20++++++++++----------
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