Browse Source

More plugin-bridge work; Add idle() to native API

tags/1.9.6
falkTX 10 years ago
parent
commit
26e36b1996
8 changed files with 83 additions and 15 deletions
  1. +10
    -5
      source/backend/CarlaUtils.cpp
  2. +9
    -2
      source/backend/engine/CarlaEngineBridge.cpp
  3. +15
    -1
      source/backend/engine/CarlaEngineNative.cpp
  4. +21
    -0
      source/backend/plugin/CarlaPluginBridge.cpp
  5. +3
    -0
      source/backend/plugin/CarlaPluginNative.cpp
  6. +8
    -6
      source/includes/CarlaNative.h
  7. +10
    -0
      source/includes/CarlaNative.hpp
  8. +7
    -1
      source/plugin/carla-vst.cpp

+ 10
- 5
source/backend/CarlaUtils.cpp View File

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


+ 9
- 2
source/backend/engine/CarlaEngineBridge.cpp View File

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


+ 15
- 1
source/backend/engine/CarlaEngineNative.cpp View File

@@ -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,


+ 21
- 0
source/backend/plugin/CarlaPluginBridge.cpp View File

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


+ 3
- 0
source/backend/plugin/CarlaPluginNative.cpp View File

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



+ 8
- 6
source/includes/CarlaNative.h View File

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


+ 10
- 0
source/includes/CarlaNative.hpp View File

@@ -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, \


+ 7
- 1
source/plugin/carla-vst.cpp View File

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


Loading…
Cancel
Save