Browse Source

Start listening for vst3 callbacks

Signed-off-by: falkTX <falktx@falktx.com>
pull/1775/head
falkTX 2 years ago
parent
commit
7eeb222ae3
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
3 changed files with 148 additions and 51 deletions
  1. +5
    -3
      source/backend/plugin/CarlaPluginCLAP.cpp
  2. +2
    -2
      source/backend/plugin/CarlaPluginJuce.cpp
  3. +141
    -46
      source/backend/plugin/CarlaPluginVST3.cpp

+ 5
- 3
source/backend/plugin/CarlaPluginCLAP.cpp View File

@@ -1111,6 +1111,9 @@ public:
{ {
CARLA_SAFE_ASSERT_RETURN(fExtensions.gui != nullptr,); CARLA_SAFE_ASSERT_RETURN(fExtensions.gui != nullptr,);


if (fUI.isVisible == yesNo)
return;

if (yesNo) if (yesNo)
{ {
if (fUI.isVisible) if (fUI.isVisible)
@@ -1228,7 +1231,7 @@ public:
} }
} }


runIdleCallbacksAsNeeded(false);
runIdleCallbacksAsNeeded(true);
} }


void* embedCustomUI(void* const ptr) override void* embedCustomUI(void* const ptr) override
@@ -3384,10 +3387,9 @@ private:
} }
#endif // _POSIX_VERSION #endif // _POSIX_VERSION


const uint32_t currentTimeInMs = water::Time::getMillisecondCounter();

for (LinkedList<HostTimerDetails>::Itenerator it = fTimers.begin2(); it.valid(); it.next()) for (LinkedList<HostTimerDetails>::Itenerator it = fTimers.begin2(); it.valid(); it.next())
{ {
const uint32_t currentTimeInMs = water::Time::getMillisecondCounter();
HostTimerDetails& timer(it.getValue(kTimerFallbackNC)); HostTimerDetails& timer(it.getValue(kTimerFallbackNC));


if (currentTimeInMs > timer.lastCallTimeInMs + timer.periodInMs) if (currentTimeInMs > timer.lastCallTimeInMs + timer.periodInMs)


+ 2
- 2
source/backend/plugin/CarlaPluginJuce.cpp View File

@@ -1573,8 +1573,8 @@ protected:
{ {
CARLA_SAFE_ASSERT_RETURN(index >= 0,); CARLA_SAFE_ASSERT_RETURN(index >= 0,);


const uint32_t uindex(static_cast<uint32_t>(index));
const float fixedValue(pData->param.getFixedValue(uindex, value));
const uint32_t uindex = static_cast<uint32_t>(index);
const float fixedValue = pData->param.getFixedValue(uindex, value);


CarlaPlugin::setParameterValue(static_cast<uint32_t>(index), fixedValue, false, true, true); CarlaPlugin::setParameterValue(static_cast<uint32_t>(index), fixedValue, false, true, true);
} }


+ 141
- 46
source/backend/plugin/CarlaPluginVST3.cpp View File

@@ -231,7 +231,7 @@ struct carla_v3_attribute_list : v3_attribute_list_cpp {
} }
*/ */


static v3_result carla_set_int(void* const self, const char* const id, const int64_t value)
static v3_result V3_API carla_set_int(void* const self, const char* const id, const int64_t value)
{ {
CARLA_SAFE_ASSERT_RETURN(id != nullptr, V3_INVALID_ARG); CARLA_SAFE_ASSERT_RETURN(id != nullptr, V3_INVALID_ARG);
carla_v3_attribute_list* const attrlist = *static_cast<carla_v3_attribute_list**>(self); carla_v3_attribute_list* const attrlist = *static_cast<carla_v3_attribute_list**>(self);
@@ -242,7 +242,7 @@ struct carla_v3_attribute_list : v3_attribute_list_cpp {
return attrlist->add(id, var); return attrlist->add(id, var);
} }


static v3_result carla_get_int(void* const self, const char* const id, int64_t* const value)
static v3_result V3_API carla_get_int(void* const self, const char* const id, int64_t* const value)
{ {
CARLA_SAFE_ASSERT_RETURN(id != nullptr, V3_INVALID_ARG); CARLA_SAFE_ASSERT_RETURN(id != nullptr, V3_INVALID_ARG);
carla_v3_attribute_list* const attrlist = *static_cast<carla_v3_attribute_list**>(self); carla_v3_attribute_list* const attrlist = *static_cast<carla_v3_attribute_list**>(self);
@@ -257,7 +257,7 @@ struct carla_v3_attribute_list : v3_attribute_list_cpp {
return V3_INVALID_ARG; return V3_INVALID_ARG;
} }


static v3_result carla_set_float(void* const self, const char* const id, const double value)
static v3_result V3_API carla_set_float(void* const self, const char* const id, const double value)
{ {
CARLA_SAFE_ASSERT_RETURN(id != nullptr, V3_INVALID_ARG); CARLA_SAFE_ASSERT_RETURN(id != nullptr, V3_INVALID_ARG);
carla_v3_attribute_list* const attrlist = *static_cast<carla_v3_attribute_list**>(self); carla_v3_attribute_list* const attrlist = *static_cast<carla_v3_attribute_list**>(self);
@@ -268,7 +268,7 @@ struct carla_v3_attribute_list : v3_attribute_list_cpp {
return attrlist->add(id, var); return attrlist->add(id, var);
} }


static v3_result carla_get_float(void* const self, const char* const id, double* const value)
static v3_result V3_API carla_get_float(void* const self, const char* const id, double* const value)
{ {
CARLA_SAFE_ASSERT_RETURN(id != nullptr, V3_INVALID_ARG); CARLA_SAFE_ASSERT_RETURN(id != nullptr, V3_INVALID_ARG);
carla_v3_attribute_list* const attrlist = *static_cast<carla_v3_attribute_list**>(self); carla_v3_attribute_list* const attrlist = *static_cast<carla_v3_attribute_list**>(self);
@@ -283,7 +283,7 @@ struct carla_v3_attribute_list : v3_attribute_list_cpp {
return V3_INVALID_ARG; return V3_INVALID_ARG;
} }


static v3_result carla_set_string(void* const self, const char* const id, const int16_t* const string)
static v3_result V3_API carla_set_string(void* const self, const char* const id, const int16_t* const string)
{ {
CARLA_SAFE_ASSERT_RETURN(id != nullptr, V3_INVALID_ARG); CARLA_SAFE_ASSERT_RETURN(id != nullptr, V3_INVALID_ARG);
CARLA_SAFE_ASSERT_RETURN(string != nullptr, V3_INVALID_ARG); CARLA_SAFE_ASSERT_RETURN(string != nullptr, V3_INVALID_ARG);
@@ -301,8 +301,8 @@ struct carla_v3_attribute_list : v3_attribute_list_cpp {
return attrlist->add(id, var); return attrlist->add(id, var);
} }


static v3_result carla_get_string(void* const self, const char* const id,
int16_t* const string, const uint32_t size)
static v3_result V3_API carla_get_string(void* const self, const char* const id,
int16_t* const string, const uint32_t size)
{ {
CARLA_SAFE_ASSERT_RETURN(id != nullptr, V3_INVALID_ARG); CARLA_SAFE_ASSERT_RETURN(id != nullptr, V3_INVALID_ARG);
CARLA_SAFE_ASSERT_RETURN(string != nullptr, V3_INVALID_ARG); CARLA_SAFE_ASSERT_RETURN(string != nullptr, V3_INVALID_ARG);
@@ -320,8 +320,8 @@ struct carla_v3_attribute_list : v3_attribute_list_cpp {
return V3_INVALID_ARG; return V3_INVALID_ARG;
} }


static v3_result carla_set_binary(void* const self, const char* const id,
const void* const data, const uint32_t size)
static v3_result V3_API carla_set_binary(void* const self, const char* const id,
const void* const data, const uint32_t size)
{ {
CARLA_SAFE_ASSERT_RETURN(id != nullptr, V3_INVALID_ARG); CARLA_SAFE_ASSERT_RETURN(id != nullptr, V3_INVALID_ARG);
CARLA_SAFE_ASSERT_RETURN(data != nullptr, V3_INVALID_ARG); CARLA_SAFE_ASSERT_RETURN(data != nullptr, V3_INVALID_ARG);
@@ -339,8 +339,8 @@ struct carla_v3_attribute_list : v3_attribute_list_cpp {
return attrlist->add(id, var); return attrlist->add(id, var);
} }


static v3_result carla_get_binary(void* const self, const char* const id,
const void** const data, uint32_t* const size)
static v3_result V3_API carla_get_binary(void* const self, const char* const id,
const void** const data, uint32_t* const size)
{ {
CARLA_SAFE_ASSERT_RETURN(id != nullptr, V3_INVALID_ARG); CARLA_SAFE_ASSERT_RETURN(id != nullptr, V3_INVALID_ARG);
carla_v3_attribute_list* const attrlist = *static_cast<carla_v3_attribute_list**>(self); carla_v3_attribute_list* const attrlist = *static_cast<carla_v3_attribute_list**>(self);
@@ -484,7 +484,7 @@ struct carla_v3_bstream : v3_bstream_cpp {
return V3_NO_INTERFACE; return V3_NO_INTERFACE;
} }


static v3_result carla_read(void* const self, void* const buffer, int32_t num_bytes, int32_t* const bytes_read)
static v3_result carla_read(void* const self, void* const buffer, int32_t num_bytes, int32_t* const bytes_read)
{ {
CARLA_SAFE_ASSERT_RETURN(buffer != nullptr, V3_INVALID_ARG); CARLA_SAFE_ASSERT_RETURN(buffer != nullptr, V3_INVALID_ARG);
CARLA_SAFE_ASSERT_RETURN(num_bytes > 0, V3_INVALID_ARG); CARLA_SAFE_ASSERT_RETURN(num_bytes > 0, V3_INVALID_ARG);
@@ -501,7 +501,7 @@ struct carla_v3_bstream : v3_bstream_cpp {
return V3_OK; return V3_OK;
} }


static v3_result carla_write(void* const self,
static v3_result carla_write(void* const self,
void* const buffer, const int32_t num_bytes, int32_t* const bytes_read) void* const buffer, const int32_t num_bytes, int32_t* const bytes_read)
{ {
CARLA_SAFE_ASSERT_RETURN(buffer != nullptr, V3_INVALID_ARG); CARLA_SAFE_ASSERT_RETURN(buffer != nullptr, V3_INVALID_ARG);
@@ -519,7 +519,7 @@ struct carla_v3_bstream : v3_bstream_cpp {
return V3_OK; return V3_OK;
} }


static v3_result carla_seek(void* const self, const int64_t pos, const int32_t seek_mode, int64_t* const result)
static v3_result carla_seek(void* const self, const int64_t pos, const int32_t seek_mode, int64_t* const result)
{ {
CARLA_SAFE_ASSERT_RETURN(result != nullptr, V3_INVALID_ARG); CARLA_SAFE_ASSERT_RETURN(result != nullptr, V3_INVALID_ARG);
carla_v3_bstream* const stream = *static_cast<carla_v3_bstream**>(self); carla_v3_bstream* const stream = *static_cast<carla_v3_bstream**>(self);
@@ -543,7 +543,7 @@ struct carla_v3_bstream : v3_bstream_cpp {
return V3_INVALID_ARG; return V3_INVALID_ARG;
} }


static v3_result carla_tell(void* const self, int64_t* const pos)
static v3_result carla_tell(void* const self, int64_t* const pos)
{ {
CARLA_SAFE_ASSERT_RETURN(pos != nullptr, V3_INVALID_ARG); CARLA_SAFE_ASSERT_RETURN(pos != nullptr, V3_INVALID_ARG);
carla_v3_bstream* const stream = *static_cast<carla_v3_bstream**>(self); carla_v3_bstream* const stream = *static_cast<carla_v3_bstream**>(self);
@@ -1092,8 +1092,19 @@ private:


// -------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------


struct ComponentCallback {
virtual ~ComponentCallback() {}
virtual v3_result v3BeginEdit(v3_param_id) = 0;
virtual v3_result v3PerformEdit(v3_param_id, double) = 0;
virtual v3_result v3EndEdit(v3_param_id) = 0;
virtual v3_result v3RestartComponent(int32_t) = 0;
};

struct carla_v3_component_handler : v3_component_handler_cpp { struct carla_v3_component_handler : v3_component_handler_cpp {
carla_v3_component_handler()
ComponentCallback* const callback;

carla_v3_component_handler(ComponentCallback* const cb)
: callback(cb)
{ {
query_interface = carla_query_interface; query_interface = carla_query_interface;
ref = v3_ref_static; ref = v3_ref_static;
@@ -1127,28 +1138,28 @@ private:
return V3_NO_INTERFACE; return V3_NO_INTERFACE;
} }


static v3_result V3_API carla_begin_edit(void*, v3_param_id)
static v3_result V3_API carla_begin_edit(void* const self, const v3_param_id paramId)
{ {
carla_stderr2("TODO carla_begin_edit");
return V3_NOT_IMPLEMENTED;
carla_v3_component_handler* const comp = *static_cast<carla_v3_component_handler**>(self);
return comp->callback->v3BeginEdit(paramId);
} }


static v3_result V3_API carla_perform_edit(void*, v3_param_id, double)
static v3_result V3_API carla_perform_edit(void* const self, const v3_param_id paramId, const double value)
{ {
carla_stderr2("TODO carla_perform_edit");
return V3_NOT_IMPLEMENTED;
carla_v3_component_handler* const comp = *static_cast<carla_v3_component_handler**>(self);
return comp->callback->v3PerformEdit(paramId, value);
} }


static v3_result V3_API carla_end_edit(void*, v3_param_id)
static v3_result V3_API carla_end_edit(void* const self, const v3_param_id paramId)
{ {
carla_stderr2("TODO carla_end_edit");
return V3_NOT_IMPLEMENTED;
carla_v3_component_handler* const comp = *static_cast<carla_v3_component_handler**>(self);
return comp->callback->v3EndEdit(paramId);
} }


static v3_result V3_API carla_restart_component(void*, int32_t)
static v3_result V3_API carla_restart_component(void* const self, const int32_t flags)
{ {
carla_stderr2("TODO carla_restart_component");
return V3_NOT_IMPLEMENTED;
carla_v3_component_handler* const comp = *static_cast<carla_v3_component_handler**>(self);
return comp->callback->v3RestartComponent(flags);
} }


CARLA_DECLARE_NON_COPYABLE(carla_v3_component_handler) CARLA_DECLARE_NON_COPYABLE(carla_v3_component_handler)
@@ -1211,19 +1222,22 @@ private:
// -------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------


class CarlaPluginVST3 : public CarlaPlugin, class CarlaPluginVST3 : public CarlaPlugin,
private CarlaPluginUI::Callback
private CarlaPluginUI::Callback,
private ComponentCallback
{ {
public: public:
CarlaPluginVST3(CarlaEngine* const engine, const uint id) CarlaPluginVST3(CarlaEngine* const engine, const uint id)
: CarlaPlugin(engine, id), : CarlaPlugin(engine, id),
kEngineHasIdleOnMainThread(engine->hasIdleOnMainThread()),
fFirstActive(true), fFirstActive(true),
fAudioAndCvOutBuffers(nullptr), fAudioAndCvOutBuffers(nullptr),
fLastKnownLatency(0), fLastKnownLatency(0),
fRestartFlags(0),
fLastTimeInfo(), fLastTimeInfo(),
fV3TimeContext(), fV3TimeContext(),
fV3Application(), fV3Application(),
fV3ApplicationPtr(&fV3Application), fV3ApplicationPtr(&fV3Application),
fComponentHandler(),
fComponentHandler(this),
fComponentHandlerPtr(&fComponentHandler), fComponentHandlerPtr(&fComponentHandler),
fPluginFrame(this), fPluginFrame(this),
fPluginFramePtr(&fPluginFrame), fPluginFramePtr(&fPluginFrame),
@@ -1241,6 +1255,8 @@ public:
{ {
carla_debug("CarlaPluginVST3::~CarlaPluginVST3()"); carla_debug("CarlaPluginVST3::~CarlaPluginVST3()");


runIdleCallbacksAsNeeded(false);

// close UI // close UI
if (pData->hints & PLUGIN_HAS_CUSTOM_UI) if (pData->hints & PLUGIN_HAS_CUSTOM_UI)
{ {
@@ -1641,9 +1657,18 @@ public:
{ {
fUI.isVisible = false; fUI.isVisible = false;


CARLA_SAFE_ASSERT_RETURN(fUI.window != nullptr,);
fUI.window->hide();
if (fUI.isEmbed && fUI.isAttached)
{
fUI.isAttached = false;
v3_cpp_obj(fV3.view)->set_frame(fV3.view, nullptr);
v3_cpp_obj(fV3.view)->removed(fV3.view);
}

if (fUI.window != nullptr)
fUI.window->hide();
} }

runIdleCallbacksAsNeeded(true);
} }


void* embedCustomUI(void* const ptr) override void* embedCustomUI(void* const ptr) override
@@ -1664,6 +1689,7 @@ public:


if (v3_cpp_obj(fV3.view)->attached(fV3.view, ptr, V3_VIEW_PLATFORM_TYPE_NATIVE) == V3_OK) if (v3_cpp_obj(fV3.view)->attached(fV3.view, ptr, V3_VIEW_PLATFORM_TYPE_NATIVE) == V3_OK)
{ {
fUI.isAttached = true;
fUI.isEmbed = true; fUI.isEmbed = true;
fUI.isVisible = true; fUI.isVisible = true;
v3_view_rect rect = {}; v3_view_rect rect = {};
@@ -1704,18 +1730,16 @@ public:
return nullptr; return nullptr;
} }


void idle() override
void runIdleCallbacksAsNeeded(const bool isIdleCallback)
{ {
/*
if (kEngineHasIdleOnMainThread)
runIdleCallbacksAsNeeded(true);
*/
int32_t flags = fRestartFlags;


CarlaPlugin::idle();
}
if (isIdleCallback)
{
}

fRestartFlags = flags;


void uiIdle() override
{
#ifdef _POSIX_VERSION #ifdef _POSIX_VERSION
LinkedList<HostPosixFileDescriptor>& posixfds(fPluginFrame.loop.posixfds); LinkedList<HostPosixFileDescriptor>& posixfds(fPluginFrame.loop.posixfds);


@@ -1777,10 +1801,23 @@ public:
} }
} }


/*
}

void idle() override
{
if (kEngineHasIdleOnMainThread)
runIdleCallbacksAsNeeded(true);

CarlaPlugin::idle();
}

void uiIdle() override
{
if (fUI.window != nullptr)
fUI.window->idle();

if (!kEngineHasIdleOnMainThread) if (!kEngineHasIdleOnMainThread)
runIdleCallbacksAsNeeded(true); runIdleCallbacksAsNeeded(true);
*/


CarlaPlugin::uiIdle(); CarlaPlugin::uiIdle();
} }
@@ -2192,6 +2229,8 @@ public:


if (pData->active) if (pData->active)
activate(); activate();
else
runIdleCallbacksAsNeeded(false);


carla_debug("CarlaPluginVST3::reload() - end"); carla_debug("CarlaPluginVST3::reload() - end");
} }
@@ -2213,6 +2252,7 @@ public:
} CARLA_SAFE_EXCEPTION("set_processing on"); } CARLA_SAFE_EXCEPTION("set_processing on");


fFirstActive = true; fFirstActive = true;
runIdleCallbacksAsNeeded(false);
} }


void deactivate() noexcept override void deactivate() noexcept override
@@ -2227,6 +2267,8 @@ public:
try { try {
v3_cpp_obj(fV3.component)->set_active(fV3.component, false); v3_cpp_obj(fV3.component)->set_active(fV3.component, false);
} CARLA_SAFE_EXCEPTION("set_active off"); } CARLA_SAFE_EXCEPTION("set_active off");

runIdleCallbacksAsNeeded(false);
} }


void process(const float* const* const audioIn, float** const audioOut, void process(const float* const* const audioIn, float** const audioOut,
@@ -3176,6 +3218,58 @@ public:
} }


protected: protected:
v3_result v3BeginEdit(const v3_param_id paramId) override
{
for (uint32_t i=0; i < pData->param.count; ++i)
{
if (static_cast<v3_param_id>(pData->param.data[i].rindex) == paramId)
{
pData->engine->touchPluginParameter(pData->id, i, true);
return V3_OK;
}
}
return V3_INVALID_ARG;
}

v3_result v3PerformEdit(const v3_param_id paramId, const double value) override
{
for (uint32_t i=0; i < pData->param.count; ++i)
{
if (static_cast<v3_param_id>(pData->param.data[i].rindex) == paramId)
{
// report value to component (next process call)
fEvents.paramInputs->setParamValue(paramId, static_cast<float>(value));

const double plain = v3_cpp_obj(fV3.controller)->normalised_parameter_to_plain(fV3.controller,
paramId,
value);
const float fixedValue = pData->param.getFixedValue(i, plain);
CarlaPlugin::setParameterValue(i, fixedValue, false, true, true);
return V3_OK;
}
}
return V3_INVALID_ARG;
}

v3_result v3EndEdit(const v3_param_id paramId) override
{
for (uint32_t i=0; i < pData->param.count; ++i)
{
if (static_cast<v3_param_id>(pData->param.data[i].rindex) == paramId)
{
pData->engine->touchPluginParameter(pData->id, i, false);
return V3_OK;
}
}
return V3_INVALID_ARG;
}

v3_result v3RestartComponent(const int32_t flags) override
{
fRestartFlags |= flags;
return V3_OK;
}

void handlePluginUIClosed() override void handlePluginUIClosed() override
{ {
// CARLA_SAFE_ASSERT_RETURN(fUI.window != nullptr,); // CARLA_SAFE_ASSERT_RETURN(fUI.window != nullptr,);
@@ -3199,13 +3293,14 @@ protected:
} }


private: private:
#ifdef CARLA_OS_MAC
#ifdef CARLA_OS_MAC
BundleLoader fMacBundleLoader; BundleLoader fMacBundleLoader;
#endif
#endif
const bool kEngineHasIdleOnMainThread;
bool fFirstActive; // first process() call after activate() bool fFirstActive; // first process() call after activate()
float** fAudioAndCvOutBuffers; float** fAudioAndCvOutBuffers;
uint32_t fLastKnownLatency; uint32_t fLastKnownLatency;
int32_t fRestartFlags;
EngineTimeInfo fLastTimeInfo; EngineTimeInfo fLastTimeInfo;
v3_process_context fV3TimeContext; v3_process_context fV3TimeContext;




Loading…
Cancel
Save