@@ -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); | ||||