@@ -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<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 | |||
}; | |||
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<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 | |||
}; | |||
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<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 | |||
}; | |||
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<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 | |||
}; | |||
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<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 | |||
}; | |||
static LinkedList<const NativePluginDescriptor*> gPluginDescriptors; | |||
@@ -336,7 +336,7 @@ struct BridgeNonRtServerControl : public CarlaRingBufferControl<HugeStackBuffer> | |||
writeUInt(static_cast<uint32_t>(opcode)); | |||
} | |||
void waitIfDataIsReachingLimit() const noexcept | |||
void waitIfDataIsReachingLimit() noexcept | |||
{ | |||
if (getAvailableDataSize() < HugeStackBuffer::size/4) | |||
return; | |||
@@ -344,9 +344,16 @@ struct BridgeNonRtServerControl : public CarlaRingBufferControl<HugeStackBuffer> | |||
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) | |||
@@ -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<NativePluginSupports>(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<NativePluginSupports>(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<NativePluginSupports>(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<NativePluginSupports>(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<NativePluginSupports>(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, | |||
@@ -353,6 +353,26 @@ struct BridgeNonRtClientControl : public CarlaRingBufferControl<BigStackBuffer> | |||
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) | |||
}; | |||
@@ -967,6 +987,7 @@ public: | |||
fShmNonRtClientControl.writeUInt(parameterId); | |||
fShmNonRtClientControl.writeFloat(value); | |||
fShmNonRtClientControl.commitWrite(); | |||
fShmNonRtClientControl.waitIfDataIsReachingLimit(); | |||
} | |||
CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); | |||
@@ -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); | |||
@@ -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); | |||
@@ -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, \ | |||
@@ -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<double>(opt))) | |||
return 0; | |||
@@ -210,7 +215,8 @@ public: | |||
fMidiEventCount = 0; | |||
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); | |||
CARLA_SAFE_ASSERT_BREAK(! fIsActive); | |||