| @@ -63,6 +63,7 @@ static const NativePluginDescriptor carlaRackDesc = { | |||||
| |NATIVE_PLUGIN_HAS_UI | |NATIVE_PLUGIN_HAS_UI | ||||
| |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | ||||
| |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | ||||
| |NATIVE_PLUGIN_NEEDS_DSP_IDLE | |||||
| |NATIVE_PLUGIN_USES_STATE | |NATIVE_PLUGIN_USES_STATE | ||||
| |NATIVE_PLUGIN_USES_TIME), | |NATIVE_PLUGIN_USES_TIME), | ||||
| /* supports */ static_cast<NativePluginSupports>(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), | /* supports */ static_cast<NativePluginSupports>(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, nullptr, nullptr, nullptr, | nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | ||||
| nullptr, nullptr, nullptr, nullptr, | |||||
| nullptr, nullptr, nullptr, nullptr, nullptr | |||||
| }; | }; | ||||
| static const NativePluginDescriptor carlaPatchbayDesc = { | static const NativePluginDescriptor carlaPatchbayDesc = { | ||||
| @@ -88,6 +89,7 @@ static const NativePluginDescriptor carlaPatchbayDesc = { | |||||
| |NATIVE_PLUGIN_HAS_UI | |NATIVE_PLUGIN_HAS_UI | ||||
| |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | ||||
| |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | ||||
| |NATIVE_PLUGIN_NEEDS_DSP_IDLE | |||||
| |NATIVE_PLUGIN_USES_STATE | |NATIVE_PLUGIN_USES_STATE | ||||
| |NATIVE_PLUGIN_USES_TIME), | |NATIVE_PLUGIN_USES_TIME), | ||||
| /* supports */ static_cast<NativePluginSupports>(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), | /* supports */ static_cast<NativePluginSupports>(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, nullptr, nullptr, nullptr, | nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | ||||
| nullptr, nullptr, nullptr, nullptr, | |||||
| nullptr, nullptr, nullptr, nullptr, nullptr | |||||
| }; | }; | ||||
| static const NativePluginDescriptor carlaPatchbay3sDesc = { | static const NativePluginDescriptor carlaPatchbay3sDesc = { | ||||
| @@ -113,6 +115,7 @@ static const NativePluginDescriptor carlaPatchbay3sDesc = { | |||||
| |NATIVE_PLUGIN_HAS_UI | |NATIVE_PLUGIN_HAS_UI | ||||
| |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | ||||
| |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | ||||
| |NATIVE_PLUGIN_NEEDS_DSP_IDLE | |||||
| |NATIVE_PLUGIN_USES_STATE | |NATIVE_PLUGIN_USES_STATE | ||||
| |NATIVE_PLUGIN_USES_TIME), | |NATIVE_PLUGIN_USES_TIME), | ||||
| /* supports */ static_cast<NativePluginSupports>(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), | /* supports */ static_cast<NativePluginSupports>(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, nullptr, nullptr, nullptr, | nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | ||||
| nullptr, nullptr, nullptr, nullptr, | |||||
| nullptr, nullptr, nullptr, nullptr, nullptr | |||||
| }; | }; | ||||
| static const NativePluginDescriptor carlaPatchbay16Desc = { | static const NativePluginDescriptor carlaPatchbay16Desc = { | ||||
| @@ -138,6 +141,7 @@ static const NativePluginDescriptor carlaPatchbay16Desc = { | |||||
| |NATIVE_PLUGIN_HAS_UI | |NATIVE_PLUGIN_HAS_UI | ||||
| |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | ||||
| |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | ||||
| |NATIVE_PLUGIN_NEEDS_DSP_IDLE | |||||
| |NATIVE_PLUGIN_USES_STATE | |NATIVE_PLUGIN_USES_STATE | ||||
| |NATIVE_PLUGIN_USES_TIME), | |NATIVE_PLUGIN_USES_TIME), | ||||
| /* supports */ static_cast<NativePluginSupports>(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), | /* supports */ static_cast<NativePluginSupports>(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, nullptr, nullptr, nullptr, | nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | ||||
| nullptr, nullptr, nullptr, nullptr, | |||||
| nullptr, nullptr, nullptr, nullptr, nullptr | |||||
| }; | }; | ||||
| static const NativePluginDescriptor carlaPatchbay32Desc = { | static const NativePluginDescriptor carlaPatchbay32Desc = { | ||||
| @@ -163,6 +167,7 @@ static const NativePluginDescriptor carlaPatchbay32Desc = { | |||||
| |NATIVE_PLUGIN_HAS_UI | |NATIVE_PLUGIN_HAS_UI | ||||
| |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | ||||
| |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | ||||
| |NATIVE_PLUGIN_NEEDS_DSP_IDLE | |||||
| |NATIVE_PLUGIN_USES_STATE | |NATIVE_PLUGIN_USES_STATE | ||||
| |NATIVE_PLUGIN_USES_TIME), | |NATIVE_PLUGIN_USES_TIME), | ||||
| /* supports */ static_cast<NativePluginSupports>(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), | /* supports */ static_cast<NativePluginSupports>(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, nullptr, nullptr, nullptr, | nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, | ||||
| nullptr, nullptr, nullptr, nullptr, | |||||
| nullptr, nullptr, nullptr, nullptr, nullptr | |||||
| }; | }; | ||||
| static LinkedList<const NativePluginDescriptor*> gPluginDescriptors; | static LinkedList<const NativePluginDescriptor*> gPluginDescriptors; | ||||
| @@ -336,7 +336,7 @@ struct BridgeNonRtServerControl : public CarlaRingBufferControl<HugeStackBuffer> | |||||
| writeUInt(static_cast<uint32_t>(opcode)); | writeUInt(static_cast<uint32_t>(opcode)); | ||||
| } | } | ||||
| void waitIfDataIsReachingLimit() const noexcept | |||||
| void waitIfDataIsReachingLimit() noexcept | |||||
| { | { | ||||
| if (getAvailableDataSize() < HugeStackBuffer::size/4) | if (getAvailableDataSize() < HugeStackBuffer::size/4) | ||||
| return; | return; | ||||
| @@ -344,9 +344,16 @@ struct BridgeNonRtServerControl : public CarlaRingBufferControl<HugeStackBuffer> | |||||
| for (int i=50; --i >= 0;) | for (int i=50; --i >= 0;) | ||||
| { | { | ||||
| if (getAvailableDataSize() >= HugeStackBuffer::size*3/4) | if (getAvailableDataSize() >= HugeStackBuffer::size*3/4) | ||||
| break; | |||||
| { | |||||
| carla_stdout("Client waitIfDataIsReachingLimit() reached and waited successfully"); | |||||
| writeOpcode(kPluginBridgeNonRtServerPong); | |||||
| commitWrite(); | |||||
| return; | |||||
| } | |||||
| carla_msleep(20); | carla_msleep(20); | ||||
| } | } | ||||
| carla_stderr("Client waitIfDataIsReachingLimit() reached and failed"); | |||||
| } | } | ||||
| CARLA_DECLARE_NON_COPY_STRUCT(BridgeNonRtServerControl) | CARLA_DECLARE_NON_COPY_STRUCT(BridgeNonRtServerControl) | ||||
| @@ -1445,7 +1445,6 @@ protected: | |||||
| void uiIdle() | void uiIdle() | ||||
| { | { | ||||
| CarlaEngine::idle(); | |||||
| fUiServer.idlePipe(); | fUiServer.idlePipe(); | ||||
| if (fUiServer.isPipeRunning()) | if (fUiServer.isPipeRunning()) | ||||
| @@ -1580,6 +1579,11 @@ public: | |||||
| delete handlePtr; | delete handlePtr; | ||||
| } | } | ||||
| static void _idle(NativePluginHandle handle) | |||||
| { | |||||
| handlePtr->idle(); | |||||
| } | |||||
| static uint32_t _get_parameter_count(NativePluginHandle handle) | static uint32_t _get_parameter_count(NativePluginHandle handle) | ||||
| { | { | ||||
| return handlePtr->getParameterCount(); | return handlePtr->getParameterCount(); | ||||
| @@ -1729,6 +1733,7 @@ static const NativePluginDescriptor carlaRackDesc = { | |||||
| |NATIVE_PLUGIN_HAS_UI | |NATIVE_PLUGIN_HAS_UI | ||||
| |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | ||||
| |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | ||||
| |NATIVE_PLUGIN_NEEDS_DSP_IDLE | |||||
| |NATIVE_PLUGIN_USES_STATE | |NATIVE_PLUGIN_USES_STATE | ||||
| |NATIVE_PLUGIN_USES_TIME), | |NATIVE_PLUGIN_USES_TIME), | ||||
| /* supports */ static_cast<NativePluginSupports>(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), | /* supports */ static_cast<NativePluginSupports>(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), | ||||
| @@ -1744,6 +1749,7 @@ static const NativePluginDescriptor carlaRackDesc = { | |||||
| /* copyright */ "GNU GPL v2+", | /* copyright */ "GNU GPL v2+", | ||||
| CarlaEngineNative::_instantiateRack, | CarlaEngineNative::_instantiateRack, | ||||
| CarlaEngineNative::_cleanup, | CarlaEngineNative::_cleanup, | ||||
| CarlaEngineNative::_idle, | |||||
| CarlaEngineNative::_get_parameter_count, | CarlaEngineNative::_get_parameter_count, | ||||
| CarlaEngineNative::_get_parameter_info, | CarlaEngineNative::_get_parameter_info, | ||||
| CarlaEngineNative::_get_parameter_value, | CarlaEngineNative::_get_parameter_value, | ||||
| @@ -1772,6 +1778,7 @@ static const NativePluginDescriptor carlaPatchbayDesc = { | |||||
| |NATIVE_PLUGIN_HAS_UI | |NATIVE_PLUGIN_HAS_UI | ||||
| |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | ||||
| |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | ||||
| |NATIVE_PLUGIN_NEEDS_DSP_IDLE | |||||
| |NATIVE_PLUGIN_USES_STATE | |NATIVE_PLUGIN_USES_STATE | ||||
| |NATIVE_PLUGIN_USES_TIME), | |NATIVE_PLUGIN_USES_TIME), | ||||
| /* supports */ static_cast<NativePluginSupports>(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), | /* supports */ static_cast<NativePluginSupports>(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), | ||||
| @@ -1787,6 +1794,7 @@ static const NativePluginDescriptor carlaPatchbayDesc = { | |||||
| /* copyright */ "GNU GPL v2+", | /* copyright */ "GNU GPL v2+", | ||||
| CarlaEngineNative::_instantiatePatchbay, | CarlaEngineNative::_instantiatePatchbay, | ||||
| CarlaEngineNative::_cleanup, | CarlaEngineNative::_cleanup, | ||||
| CarlaEngineNative::_idle, | |||||
| CarlaEngineNative::_get_parameter_count, | CarlaEngineNative::_get_parameter_count, | ||||
| CarlaEngineNative::_get_parameter_info, | CarlaEngineNative::_get_parameter_info, | ||||
| CarlaEngineNative::_get_parameter_value, | CarlaEngineNative::_get_parameter_value, | ||||
| @@ -1815,6 +1823,7 @@ static const NativePluginDescriptor carlaPatchbay3sDesc = { | |||||
| |NATIVE_PLUGIN_HAS_UI | |NATIVE_PLUGIN_HAS_UI | ||||
| |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | ||||
| |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | ||||
| |NATIVE_PLUGIN_NEEDS_DSP_IDLE | |||||
| |NATIVE_PLUGIN_USES_STATE | |NATIVE_PLUGIN_USES_STATE | ||||
| |NATIVE_PLUGIN_USES_TIME), | |NATIVE_PLUGIN_USES_TIME), | ||||
| /* supports */ static_cast<NativePluginSupports>(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), | /* supports */ static_cast<NativePluginSupports>(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), | ||||
| @@ -1830,6 +1839,7 @@ static const NativePluginDescriptor carlaPatchbay3sDesc = { | |||||
| /* copyright */ "GNU GPL v2+", | /* copyright */ "GNU GPL v2+", | ||||
| CarlaEngineNative::_instantiatePatchbay3s, | CarlaEngineNative::_instantiatePatchbay3s, | ||||
| CarlaEngineNative::_cleanup, | CarlaEngineNative::_cleanup, | ||||
| CarlaEngineNative::_idle, | |||||
| CarlaEngineNative::_get_parameter_count, | CarlaEngineNative::_get_parameter_count, | ||||
| CarlaEngineNative::_get_parameter_info, | CarlaEngineNative::_get_parameter_info, | ||||
| CarlaEngineNative::_get_parameter_value, | CarlaEngineNative::_get_parameter_value, | ||||
| @@ -1858,6 +1868,7 @@ static const NativePluginDescriptor carlaPatchbay16Desc = { | |||||
| |NATIVE_PLUGIN_HAS_UI | |NATIVE_PLUGIN_HAS_UI | ||||
| |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | ||||
| |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | ||||
| |NATIVE_PLUGIN_NEEDS_DSP_IDLE | |||||
| |NATIVE_PLUGIN_USES_STATE | |NATIVE_PLUGIN_USES_STATE | ||||
| |NATIVE_PLUGIN_USES_TIME), | |NATIVE_PLUGIN_USES_TIME), | ||||
| /* supports */ static_cast<NativePluginSupports>(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), | /* supports */ static_cast<NativePluginSupports>(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), | ||||
| @@ -1873,6 +1884,7 @@ static const NativePluginDescriptor carlaPatchbay16Desc = { | |||||
| /* copyright */ "GNU GPL v2+", | /* copyright */ "GNU GPL v2+", | ||||
| CarlaEngineNative::_instantiatePatchbay16, | CarlaEngineNative::_instantiatePatchbay16, | ||||
| CarlaEngineNative::_cleanup, | CarlaEngineNative::_cleanup, | ||||
| CarlaEngineNative::_idle, | |||||
| CarlaEngineNative::_get_parameter_count, | CarlaEngineNative::_get_parameter_count, | ||||
| CarlaEngineNative::_get_parameter_info, | CarlaEngineNative::_get_parameter_info, | ||||
| CarlaEngineNative::_get_parameter_value, | CarlaEngineNative::_get_parameter_value, | ||||
| @@ -1901,6 +1913,7 @@ static const NativePluginDescriptor carlaPatchbay32Desc = { | |||||
| |NATIVE_PLUGIN_HAS_UI | |NATIVE_PLUGIN_HAS_UI | ||||
| |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS | ||||
| |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | |NATIVE_PLUGIN_NEEDS_SINGLE_THREAD | ||||
| |NATIVE_PLUGIN_NEEDS_DSP_IDLE | |||||
| |NATIVE_PLUGIN_USES_STATE | |NATIVE_PLUGIN_USES_STATE | ||||
| |NATIVE_PLUGIN_USES_TIME), | |NATIVE_PLUGIN_USES_TIME), | ||||
| /* supports */ static_cast<NativePluginSupports>(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), | /* supports */ static_cast<NativePluginSupports>(NATIVE_PLUGIN_SUPPORTS_EVERYTHING), | ||||
| @@ -1916,6 +1929,7 @@ static const NativePluginDescriptor carlaPatchbay32Desc = { | |||||
| /* copyright */ "GNU GPL v2+", | /* copyright */ "GNU GPL v2+", | ||||
| CarlaEngineNative::_instantiatePatchbay32, | CarlaEngineNative::_instantiatePatchbay32, | ||||
| CarlaEngineNative::_cleanup, | CarlaEngineNative::_cleanup, | ||||
| CarlaEngineNative::_idle, | |||||
| CarlaEngineNative::_get_parameter_count, | CarlaEngineNative::_get_parameter_count, | ||||
| CarlaEngineNative::_get_parameter_info, | CarlaEngineNative::_get_parameter_info, | ||||
| CarlaEngineNative::_get_parameter_value, | CarlaEngineNative::_get_parameter_value, | ||||
| @@ -353,6 +353,26 @@ struct BridgeNonRtClientControl : public CarlaRingBufferControl<BigStackBuffer> | |||||
| writeUInt(static_cast<uint32_t>(opcode)); | writeUInt(static_cast<uint32_t>(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) | CARLA_DECLARE_NON_COPY_STRUCT(BridgeNonRtClientControl) | ||||
| }; | }; | ||||
| @@ -967,6 +987,7 @@ public: | |||||
| fShmNonRtClientControl.writeUInt(parameterId); | fShmNonRtClientControl.writeUInt(parameterId); | ||||
| fShmNonRtClientControl.writeFloat(value); | fShmNonRtClientControl.writeFloat(value); | ||||
| fShmNonRtClientControl.commitWrite(); | fShmNonRtClientControl.commitWrite(); | ||||
| fShmNonRtClientControl.waitIfDataIsReachingLimit(); | |||||
| } | } | ||||
| CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); | CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); | ||||
| @@ -771,6 +771,9 @@ public: | |||||
| CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | ||||
| CARLA_SAFE_ASSERT_RETURN(fHandle != 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) | if (fIsUiVisible && fDescriptor->ui_idle != nullptr) | ||||
| fDescriptor->ui_idle(fHandle); | fDescriptor->ui_idle(fHandle); | ||||
| @@ -58,12 +58,13 @@ typedef enum { | |||||
| NATIVE_PLUGIN_HAS_UI = 1 << 2, | NATIVE_PLUGIN_HAS_UI = 1 << 2, | ||||
| NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS = 1 << 3, | NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS = 1 << 3, | ||||
| NATIVE_PLUGIN_NEEDS_SINGLE_THREAD = 1 << 4, | 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; | } NativePluginHints; | ||||
| typedef enum { | typedef enum { | ||||
| @@ -220,6 +221,7 @@ typedef struct _NativePluginDescriptor { | |||||
| NativePluginHandle (*instantiate)(const NativeHostDescriptor* host); | NativePluginHandle (*instantiate)(const NativeHostDescriptor* host); | ||||
| void (*cleanup)(NativePluginHandle handle); | void (*cleanup)(NativePluginHandle handle); | ||||
| void (*idle)(NativePluginHandle handle); | |||||
| uint32_t (*get_parameter_count)(NativePluginHandle handle); | uint32_t (*get_parameter_count)(NativePluginHandle handle); | ||||
| const NativeParameter* (*get_parameter_info)(NativePluginHandle handle, uint32_t index); | const NativeParameter* (*get_parameter_info)(NativePluginHandle handle, uint32_t index); | ||||
| @@ -208,6 +208,10 @@ protected: | |||||
| pHost->dispatcher(pHost->handle, NATIVE_HOST_OPCODE_UI_UNAVAILABLE, 0, 0, nullptr, 0.0f); | pHost->dispatcher(pHost->handle, NATIVE_HOST_OPCODE_UI_UNAVAILABLE, 0, 0, nullptr, 0.0f); | ||||
| } | } | ||||
| // ------------------------------------------------------------------- | |||||
| virtual void idle() {} | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Plugin parameter calls | // Plugin parameter calls | ||||
| @@ -382,6 +386,11 @@ private: | |||||
| public: | public: | ||||
| #define handlePtr ((NativePluginClass*)handle) | #define handlePtr ((NativePluginClass*)handle) | ||||
| static void _idle(NativePluginHandle handle) | |||||
| { | |||||
| handlePtr->idle(); | |||||
| } | |||||
| static uint32_t _get_parameter_count(NativePluginHandle handle) | static uint32_t _get_parameter_count(NativePluginHandle handle) | ||||
| { | { | ||||
| return handlePtr->getParameterCount(); | return handlePtr->getParameterCount(); | ||||
| @@ -530,6 +539,7 @@ public: \ | |||||
| #define PluginDescriptorFILL(ClassName) \ | #define PluginDescriptorFILL(ClassName) \ | ||||
| ClassName::_instantiate, \ | ClassName::_instantiate, \ | ||||
| ClassName::_cleanup, \ | ClassName::_cleanup, \ | ||||
| ClassName::_idle, \ | |||||
| ClassName::_get_parameter_count, \ | ClassName::_get_parameter_count, \ | ||||
| ClassName::_get_parameter_info, \ | ClassName::_get_parameter_info, \ | ||||
| ClassName::_get_parameter_value, \ | ClassName::_get_parameter_value, \ | ||||
| @@ -184,6 +184,11 @@ public: | |||||
| switch (opcode) | switch (opcode) | ||||
| { | { | ||||
| case effIdle: | |||||
| if (fDescriptor->idle != nullptr) | |||||
| fDescriptor->idle(fHandle); | |||||
| break; | |||||
| case effSetSampleRate: | case effSetSampleRate: | ||||
| if (carla_compareFloats(fSampleRate, static_cast<double>(opt))) | if (carla_compareFloats(fSampleRate, static_cast<double>(opt))) | ||||
| return 0; | return 0; | ||||
| @@ -210,7 +215,8 @@ public: | |||||
| fMidiEventCount = 0; | fMidiEventCount = 0; | ||||
| carla_zeroStruct<NativeTimeInfo>(fTimeInfo); | carla_zeroStruct<NativeTimeInfo>(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); | fAudioMaster(fEffect, audioMasterWantMidi, 0, 0, nullptr, 0.0f); | ||||
| CARLA_SAFE_ASSERT_BREAK(! fIsActive); | CARLA_SAFE_ASSERT_BREAK(! fIsActive); | ||||