Files
hot-step-cpp-ROCm/engine/vendor/vst3sdk/public.sdk/source/main/pluginfactory.h
T
2026-08-16 18:24:52 +07:00

192 lines
8.2 KiB
C++

//------------------------------------------------------------------------
// Project : SDK Core
//
// Category : Common Base Classes
// Filename : public.sdk/source/main/pluginfactory.h
// Created by : Steinberg, 01/2004
// Description : Standard Plug-In Factory
//
//-----------------------------------------------------------------------------
// This file is part of a Steinberg SDK. It is subject to the license terms
// in the LICENSE file found in the top-level directory of this distribution
// and at www.steinberg.net/sdklicenses.
// No part of the SDK, including this file, may be copied, modified, propagated,
// or distributed except according to the terms contained in the LICENSE file.
//-----------------------------------------------------------------------------
#pragma once
#include "pluginterfaces/base/ipluginbase.h"
#include <vector>
namespace Steinberg {
//------------------------------------------------------------------------
class IPluginFactoryInternal : public FUnknown
{
public:
using HostContextCallbackFunc = void (*) (FUnknown*);
virtual void PLUGIN_API addHostContextCallback (HostContextCallbackFunc func) = 0;
//------------------------------------------------------------------------
static const FUID iid;
};
DECLARE_CLASS_IID (IPluginFactoryInternal, 0x5A6AD11A, 0x22AF40F3, 0xBCA1C147, 0x506C88D9)
//------------------------------------------------------------------------
/** Default Class Factory implementation.
\ingroup sdkBase
\see classFactoryMacros
*/
class CPluginFactory : public IPluginFactory3, public IPluginFactoryInternal
{
public:
//------------------------------------------------------------------------
CPluginFactory (const PFactoryInfo& info);
virtual ~CPluginFactory ();
//--- ---------------------------------------------------------------------
/** Registers a plug-in class with classInfo version 1, returns true for success. */
bool registerClass (const PClassInfo* info, FUnknown* (*createFunc) (void*),
void* context = nullptr);
/** Registers a plug-in class with classInfo version 2, returns true for success. */
bool registerClass (const PClassInfo2* info, FUnknown* (*createFunc) (void*),
void* context = nullptr);
/** Registers a plug-in class with classInfo Unicode version, returns true for success. */
bool registerClass (const PClassInfoW* info, FUnknown* (*createFunc) (void*),
void* context = nullptr);
/** Check if a class for a given classId is already registered. */
bool isClassRegistered (const FUID& cid);
/** Remove all classes (no class exported) */
void removeAllClasses ();
//------------------------------------------------------------------------
DECLARE_FUNKNOWN_METHODS
//---from IPluginFactory------
tresult PLUGIN_API getFactoryInfo (PFactoryInfo* info) SMTG_OVERRIDE;
int32 PLUGIN_API countClasses () SMTG_OVERRIDE;
tresult PLUGIN_API getClassInfo (int32 index, PClassInfo* info) SMTG_OVERRIDE;
tresult PLUGIN_API createInstance (FIDString cid, FIDString _iid, void** obj) SMTG_OVERRIDE;
//---from IPluginFactory2-----
tresult PLUGIN_API getClassInfo2 (int32 index, PClassInfo2* info) SMTG_OVERRIDE;
//---from IPluginFactory3-----
tresult PLUGIN_API getClassInfoUnicode (int32 index, PClassInfoW* info) SMTG_OVERRIDE;
tresult PLUGIN_API setHostContext (FUnknown* context) SMTG_OVERRIDE;
//---from IPluginFactoryInternal
void PLUGIN_API addHostContextCallback (HostContextCallbackFunc func) SMTG_OVERRIDE;
//------------------------------------------------------------------------
protected:
/// @cond
struct PClassEntry
{
//-----------------------------------
PClassInfo2 info8;
PClassInfoW info16;
FUnknown* (*createFunc) (void*);
void* context;
bool isUnicode;
//-----------------------------------
};
/// @endcond
PFactoryInfo factoryInfo;
PClassEntry* classes;
int32 classCount;
int32 maxClassCount;
std::vector<HostContextCallbackFunc> hostContextCallbacks;
bool growClasses ();
};
extern CPluginFactory* gPluginFactory;
//------------------------------------------------------------------------
} // namespace Steinberg
//------------------------------------------------------------------------
/** \defgroup classFactoryMacros Macros for defining the class factory
\ingroup sdkBase
\b Example - How to use the class factory macros:
\code
BEGIN_FACTORY ("Steinberg Technologies",
"http://www.steinberg.de",
"mailto:info@steinberg.de",
PFactoryInfo::kNoFlags)
DEF_CLASS (INLINE_UID (0x00000000, 0x00000000, 0x00000000, 0x00000000),
PClassInfo::kManyInstances,
"Service",
"Test Service",
TestService::newInstance)
END_FACTORY
\endcode
@{*/
#define BEGIN_FACTORY_CLASS(FactoryClass,vendor,url,email,flags) using namespace Steinberg; \
SMTG_EXPORT_SYMBOL IPluginFactory* PLUGIN_API GetPluginFactory () { \
if (!gPluginFactory) \
{ static PFactoryInfo factoryInfo (vendor,url,email,flags); \
gPluginFactory = new FactoryClass (factoryInfo); \
#define BEGIN_FACTORY(vendor,url,email,flags) using namespace Steinberg; \
SMTG_EXPORT_SYMBOL IPluginFactory* PLUGIN_API GetPluginFactory () { \
if (!gPluginFactory) \
{ static PFactoryInfo factoryInfo (vendor,url,email,flags); \
gPluginFactory = new CPluginFactory (factoryInfo); \
#define DEF_CLASS(cid,cardinality,category,name,createMethod) \
{ TUID lcid = cid; static PClassInfo componentClass (lcid,cardinality,category,name); \
gPluginFactory->registerClass (&componentClass,createMethod); }
#define DEF_CLASS1(cid,cardinality,category,name,createMethod) \
{ static PClassInfo componentClass (cid,cardinality,category,name); \
gPluginFactory->registerClass (&componentClass,createMethod); }
#define DEF_CLASS2(cid,cardinality,category,name,classFlags,subCategories,version,sdkVersion,createMethod) \
{ TUID lcid = cid; static PClassInfo2 componentClass (lcid,cardinality,category,name,classFlags,subCategories,nullptr,version,sdkVersion);\
gPluginFactory->registerClass (&componentClass,createMethod); }
#define DEF_CLASS_W(cid,cardinality,category,name,classFlags,subCategories,version,sdkVersion,createMethod) \
{ TUID lcid = cid; static PClassInfoW componentClass (lcid,cardinality,category,name,classFlags,subCategories,nullptr,version,sdkVersion);\
gPluginFactory->registerClass (&componentClass,createMethod); }
#define DEF_CLASS_W2(cid,cardinality,category,name,classFlags,subCategories,vendor,version,sdkVersion,createMethod) \
{ TUID lcid = cid; static PClassInfoW componentClass (lcid,cardinality,category,name,classFlags,subCategories,vendor,version,sdkVersion);\
gPluginFactory->registerClass (&componentClass,createMethod); }
#define END_FACTORY } else gPluginFactory->addRef (); \
return gPluginFactory; }
#define DEF_VST3_CLASS(pluginName, pluginVst3Categories, classFlags, pluginVersion, processorCID, \
processorCreateFunc, controllerCID, controllerCreateFunc) \
{ \
{ \
const Steinberg::TUID lcid = processorCID; \
static Steinberg::PClassInfo2 processorClass ( \
lcid, Steinberg::PClassInfo::kManyInstances, kVstAudioEffectClass, pluginName, \
classFlags, pluginVst3Categories, 0, pluginVersion, kVstVersionString); \
gPluginFactory->registerClass (&processorClass, processorCreateFunc); \
} \
{ \
const Steinberg::TUID lcid = controllerCID; \
static Steinberg::PClassInfo2 controllerClass ( \
lcid, Steinberg::PClassInfo::kManyInstances, kVstComponentControllerClass, \
pluginName, 0, "", 0, pluginVersion, kVstVersionString); \
gPluginFactory->registerClass (&controllerClass, controllerCreateFunc); \
} \
}
/** @} */