Browse Source

VST3ComSmartPtr: Avoid implicit conversions

v7.0.9
reuk 2 years ago
parent
commit
d01166edc8
No known key found for this signature in database GPG Key ID: FCB43929F012EE5C
3 changed files with 139 additions and 114 deletions
  1. +14
    -17
      modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp
  2. +43
    -13
      modules/juce_audio_processors/format_types/juce_VST3Common.h
  3. +82
    -84
      modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp

+ 14
- 17
modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp View File

@@ -1063,8 +1063,8 @@ public:
void setAudioProcessor (JuceAudioProcessor* audioProc) void setAudioProcessor (JuceAudioProcessor* audioProc)
{ {
if (audioProcessor != audioProc)
installAudioProcessor (audioProc);
if (audioProcessor.get() != audioProc)
installAudioProcessor (addVSTComSmartPtrOwner (audioProc));
} }
tresult PLUGIN_API connect (IConnectionPoint* other) override tresult PLUGIN_API connect (IConnectionPoint* other) override
@@ -1609,12 +1609,11 @@ private:
{ {
jassert (hostContext != nullptr); jassert (hostContext != nullptr);
if (auto* message = allocateMessage())
if (auto message = becomeVSTComSmartPtrOwner (allocateMessage()))
{ {
const FReleaser releaser (message);
message->setMessageID (idTag); message->setMessageID (idTag);
message->getAttributes()->setInt (idTag, value); message->getAttributes()->setInt (idTag, value);
sendMessage (message);
sendMessage (message.get());
} }
} }
@@ -1671,7 +1670,7 @@ private:
} }
else else
{ {
VSTComSmartPtr<MenuTarget> ownedTarget (target);
const auto ownedTarget = addVSTComSmartPtrOwner (target);
const auto tag = item.tag; const auto tag = item.tag;
menuStack.back().menu.addItem (toString (item.name), menuStack.back().menu.addItem (toString (item.name),
(item.flags & MenuItem::kIsDisabled) == 0, (item.flags & MenuItem::kIsDisabled) == 0,
@@ -1721,7 +1720,7 @@ private:
return {}; return {};
const auto idToUse = parameter != nullptr ? processor.getVSTParamIDForIndex (parameter->getParameterIndex()) : 0; const auto idToUse = parameter != nullptr ? processor.getVSTParamIDForIndex (parameter->getParameterIndex()) : 0;
const auto menu = VSTComSmartPtr<Steinberg::Vst::IContextMenu> (handler->createContextMenu (view, &idToUse), false);
const auto menu = becomeVSTComSmartPtrOwner (handler->createContextMenu (view, &idToUse));
return std::make_unique<EditorContextMenu> (editor, menu); return std::make_unique<EditorContextMenu> (editor, menu);
} }
@@ -1740,7 +1739,7 @@ private:
public: public:
JuceVST3Editor (JuceVST3EditController& ec, JuceAudioProcessor& p) JuceVST3Editor (JuceVST3EditController& ec, JuceAudioProcessor& p)
: EditorView (&ec, nullptr), : EditorView (&ec, nullptr),
owner (&ec),
owner (addVSTComSmartPtrOwner (&ec)),
pluginInstance (*p.get()) pluginInstance (*p.get())
{ {
createContentWrapperComponentIfNeeded(); createContentWrapperComponentIfNeeded();
@@ -2433,7 +2432,7 @@ class JuceVST3Component : public Vst::IComponent,
public: public:
JuceVST3Component (Vst::IHostApplication* h) JuceVST3Component (Vst::IHostApplication* h)
: pluginInstance (createPluginFilterOfType (AudioProcessor::wrapperType_VST3).release()), : pluginInstance (createPluginFilterOfType (AudioProcessor::wrapperType_VST3).release()),
host (h)
host (addVSTComSmartPtrOwner (h))
{ {
inParameterChangedCallback = false; inParameterChangedCallback = false;
@@ -2451,7 +2450,7 @@ public:
// and not AudioChannelSet::discreteChannels (2) etc. // and not AudioChannelSet::discreteChannels (2) etc.
jassert (checkBusFormatsAreNotDiscrete()); jassert (checkBusFormatsAreNotDiscrete());
comPluginInstance = VSTComSmartPtr<JuceAudioProcessor> { new JuceAudioProcessor (pluginInstance) };
comPluginInstance = addVSTComSmartPtrOwner (new JuceAudioProcessor (pluginInstance));
zerostruct (processContext); zerostruct (processContext);
@@ -2505,7 +2504,7 @@ public:
//============================================================================== //==============================================================================
tresult PLUGIN_API initialize (FUnknown* hostContext) override tresult PLUGIN_API initialize (FUnknown* hostContext) override
{ {
if (host != hostContext)
if (host.get() != hostContext)
host.loadFrom (hostContext); host.loadFrom (hostContext);
processContext.sampleRate = processSetup.sampleRate; processContext.sampleRate = processSetup.sampleRate;
@@ -2546,10 +2545,10 @@ public:
if (message->getAttributes()->getInt ("JuceVST3EditController", value) == kResultTrue) if (message->getAttributes()->getInt ("JuceVST3EditController", value) == kResultTrue)
{ {
juceVST3EditController = VSTComSmartPtr<JuceVST3EditController> { (JuceVST3EditController*) (pointer_sized_int) value };
juceVST3EditController = addVSTComSmartPtrOwner ((JuceVST3EditController*) (pointer_sized_int) value);
if (juceVST3EditController != nullptr) if (juceVST3EditController != nullptr)
juceVST3EditController->setAudioProcessor (comPluginInstance);
juceVST3EditController->setAudioProcessor (comPluginInstance.get());
else else
jassertfalse; jassertfalse;
} }
@@ -3423,7 +3422,7 @@ public:
tresult PLUGIN_API setupProcessing (Vst::ProcessSetup& newSetup) override tresult PLUGIN_API setupProcessing (Vst::ProcessSetup& newSetup) override
{ {
ScopedInSetupProcessingSetter inSetupProcessingSetter (juceVST3EditController);
ScopedInSetupProcessingSetter inSetupProcessingSetter (juceVST3EditController.get());
if (canProcessSampleSize (newSetup.symbolicSampleSize) != kResultTrue) if (canProcessSampleSize (newSetup.symbolicSampleSize) != kResultTrue)
return kResultFalse; return kResultFalse;
@@ -4121,10 +4120,8 @@ struct JucePluginFactory : public IPluginFactory3
{ {
if (doUIDsMatch (entry.infoW.cid, cid)) if (doUIDsMatch (entry.infoW.cid, cid))
{ {
if (auto* instance = entry.createFunction (host))
if (auto instance = becomeVSTComSmartPtrOwner (entry.createFunction (host.get())))
{ {
const FReleaser releaser (instance);
if (instance->queryInterface (iidToQuery, obj) == kResultOk) if (instance->queryInterface (iidToQuery, obj) == kResultOk)
return kResultOk; return kResultOk;
} }


+ 43
- 13
modules/juce_audio_processors/format_types/juce_VST3Common.h View File

@@ -1172,27 +1172,29 @@ template <class ObjectType>
class VSTComSmartPtr class VSTComSmartPtr
{ {
public: public:
VSTComSmartPtr() noexcept : source (nullptr) {}
VSTComSmartPtr (ObjectType* object, bool autoAddRef = true) noexcept : source (object) { if (source != nullptr && autoAddRef) source->addRef(); }
VSTComSmartPtr() = default;
VSTComSmartPtr (const VSTComSmartPtr& other) noexcept : source (other.source) { if (source != nullptr) source->addRef(); } VSTComSmartPtr (const VSTComSmartPtr& other) noexcept : source (other.source) { if (source != nullptr) source->addRef(); }
~VSTComSmartPtr() { if (source != nullptr) source->release(); } ~VSTComSmartPtr() { if (source != nullptr) source->release(); }
operator ObjectType*() const noexcept { return source; }
ObjectType* get() const noexcept { return source; }
ObjectType& operator*() const noexcept { return *source; }
ObjectType* operator->() const noexcept { return source; }
explicit operator bool() const noexcept { return operator!= (nullptr); }
ObjectType* get() const noexcept { return source; }
ObjectType& operator*() const noexcept { return *source; }
ObjectType* operator->() const noexcept { return source; }
VSTComSmartPtr& operator= (const VSTComSmartPtr& other) { return operator= (other.source); }
VSTComSmartPtr& operator= (ObjectType* const newObjectToTakePossessionOf)
VSTComSmartPtr& operator= (const VSTComSmartPtr& other)
{ {
VSTComSmartPtr p (newObjectToTakePossessionOf);
auto p = other;
std::swap (p.source, source); std::swap (p.source, source);
return *this; return *this;
} }
bool operator== (ObjectType* const other) noexcept { return source == other; }
bool operator!= (ObjectType* const other) noexcept { return source != other; }
VSTComSmartPtr& operator= (std::nullptr_t)
{
return operator= (VSTComSmartPtr{});
}
bool operator== (std::nullptr_t) const noexcept { return source == nullptr; }
bool operator!= (std::nullptr_t) const noexcept { return source != nullptr; }
bool loadFrom (Steinberg::FUnknown* o) bool loadFrom (Steinberg::FUnknown* o)
{ {
@@ -1207,9 +1209,37 @@ public:
return factory->createInstance (uuid, ObjectType::iid, (void**) &source) == Steinberg::kResultOk; return factory->createInstance (uuid, ObjectType::iid, (void**) &source) == Steinberg::kResultOk;
} }
/** Increments refcount. */
static auto addOwner (ObjectType* t)
{
return VSTComSmartPtr (t, true);
}
/** Does not initially increment refcount; assumes t has a positive refcount. */
static auto becomeOwner (ObjectType* t)
{
return VSTComSmartPtr (t, false);
}
private: private:
ObjectType* source;
explicit VSTComSmartPtr (ObjectType* object, bool autoAddRef) noexcept : source (object) { if (source != nullptr && autoAddRef) source->addRef(); }
ObjectType* source = nullptr;
}; };
/** Increments refcount. */
template <class ObjectType>
auto addVSTComSmartPtrOwner (ObjectType* t)
{
return VSTComSmartPtr<ObjectType>::addOwner (t);
}
/** Does not initially increment refcount; assumes t has a positive refcount. */
template <class ObjectType>
auto becomeVSTComSmartPtrOwner (ObjectType* t)
{
return VSTComSmartPtr<ObjectType>::becomeOwner (t);
}
// NOLINTEND(clang-analyzer-cplusplus.NewDelete) // NOLINTEND(clang-analyzer-cplusplus.NewDelete)
//============================================================================== //==============================================================================


+ 82
- 84
modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp View File

@@ -476,7 +476,7 @@ struct VST3HostContext : public Vst::IComponentHandler, // From VST V3.0.0
ItemAndTarget newItem; ItemAndTarget newItem;
newItem.item = item; newItem.item = item;
newItem.target = target;
newItem.target = addVSTComSmartPtrOwner (target);
items.add (newItem); items.add (newItem);
return kResultOk; return kResultOk;
@@ -488,7 +488,7 @@ struct VST3HostContext : public Vst::IComponentHandler, // From VST V3.0.0
{ {
auto& item = items.getReference (i); auto& item = items.getReference (i);
if (item.item.tag == toRemove.tag && item.target == target)
if (item.item.tag == toRemove.tag && item.target.get() == target)
items.remove (i); items.remove (i);
} }
@@ -506,7 +506,7 @@ struct VST3HostContext : public Vst::IComponentHandler, // From VST V3.0.0
result = item.item; result = item.item;
if (target != nullptr) if (target != nullptr)
*target = item.target;
*target = item.target.get();
return kResultTrue; return kResultTrue;
} }
@@ -978,8 +978,8 @@ struct DescriptionLister
{ {
if (component->initialize (host.getFUnknown()) == kResultOk) if (component->initialize (host.getFUnknown()) == kResultOk)
{ {
auto numInputs = getNumSingleDirectionChannelsFor (component, Direction::input);
auto numOutputs = getNumSingleDirectionChannelsFor (component, Direction::output);
auto numInputs = getNumSingleDirectionChannelsFor (component.get(), Direction::input);
auto numOutputs = getNumSingleDirectionChannelsFor (component.get(), Direction::output);
createPluginDescription (desc, file, companyName, name, createPluginDescription (desc, file, companyName, name,
info, info2.get(), infoW.get(), numInputs, numOutputs); info, info2.get(), infoW.get(), numInputs, numOutputs);
@@ -1397,8 +1397,7 @@ private:
//============================================================================== //==============================================================================
bool open (const PluginDescription& description) bool open (const PluginDescription& description)
{ {
VSTComSmartPtr<IPluginFactory> pluginFactory (DLLHandleCache::getInstance()->findOrCreateHandle (file.getFullPathName())
.getPluginFactory());
auto pluginFactory = addVSTComSmartPtrOwner (DLLHandleCache::getInstance()->findOrCreateHandle (file.getFullPathName()).getPluginFactory());
if (pluginFactory != nullptr) if (pluginFactory != nullptr)
{ {
@@ -1504,10 +1503,10 @@ struct VST3PluginWindow final : public AudioProcessorEditor,
private ComponentBoundsConstrainer, private ComponentBoundsConstrainer,
private IPlugFrame private IPlugFrame
{ {
VST3PluginWindow (AudioPluginInstance* owner, IPlugView* pluginView)
VST3PluginWindow (AudioPluginInstance* owner, VSTComSmartPtr<IPlugView> pluginView)
: AudioProcessorEditor (owner), : AudioProcessorEditor (owner),
ComponentMovementWatcher (this), ComponentMovementWatcher (this),
view (pluginView, false)
view (pluginView)
#if JUCE_MAC #if JUCE_MAC
, embeddedComponent (*owner) , embeddedComponent (*owner)
#endif #endif
@@ -1673,7 +1672,7 @@ private:
{ {
const ScopedValueSetter<bool> recursiveResizeSetter (recursiveResize, true); const ScopedValueSetter<bool> recursiveResizeSetter (recursiveResize, true);
if (incomingView != nullptr && newSize != nullptr && incomingView == view)
if (incomingView != nullptr && newSize != nullptr && incomingView == view.get())
{ {
const auto oldPhysicalSize = componentToVST3Rect (getLocalBounds()); const auto oldPhysicalSize = componentToVST3Rect (getLocalBounds());
const auto logicalSize = vst3ToComponentRect (*newSize); const auto logicalSize = vst3ToComponentRect (*newSize);
@@ -1887,7 +1886,7 @@ struct VST3ComponentHolder
{ {
VST3ComponentHolder (const VST3ModuleHandle::Ptr& m) : module (m) VST3ComponentHolder (const VST3ModuleHandle::Ptr& m) : module (m)
{ {
host = new VST3HostContext();
host = addVSTComSmartPtrOwner (new VST3HostContext());
} }
~VST3ComponentHolder() ~VST3ComponentHolder()
@@ -1903,7 +1902,7 @@ struct VST3ComponentHolder
return false; return false;
} }
return VSTComSmartPtr<Vst::IEditController>().loadFrom (component);
return VSTComSmartPtr<Vst::IEditController>().loadFrom (component.get());
} }
bool fetchController (VSTComSmartPtr<Vst::IEditController>& editController) bool fetchController (VSTComSmartPtr<Vst::IEditController>& editController)
@@ -1911,7 +1910,7 @@ struct VST3ComponentHolder
if (! isComponentInitialised && ! initialise()) if (! isComponentInitialised && ! initialise())
return false; return false;
editController.loadFrom (component);
editController.loadFrom (component.get());
// Get the IEditController: // Get the IEditController:
TUID controllerCID = { 0 }; TUID controllerCID = { 0 };
@@ -1920,7 +1919,7 @@ struct VST3ComponentHolder
&& component->getControllerClassId (controllerCID) == kResultTrue && component->getControllerClassId (controllerCID) == kResultTrue
&& FUID (controllerCID).isValid()) && FUID (controllerCID).isValid())
{ {
editController.loadFrom (factory, controllerCID);
editController.loadFrom (factory.get(), controllerCID);
} }
if (editController == nullptr) if (editController == nullptr)
@@ -1934,7 +1933,7 @@ struct VST3ComponentHolder
factory->getClassInfo (i, &classInfo); factory->getClassInfo (i, &classInfo);
if (std::strcmp (classInfo.category, kVstComponentControllerClass) == 0) if (std::strcmp (classInfo.category, kVstComponentControllerClass) == 0)
editController.loadFrom (factory, classInfo.cid);
editController.loadFrom (factory.get(), classInfo.cid);
} }
} }
@@ -1963,7 +1962,7 @@ struct VST3ComponentHolder
std::unique_ptr<PClassInfo2> info2; std::unique_ptr<PClassInfo2> info2;
std::unique_ptr<PClassInfoW> infoW; std::unique_ptr<PClassInfoW> infoW;
if (pf2.loadFrom (factory))
if (pf2.loadFrom (factory.get()))
{ {
info2.reset (new PClassInfo2()); info2.reset (new PClassInfo2());
pf2->getClassInfo2 (classIdx, info2.get()); pf2->getClassInfo2 (classIdx, info2.get());
@@ -1973,7 +1972,7 @@ struct VST3ComponentHolder
info2.reset(); info2.reset();
} }
if (pf3.loadFrom (factory))
if (pf3.loadFrom (factory.get()))
{ {
pf3->setHostContext (host->getFUnknown()); pf3->setHostContext (host->getFUnknown());
infoW.reset (new PClassInfoW()); infoW.reset (new PClassInfoW());
@@ -2003,7 +2002,7 @@ struct VST3ComponentHolder
totalNumInputChannels, totalNumInputChannels,
totalNumOutputChannels); totalNumOutputChannels);
description.hasARAExtension = hasARAExtension (factory, description.name);
description.hasARAExtension = hasARAExtension (factory.get(), description.name);
return; return;
} }
@@ -2022,7 +2021,7 @@ struct VST3ComponentHolder
// initialisation are only called from the message thread. // initialisation are only called from the message thread.
JUCE_ASSERT_MESSAGE_THREAD JUCE_ASSERT_MESSAGE_THREAD
factory = VSTComSmartPtr<IPluginFactory> (module->getPluginFactory());
factory = addVSTComSmartPtrOwner (module->getPluginFactory());
int classIdx; int classIdx;
if ((classIdx = getClassIndex (module->getName())) < 0) if ((classIdx = getClassIndex (module->getName())) < 0)
@@ -2032,7 +2031,7 @@ struct VST3ComponentHolder
if (factory->getClassInfo (classIdx, &info) != kResultOk) if (factory->getClassInfo (classIdx, &info) != kResultOk)
return false; return false;
if (! component.loadFrom (factory, info.cid) || component == nullptr)
if (! component.loadFrom (factory.get(), info.cid) || component == nullptr)
return false; return false;
cidOfComponent = FUID (info.cid); cidOfComponent = FUID (info.cid);
@@ -2161,7 +2160,7 @@ class ParameterChanges : public Vst::IParameterChanges
struct Entry struct Entry
{ {
explicit Entry (std::unique_ptr<ParamValueQueue> queue) : ptr (queue.release()) {}
explicit Entry (std::unique_ptr<ParamValueQueue> queue) : ptr (addVSTComSmartPtrOwner (queue.release())) {}
VSTComSmartPtr<ParamValueQueue> ptr; VSTComSmartPtr<ParamValueQueue> ptr;
Steinberg::int32 index = notInVector; Steinberg::int32 index = notInVector;
@@ -2411,8 +2410,8 @@ public:
if (editControllerConnection != nullptr && componentConnection != nullptr) if (editControllerConnection != nullptr && componentConnection != nullptr)
{ {
editControllerConnection->disconnect (componentConnection);
componentConnection->disconnect (editControllerConnection);
editControllerConnection->disconnect (componentConnection.get());
componentConnection->disconnect (editControllerConnection.get());
} }
editController->setComponentHandler (nullptr); editController->setComponentHandler (nullptr);
@@ -2455,7 +2454,7 @@ public:
editController->initialize (holder->host->getFUnknown()); editController->initialize (holder->host->getFUnknown());
isControllerInitialised = true; isControllerInitialised = true;
editController->setComponentHandler (holder->host);
editController->setComponentHandler (holder->host.get());
grabInformationObjects(); grabInformationObjects();
interconnectComponentAndController(); interconnectComponentAndController();
@@ -2488,7 +2487,7 @@ public:
{ {
explicit Extensions (const VST3PluginInstance* instanceIn) : instance (instanceIn) {} explicit Extensions (const VST3PluginInstance* instanceIn) : instance (instanceIn) {}
Steinberg::Vst::IComponent* getIComponentPtr() const noexcept override { return instance->holder->component; }
Steinberg::Vst::IComponent* getIComponentPtr() const noexcept override { return instance->holder->component.get(); }
MemoryBlock getPreset() const override { return instance->getStateForPresetFile(); } MemoryBlock getPreset() const override { return instance->getStateForPresetFile(); }
@@ -2514,7 +2513,7 @@ public:
} }
} }
void* getPlatformSpecificData() override { return holder->component; }
void* getPlatformSpecificData() override { return holder->component.get(); }
void updateMidiMappings() void updateMidiMappings()
{ {
@@ -2540,7 +2539,7 @@ public:
const auto numBuses = getBusCount (isInput); const auto numBuses = getBusCount (isInput);
for (auto i = 0; i < numBuses; ++i) for (auto i = 0; i < numBuses; ++i)
result.push_back (getArrangementForBus (processor, isInput, i));
result.push_back (getArrangementForBus (processor.get(), isInput, i));
return result; return result;
} }
@@ -2734,8 +2733,8 @@ public:
data.symbolicSampleSize = sampleSize; data.symbolicSampleSize = sampleSize;
data.numInputs = numInputAudioBuses; data.numInputs = numInputAudioBuses;
data.numOutputs = numOutputAudioBuses; data.numOutputs = numOutputAudioBuses;
data.inputParameterChanges = inputParameterChanges;
data.outputParameterChanges = outputParameterChanges;
data.inputParameterChanges = inputParameterChanges.get();
data.outputParameterChanges = outputParameterChanges.get();
data.numSamples = (Steinberg::int32) numSamples; data.numSamples = (Steinberg::int32) numSamples;
updateTimingInformation (data, getSampleRate()); updateTimingInformation (data, getSampleRate());
@@ -2873,8 +2872,8 @@ public:
{ {
if (trackInfoListener != nullptr) if (trackInfoListener != nullptr)
{ {
VSTComSmartPtr<Vst::IAttributeList> l (new TrackPropertiesAttributeList (properties));
trackInfoListener->setChannelContextInfos (l);
auto l = addVSTComSmartPtrOwner (new TrackPropertiesAttributeList (properties));
trackInfoListener->setChannelContextInfos (l.get());
} }
} }
@@ -2931,7 +2930,7 @@ public:
//============================================================================== //==============================================================================
String getChannelName (int channelIndex, Direction direction) const String getChannelName (int channelIndex, Direction direction) const
{ {
auto numBuses = getNumSingleDirectionBusesFor (holder->component, MediaKind::audio, direction);
auto numBuses = getNumSingleDirectionBusesFor (holder->component.get(), MediaKind::audio, direction);
int numCountedChannels = 0; int numCountedChannels = 0;
@@ -2996,7 +2995,7 @@ public:
//============================================================================== //==============================================================================
AudioProcessorEditor* createEditor() override AudioProcessorEditor* createEditor() override
{ {
if (auto* view = tryCreatingView())
if (auto view = becomeVSTComSmartPtrOwner (tryCreatingView()))
return new VST3PluginWindow (this, view); return new VST3PluginWindow (this, view);
return nullptr; return nullptr;
@@ -3008,7 +3007,7 @@ public:
if (getActiveEditor() != nullptr) if (getActiveEditor() != nullptr)
return true; return true;
VSTComSmartPtr<IPlugView> view (tryCreatingView(), false);
auto view = becomeVSTComSmartPtrOwner (tryCreatingView());
return view != nullptr; return view != nullptr;
} }
@@ -3090,7 +3089,7 @@ public:
auto componentStream (createMemoryStreamForState (*head, "IComponent")); auto componentStream (createMemoryStreamForState (*head, "IComponent"));
if (componentStream != nullptr && holder->component != nullptr) if (componentStream != nullptr && holder->component != nullptr)
holder->component->setState (componentStream);
holder->component->setState (componentStream.get());
if (editController != nullptr) if (editController != nullptr)
{ {
@@ -3104,7 +3103,7 @@ public:
auto controllerStream (createMemoryStreamForState (*head, "IEditController")); auto controllerStream (createMemoryStreamForState (*head, "IEditController"));
if (controllerStream != nullptr) if (controllerStream != nullptr)
editController->setState (controllerStream);
editController->setState (controllerStream.get());
} }
} }
} }
@@ -3129,15 +3128,15 @@ public:
MemoryBlock getStateForPresetFile() const MemoryBlock getStateForPresetFile() const
{ {
VSTComSmartPtr<Steinberg::MemoryStream> memoryStream (new Steinberg::MemoryStream(), false);
auto memoryStream = becomeVSTComSmartPtrOwner (new Steinberg::MemoryStream());
if (memoryStream == nullptr || holder->component == nullptr) if (memoryStream == nullptr || holder->component == nullptr)
return {}; return {};
const auto saved = Steinberg::Vst::PresetFile::savePreset (memoryStream,
const auto saved = Steinberg::Vst::PresetFile::savePreset (memoryStream.get(),
holder->cidOfComponent, holder->cidOfComponent,
holder->component,
editController);
holder->component.get(),
editController.get());
if (saved) if (saved)
return { memoryStream->getData(), static_cast<size_t> (memoryStream->getSize()) }; return { memoryStream->getData(), static_cast<size_t> (memoryStream->getSize()) };
@@ -3148,13 +3147,13 @@ public:
bool setStateFromPresetFile (const MemoryBlock& rawData) const bool setStateFromPresetFile (const MemoryBlock& rawData) const
{ {
auto rawDataCopy = rawData; auto rawDataCopy = rawData;
VSTComSmartPtr<Steinberg::MemoryStream> memoryStream (new Steinberg::MemoryStream (rawDataCopy.getData(), (int) rawDataCopy.getSize()), false);
auto memoryStream = becomeVSTComSmartPtrOwner (new Steinberg::MemoryStream (rawDataCopy.getData(), (int) rawDataCopy.getSize()));
if (memoryStream == nullptr || holder->component == nullptr) if (memoryStream == nullptr || holder->component == nullptr)
return false; return false;
return Steinberg::Vst::PresetFile::loadPreset (memoryStream, holder->cidOfComponent,
holder->component, editController, nullptr);
return Steinberg::Vst::PresetFile::loadPreset (memoryStream.get(), holder->cidOfComponent,
holder->component.get(), editController.get(), nullptr);
} }
//============================================================================== //==============================================================================
@@ -3267,37 +3266,38 @@ private:
if (mem.fromBase64Encoding (state->getAllSubText())) if (mem.fromBase64Encoding (state->getAllSubText()))
{ {
VSTComSmartPtr<Steinberg::MemoryStream> stream (new Steinberg::MemoryStream(), false);
auto stream = becomeVSTComSmartPtrOwner (new Steinberg::MemoryStream());
stream->setSize ((TSize) mem.getSize()); stream->setSize ((TSize) mem.getSize());
mem.copyTo (stream->getData(), 0, mem.getSize()); mem.copyTo (stream->getData(), 0, mem.getSize());
return stream; return stream;
} }
} }
return nullptr;
return {};
} }
CachedParamValues cachedParamValues; CachedParamValues cachedParamValues;
VSTComSmartPtr<ParameterChanges> inputParameterChanges { new ParameterChanges };
VSTComSmartPtr<ParameterChanges> outputParameterChanges { new ParameterChanges };
VSTComSmartPtr<MidiEventList> midiInputs { new MidiEventList }, midiOutputs { new MidiEventList };
VSTComSmartPtr<ParameterChanges> inputParameterChanges = addVSTComSmartPtrOwner (new ParameterChanges);
VSTComSmartPtr<ParameterChanges> outputParameterChanges = addVSTComSmartPtrOwner (new ParameterChanges);
VSTComSmartPtr<MidiEventList> midiInputs = addVSTComSmartPtrOwner (new MidiEventList);
VSTComSmartPtr<MidiEventList> midiOutputs = addVSTComSmartPtrOwner (new MidiEventList);
Vst::ProcessContext timingInfo; //< Only use this in processBlock()! Vst::ProcessContext timingInfo; //< Only use this in processBlock()!
bool isControllerInitialised = false, isActive = false, lastProcessBlockCallWasBypass = false; bool isControllerInitialised = false, isActive = false, lastProcessBlockCallWasBypass = false;
const bool hasMidiInput = getNumSingleDirectionBusesFor (holder->component, MediaKind::event, Direction::input) > 0,
hasMidiOutput = getNumSingleDirectionBusesFor (holder->component, MediaKind::event, Direction::output) > 0;
const bool hasMidiInput = getNumSingleDirectionBusesFor (holder->component.get(), MediaKind::event, Direction::input) > 0,
hasMidiOutput = getNumSingleDirectionBusesFor (holder->component.get(), MediaKind::event, Direction::output) > 0;
VST3Parameter* bypassParam = nullptr; VST3Parameter* bypassParam = nullptr;
//============================================================================== //==============================================================================
/** Some plugins need to be "connected" to intercommunicate between their implemented classes */ /** Some plugins need to be "connected" to intercommunicate between their implemented classes */
void interconnectComponentAndController() void interconnectComponentAndController()
{ {
componentConnection.loadFrom (holder->component);
editControllerConnection.loadFrom (editController);
componentConnection.loadFrom (holder->component.get());
editControllerConnection.loadFrom (editController.get());
if (componentConnection != nullptr && editControllerConnection != nullptr) if (componentConnection != nullptr && editControllerConnection != nullptr)
{ {
warnOnFailure (componentConnection->connect (editControllerConnection));
warnOnFailure (editControllerConnection->connect (componentConnection));
warnOnFailure (componentConnection->connect (editControllerConnection.get()));
warnOnFailure (editControllerConnection->connect (componentConnection.get()));
} }
} }
@@ -3396,31 +3396,31 @@ private:
void grabInformationObjects() void grabInformationObjects()
{ {
processor.loadFrom (holder->component);
unitInfo.loadFrom (holder->component);
programListData.loadFrom (holder->component);
unitData.loadFrom (holder->component);
editController2.loadFrom (holder->component);
midiMapping.loadFrom (holder->component);
componentHandler.loadFrom (holder->component);
componentHandler2.loadFrom (holder->component);
trackInfoListener.loadFrom (holder->component);
if (processor == nullptr) processor.loadFrom (editController);
if (unitInfo == nullptr) unitInfo.loadFrom (editController);
if (programListData == nullptr) programListData.loadFrom (editController);
if (unitData == nullptr) unitData.loadFrom (editController);
if (editController2 == nullptr) editController2.loadFrom (editController);
if (midiMapping == nullptr) midiMapping.loadFrom (editController);
if (componentHandler == nullptr) componentHandler.loadFrom (editController);
if (componentHandler2 == nullptr) componentHandler2.loadFrom (editController);
if (trackInfoListener == nullptr) trackInfoListener.loadFrom (editController);
processor.loadFrom (holder->component.get());
unitInfo.loadFrom (holder->component.get());
programListData.loadFrom (holder->component.get());
unitData.loadFrom (holder->component.get());
editController2.loadFrom (holder->component.get());
midiMapping.loadFrom (holder->component.get());
componentHandler.loadFrom (holder->component.get());
componentHandler2.loadFrom (holder->component.get());
trackInfoListener.loadFrom (holder->component.get());
if (processor == nullptr) processor.loadFrom (editController.get());
if (unitInfo == nullptr) unitInfo.loadFrom (editController.get());
if (programListData == nullptr) programListData.loadFrom (editController.get());
if (unitData == nullptr) unitData.loadFrom (editController.get());
if (editController2 == nullptr) editController2.loadFrom (editController.get());
if (midiMapping == nullptr) midiMapping.loadFrom (editController.get());
if (componentHandler == nullptr) componentHandler.loadFrom (editController.get());
if (componentHandler2 == nullptr) componentHandler2.loadFrom (editController.get());
if (trackInfoListener == nullptr) trackInfoListener.loadFrom (editController.get());
} }
void setStateForAllMidiBuses (bool newState) void setStateForAllMidiBuses (bool newState)
{ {
setStateForAllEventBuses (holder->component, newState, Direction::input);
setStateForAllEventBuses (holder->component, newState, Direction::output);
setStateForAllEventBuses (holder->component.get(), newState, Direction::input);
setStateForAllEventBuses (holder->component.get(), newState, Direction::output);
} }
std::vector<ChannelMapping> createChannelMappings (bool isInput) const std::vector<ChannelMapping> createChannelMappings (bool isInput) const
@@ -3559,8 +3559,8 @@ private:
}); });
} }
destination.inputEvents = midiInputs;
destination.outputEvents = midiOutputs;
destination.inputEvents = midiInputs.get();
destination.outputEvents = midiOutputs.get();
} }
void updateTimingInformation (Vst::ProcessData& destination, double processSampleRate) void updateTimingInformation (Vst::ProcessData& destination, double processSampleRate)
@@ -3836,7 +3836,7 @@ tresult VST3HostContext::ContextMenu::popup (Steinberg::UCoord x, Steinberg::UCo
// Unfortunately, Steinberg's docs explicitly say this should be modal.. // Unfortunately, Steinberg's docs explicitly say this should be modal..
handleResult (topLevelMenu->showMenu (options)); handleResult (topLevelMenu->showMenu (options));
#else #else
topLevelMenu->showMenuAsync (options, ModalCallbackFunction::create (menuFinished, VSTComSmartPtr<ContextMenu> (this)));
topLevelMenu->showMenuAsync (options, ModalCallbackFunction::create (menuFinished, addVSTComSmartPtrOwner (this)));
#endif #endif
return kResultOk; return kResultOk;
@@ -3885,13 +3885,12 @@ void VST3PluginFormat::findAllTypesForFile (OwnedArray<PluginDescription>& resul
for every housed plugin. for every housed plugin.
*/ */
VSTComSmartPtr<IPluginFactory> pluginFactory (DLLHandleCache::getInstance()->findOrCreateHandle (file)
.getPluginFactory());
auto pluginFactory = addVSTComSmartPtrOwner (DLLHandleCache::getInstance()->findOrCreateHandle (file).getPluginFactory());
if (pluginFactory == nullptr) if (pluginFactory == nullptr)
continue; continue;
VSTComSmartPtr<VST3HostContext> host (new VST3HostContext());
auto host = addVSTComSmartPtrOwner (new VST3HostContext());
for (const auto& d : DescriptionLister::findDescriptionsSlow (*host, *pluginFactory, File (file))) for (const auto& d : DescriptionLister::findDescriptionsSlow (*host, *pluginFactory, File (file)))
results.add (new PluginDescription (d)); results.add (new PluginDescription (d));
@@ -3907,11 +3906,10 @@ void VST3PluginFormat::createARAFactoryAsync (const PluginDescription& descripti
} }
File file (description.fileOrIdentifier); File file (description.fileOrIdentifier);
VSTComSmartPtr<IPluginFactory> pluginFactory (
DLLHandleCache::getInstance()->findOrCreateHandle (file.getFullPathName()).getPluginFactory());
auto pluginFactory = addVSTComSmartPtrOwner (DLLHandleCache::getInstance()->findOrCreateHandle (file.getFullPathName()).getPluginFactory());
const auto* pluginName = description.name.toRawUTF8(); const auto* pluginName = description.name.toRawUTF8();
callback ({ ARAFactoryWrapper { ::juce::getARAFactory (pluginFactory, pluginName) }, {} });
callback ({ ARAFactoryWrapper { ::juce::getARAFactory (pluginFactory.get(), pluginName) }, {} });
} }
static std::unique_ptr<AudioPluginInstance> createVST3Instance (VST3PluginFormat& format, static std::unique_ptr<AudioPluginInstance> createVST3Instance (VST3PluginFormat& format,


Loading…
Cancel
Save