diff --git a/source/backend/CarlaUtils.cpp b/source/backend/CarlaUtils.cpp index 86620b76f..b7bcb056e 100644 --- a/source/backend/CarlaUtils.cpp +++ b/source/backend/CarlaUtils.cpp @@ -63,6 +63,7 @@ static const NativePluginDescriptor carlaRackDesc = { |NATIVE_PLUGIN_HAS_UI |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD + |NATIVE_PLUGIN_NEEDS_DSP_IDLE |NATIVE_PLUGIN_USES_STATE |NATIVE_PLUGIN_USES_TIME), /* supports */ static_cast(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), @@ -79,7 +80,7 @@ static const NativePluginDescriptor carlaRackDesc = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr }; static const NativePluginDescriptor carlaPatchbayDesc = { @@ -88,6 +89,7 @@ static const NativePluginDescriptor carlaPatchbayDesc = { |NATIVE_PLUGIN_HAS_UI |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD + |NATIVE_PLUGIN_NEEDS_DSP_IDLE |NATIVE_PLUGIN_USES_STATE |NATIVE_PLUGIN_USES_TIME), /* supports */ static_cast(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), @@ -104,7 +106,7 @@ static const NativePluginDescriptor carlaPatchbayDesc = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr }; static const NativePluginDescriptor carlaPatchbay3sDesc = { @@ -113,6 +115,7 @@ static const NativePluginDescriptor carlaPatchbay3sDesc = { |NATIVE_PLUGIN_HAS_UI |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD + |NATIVE_PLUGIN_NEEDS_DSP_IDLE |NATIVE_PLUGIN_USES_STATE |NATIVE_PLUGIN_USES_TIME), /* supports */ static_cast(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), @@ -129,7 +132,7 @@ static const NativePluginDescriptor carlaPatchbay3sDesc = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr }; static const NativePluginDescriptor carlaPatchbay16Desc = { @@ -138,6 +141,7 @@ static const NativePluginDescriptor carlaPatchbay16Desc = { |NATIVE_PLUGIN_HAS_UI |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD + |NATIVE_PLUGIN_NEEDS_DSP_IDLE |NATIVE_PLUGIN_USES_STATE |NATIVE_PLUGIN_USES_TIME), /* supports */ static_cast(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), @@ -154,7 +158,7 @@ static const NativePluginDescriptor carlaPatchbay16Desc = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr }; static const NativePluginDescriptor carlaPatchbay32Desc = { @@ -163,6 +167,7 @@ static const NativePluginDescriptor carlaPatchbay32Desc = { |NATIVE_PLUGIN_HAS_UI |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD + |NATIVE_PLUGIN_NEEDS_DSP_IDLE |NATIVE_PLUGIN_USES_STATE |NATIVE_PLUGIN_USES_TIME), /* supports */ static_cast(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), @@ -179,7 +184,7 @@ static const NativePluginDescriptor carlaPatchbay32Desc = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr }; static LinkedList gPluginDescriptors; diff --git a/source/backend/engine/CarlaEngineBridge.cpp b/source/backend/engine/CarlaEngineBridge.cpp index afd0c79c9..a07a506a0 100644 --- a/source/backend/engine/CarlaEngineBridge.cpp +++ b/source/backend/engine/CarlaEngineBridge.cpp @@ -336,7 +336,7 @@ struct BridgeNonRtServerControl : public CarlaRingBufferControl writeUInt(static_cast(opcode)); } - void waitIfDataIsReachingLimit() const noexcept + void waitIfDataIsReachingLimit() noexcept { if (getAvailableDataSize() < HugeStackBuffer::size/4) return; @@ -344,9 +344,16 @@ struct BridgeNonRtServerControl : public CarlaRingBufferControl for (int i=50; --i >= 0;) { if (getAvailableDataSize() >= HugeStackBuffer::size*3/4) - break; + { + carla_stdout("Client waitIfDataIsReachingLimit() reached and waited successfully"); + writeOpcode(kPluginBridgeNonRtServerPong); + commitWrite(); + return; + } carla_msleep(20); } + + carla_stderr("Client waitIfDataIsReachingLimit() reached and failed"); } CARLA_DECLARE_NON_COPY_STRUCT(BridgeNonRtServerControl) diff --git a/source/backend/engine/CarlaEngineNative.cpp b/source/backend/engine/CarlaEngineNative.cpp index d23cda0d8..8f2360ad1 100644 --- a/source/backend/engine/CarlaEngineNative.cpp +++ b/source/backend/engine/CarlaEngineNative.cpp @@ -1445,7 +1445,6 @@ protected: void uiIdle() { - CarlaEngine::idle(); fUiServer.idlePipe(); if (fUiServer.isPipeRunning()) @@ -1580,6 +1579,11 @@ public: delete handlePtr; } + static void _idle(NativePluginHandle handle) + { + handlePtr->idle(); + } + static uint32_t _get_parameter_count(NativePluginHandle handle) { return handlePtr->getParameterCount(); @@ -1729,6 +1733,7 @@ static const NativePluginDescriptor carlaRackDesc = { |NATIVE_PLUGIN_HAS_UI |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD + |NATIVE_PLUGIN_NEEDS_DSP_IDLE |NATIVE_PLUGIN_USES_STATE |NATIVE_PLUGIN_USES_TIME), /* supports */ static_cast(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), @@ -1744,6 +1749,7 @@ static const NativePluginDescriptor carlaRackDesc = { /* copyright */ "GNU GPL v2+", CarlaEngineNative::_instantiateRack, CarlaEngineNative::_cleanup, + CarlaEngineNative::_idle, CarlaEngineNative::_get_parameter_count, CarlaEngineNative::_get_parameter_info, CarlaEngineNative::_get_parameter_value, @@ -1772,6 +1778,7 @@ static const NativePluginDescriptor carlaPatchbayDesc = { |NATIVE_PLUGIN_HAS_UI |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD + |NATIVE_PLUGIN_NEEDS_DSP_IDLE |NATIVE_PLUGIN_USES_STATE |NATIVE_PLUGIN_USES_TIME), /* supports */ static_cast(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), @@ -1787,6 +1794,7 @@ static const NativePluginDescriptor carlaPatchbayDesc = { /* copyright */ "GNU GPL v2+", CarlaEngineNative::_instantiatePatchbay, CarlaEngineNative::_cleanup, + CarlaEngineNative::_idle, CarlaEngineNative::_get_parameter_count, CarlaEngineNative::_get_parameter_info, CarlaEngineNative::_get_parameter_value, @@ -1815,6 +1823,7 @@ static const NativePluginDescriptor carlaPatchbay3sDesc = { |NATIVE_PLUGIN_HAS_UI |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD + |NATIVE_PLUGIN_NEEDS_DSP_IDLE |NATIVE_PLUGIN_USES_STATE |NATIVE_PLUGIN_USES_TIME), /* supports */ static_cast(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), @@ -1830,6 +1839,7 @@ static const NativePluginDescriptor carlaPatchbay3sDesc = { /* copyright */ "GNU GPL v2+", CarlaEngineNative::_instantiatePatchbay3s, CarlaEngineNative::_cleanup, + CarlaEngineNative::_idle, CarlaEngineNative::_get_parameter_count, CarlaEngineNative::_get_parameter_info, CarlaEngineNative::_get_parameter_value, @@ -1858,6 +1868,7 @@ static const NativePluginDescriptor carlaPatchbay16Desc = { |NATIVE_PLUGIN_HAS_UI |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD + |NATIVE_PLUGIN_NEEDS_DSP_IDLE |NATIVE_PLUGIN_USES_STATE |NATIVE_PLUGIN_USES_TIME), /* supports */ static_cast(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), @@ -1873,6 +1884,7 @@ static const NativePluginDescriptor carlaPatchbay16Desc = { /* copyright */ "GNU GPL v2+", CarlaEngineNative::_instantiatePatchbay16, CarlaEngineNative::_cleanup, + CarlaEngineNative::_idle, CarlaEngineNative::_get_parameter_count, CarlaEngineNative::_get_parameter_info, CarlaEngineNative::_get_parameter_value, @@ -1901,6 +1913,7 @@ static const NativePluginDescriptor carlaPatchbay32Desc = { |NATIVE_PLUGIN_HAS_UI |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD + |NATIVE_PLUGIN_NEEDS_DSP_IDLE |NATIVE_PLUGIN_USES_STATE |NATIVE_PLUGIN_USES_TIME), /* supports */ static_cast(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), @@ -1916,6 +1929,7 @@ static const NativePluginDescriptor carlaPatchbay32Desc = { /* copyright */ "GNU GPL v2+", CarlaEngineNative::_instantiatePatchbay32, CarlaEngineNative::_cleanup, + CarlaEngineNative::_idle, CarlaEngineNative::_get_parameter_count, CarlaEngineNative::_get_parameter_info, CarlaEngineNative::_get_parameter_value, diff --git a/source/backend/plugin/CarlaPluginBridge.cpp b/source/backend/plugin/CarlaPluginBridge.cpp index abd456ab0..4b7903f75 100644 --- a/source/backend/plugin/CarlaPluginBridge.cpp +++ b/source/backend/plugin/CarlaPluginBridge.cpp @@ -353,6 +353,26 @@ struct BridgeNonRtClientControl : public CarlaRingBufferControl writeUInt(static_cast(opcode)); } + void waitIfDataIsReachingLimit() noexcept + { + if (getAvailableDataSize() < BigStackBuffer::size/4) + return; + + for (int i=50; --i >= 0;) + { + if (getAvailableDataSize() >= BigStackBuffer::size*3/4) + { + carla_stdout("Server waitIfDataIsReachingLimit() reached and waited successfully"); + writeOpcode(kPluginBridgeNonRtClientPing); + commitWrite(); + return; + } + carla_msleep(20); + } + + carla_stderr("Server waitIfDataIsReachingLimit() reached and failed"); + } + CARLA_DECLARE_NON_COPY_STRUCT(BridgeNonRtClientControl) }; @@ -967,6 +987,7 @@ public: fShmNonRtClientControl.writeUInt(parameterId); fShmNonRtClientControl.writeFloat(value); fShmNonRtClientControl.commitWrite(); + fShmNonRtClientControl.waitIfDataIsReachingLimit(); } CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); diff --git a/source/backend/plugin/CarlaPluginNative.cpp b/source/backend/plugin/CarlaPluginNative.cpp index 98995c8f0..4c691afa0 100644 --- a/source/backend/plugin/CarlaPluginNative.cpp +++ b/source/backend/plugin/CarlaPluginNative.cpp @@ -771,6 +771,9 @@ public: CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); + if (fDescriptor->idle != nullptr && (fDescriptor->hints & ::NATIVE_PLUGIN_NEEDS_DSP_IDLE) != 0) + fDescriptor->idle(fHandle); + if (fIsUiVisible && fDescriptor->ui_idle != nullptr) fDescriptor->ui_idle(fHandle); diff --git a/source/includes/CarlaNative.h b/source/includes/CarlaNative.h index 632f40f31..6460180a5 100644 --- a/source/includes/CarlaNative.h +++ b/source/includes/CarlaNative.h @@ -58,12 +58,13 @@ typedef enum { NATIVE_PLUGIN_HAS_UI = 1 << 2, NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS = 1 << 3, NATIVE_PLUGIN_NEEDS_SINGLE_THREAD = 1 << 4, - NATIVE_PLUGIN_NEEDS_UI_OPEN_SAVE = 1 << 5, - NATIVE_PLUGIN_USES_MULTI_PROGS = 1 << 6, /** has 1 patch per midi channel */ - NATIVE_PLUGIN_USES_PANNING = 1 << 7, /** uses stereo balance if unset (default) */ - NATIVE_PLUGIN_USES_STATE = 1 << 8, - NATIVE_PLUGIN_USES_TIME = 1 << 9, - NATIVE_PLUGIN_USES_PARENT_ID = 1 << 10 /** can set transient hint to parent */ + NATIVE_PLUGIN_NEEDS_DSP_IDLE = 1 << 5, + NATIVE_PLUGIN_NEEDS_UI_OPEN_SAVE = 1 << 6, + NATIVE_PLUGIN_USES_MULTI_PROGS = 1 << 7, /** has 1 patch per midi channel */ + NATIVE_PLUGIN_USES_PANNING = 1 << 8, /** uses stereo balance if unset (default) */ + NATIVE_PLUGIN_USES_STATE = 1 << 9, + NATIVE_PLUGIN_USES_TIME = 1 << 10, + NATIVE_PLUGIN_USES_PARENT_ID = 1 << 11 /** can set transient hint to parent */ } NativePluginHints; typedef enum { @@ -220,6 +221,7 @@ typedef struct _NativePluginDescriptor { NativePluginHandle (*instantiate)(const NativeHostDescriptor* host); void (*cleanup)(NativePluginHandle handle); + void (*idle)(NativePluginHandle handle); uint32_t (*get_parameter_count)(NativePluginHandle handle); const NativeParameter* (*get_parameter_info)(NativePluginHandle handle, uint32_t index); diff --git a/source/includes/CarlaNative.hpp b/source/includes/CarlaNative.hpp index 8ef9a6d21..18161ae46 100644 --- a/source/includes/CarlaNative.hpp +++ b/source/includes/CarlaNative.hpp @@ -208,6 +208,10 @@ protected: pHost->dispatcher(pHost->handle, NATIVE_HOST_OPCODE_UI_UNAVAILABLE, 0, 0, nullptr, 0.0f); } + // ------------------------------------------------------------------- + + virtual void idle() {} + // ------------------------------------------------------------------- // Plugin parameter calls @@ -382,6 +386,11 @@ private: public: #define handlePtr ((NativePluginClass*)handle) + static void _idle(NativePluginHandle handle) + { + handlePtr->idle(); + } + static uint32_t _get_parameter_count(NativePluginHandle handle) { return handlePtr->getParameterCount(); @@ -530,6 +539,7 @@ public: \ #define PluginDescriptorFILL(ClassName) \ ClassName::_instantiate, \ ClassName::_cleanup, \ + ClassName::_idle, \ ClassName::_get_parameter_count, \ ClassName::_get_parameter_info, \ ClassName::_get_parameter_value, \ diff --git a/source/plugin/carla-vst.cpp b/source/plugin/carla-vst.cpp index 21614e431..09aa22333 100644 --- a/source/plugin/carla-vst.cpp +++ b/source/plugin/carla-vst.cpp @@ -184,6 +184,11 @@ public: switch (opcode) { + case effIdle: + if (fDescriptor->idle != nullptr) + fDescriptor->idle(fHandle); + break; + case effSetSampleRate: if (carla_compareFloats(fSampleRate, static_cast(opt))) return 0; @@ -210,7 +215,8 @@ public: fMidiEventCount = 0; carla_zeroStruct(fTimeInfo); - // tell host we want MIDI events + // tell host we want idle and MIDI events + fAudioMaster(fEffect, audioMasterNeedIdle, 0, 0, nullptr, 0.0f); fAudioMaster(fEffect, audioMasterWantMidi, 0, 0, nullptr, 0.0f); CARLA_SAFE_ASSERT_BREAK(! fIsActive);