15#include <pluginterfaces/vst/ivstparameterchanges.h>
43 Steinberg::Vst::IParameterChanges* ptr {
nullptr };
44 if(ptr = mFirst.load())
46 if(ptr = mSecond.load())
48 if(ptr = mPendingChanges.load())
56 return Steinberg::kResultOk;
60 Steinberg::Vst::ParamValue valueNormalized)
66 auto lock = mPendingChanges.exchange(
nullptr);
72 lock = mFirst.exchange(
nullptr);
74 lock = mSecond.exchange(
nullptr);
83 tresult result = kInternalError;
85 if(
const auto queue = lock->addParameterData(
id, index))
88 result = queue->addPoint(0, valueNormalized, index);
94 mPendingChanges.exchange(lock);
101 return Steinberg::kResultOk;
106 return Steinberg::kNotImplemented;
113 const auto pendingChanges = mPendingChanges.exchange(
nullptr);
114 if(pendingChanges !=
nullptr)
116 return PendingChangesPtr { pendingChanges, [handler = IPtr {
this }](Vst::IParameterChanges* ptr)
120 ptr = handler->mFirst.exchange(ptr);
122 handler->mSecond.exchange(ptr);
IMPLEMENT_FUNKNOWN_METHODS(internal::ConnectionProxy, Steinberg::Vst::IConnectionPoint, Steinberg::Vst::IConnectionPoint::iid)
std::atomic< Steinberg::Vst::IParameterChanges * > mSecond
Steinberg::tresult PLUGIN_API performEdit(Steinberg::Vst::ParamID id, Steinberg::Vst::ParamValue valueNormalized) override
virtual ~ComponentHandler()
Steinberg::tresult PLUGIN_API beginEdit(Steinberg::Vst::ParamID id) override
Steinberg::tresult PLUGIN_API restartComponent(Steinberg::int32 flags) override
std::unique_ptr< Steinberg::Vst::IParameterChanges, std::function< void(Steinberg::Vst::IParameterChanges *)> > PendingChangesPtr
PendingChangesPtr getPendingChanges()
std::atomic< Steinberg::Vst::IParameterChanges * > mFirst
Steinberg::tresult PLUGIN_API endEdit(Steinberg::Vst::ParamID id) override