437 lines
16 KiB
C++
437 lines
16 KiB
C++
//-----------------------------------------------------------------------------
|
|
// Project : SDK Core
|
|
//
|
|
// Category : SDK Core Interfaces
|
|
// Filename : pluginterfaces/base/ipluginbase.h
|
|
// Created by : Steinberg, 01/2004
|
|
// Description : Basic Plug-in Interfaces
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
// 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 "funknown.h"
|
|
#include "fstrdefs.h"
|
|
|
|
namespace Steinberg {
|
|
|
|
//------------------------------------------------------------------------
|
|
/** Basic interface to a Plug-in component.
|
|
\ingroup pluginBase
|
|
- [plug imp]
|
|
- initialize/terminate the Plug-in component
|
|
|
|
The host uses this interface to initialize and to terminate the Plug-in component.
|
|
The context that is passed to the initialize method contains any interface to the
|
|
host that the Plug-in will need to work. These interfaces can vary from category to category.
|
|
A list of supported host context interfaces should be included in the documentation
|
|
of a specific category. */
|
|
//------------------------------------------------------------------------
|
|
class IPluginBase: public FUnknown
|
|
{
|
|
public:
|
|
//------------------------------------------------------------------------
|
|
/** The host passes a number of interfaces as context to initialize the Plug-in class.
|
|
@note Extensive memory allocations etc. should be performed in this method rather than in the class' constructor!
|
|
If the method does NOT return kResultOk, the object is released immediately. In this case terminate is not called! */
|
|
virtual tresult PLUGIN_API initialize (FUnknown* context) = 0;
|
|
|
|
/** This function is called before the Plug-in is unloaded and can be used for
|
|
cleanups. You have to release all references to any host application interfaces. */
|
|
virtual tresult PLUGIN_API terminate () = 0;
|
|
|
|
//------------------------------------------------------------------------
|
|
static const FUID iid;
|
|
};
|
|
|
|
DECLARE_CLASS_IID (IPluginBase, 0x22888DDB, 0x156E45AE, 0x8358B348, 0x08190625)
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
/** Basic Information about the class factory of the Plug-in.
|
|
\ingroup pluginBase
|
|
*/
|
|
//------------------------------------------------------------------------
|
|
struct PFactoryInfo
|
|
{
|
|
//------------------------------------------------------------------------
|
|
enum FactoryFlags
|
|
{
|
|
kNoFlags = 0, ///< Nothing
|
|
kClassesDiscardable = 1 << 0, ///< The number of exported classes can change each time the Module is loaded. If this flag is set, the host does not cache class information. This leads to a longer startup time because the host always has to load the Module to get the current class information.
|
|
kLicenseCheck = 1 << 1, ///< Class IDs of components are interpreted as Syncrosoft-License (LICENCE_UID). Loaded in a Steinberg host, the module will not be loaded when the license is not valid
|
|
kComponentNonDiscardable = 1 << 3, ///< Component won't be unloaded until process exit
|
|
kUnicode = 1 << 4 ///< Components have entirely unicode encoded strings. (True for VST 3 Plug-ins so far)
|
|
};
|
|
|
|
enum
|
|
{
|
|
kURLSize = 256,
|
|
kEmailSize = 128,
|
|
kNameSize = 64
|
|
};
|
|
|
|
//------------------------------------------------------------------------
|
|
char8 vendor[kNameSize]; ///< e.g. "Steinberg Media Technologies"
|
|
char8 url[kURLSize]; ///< e.g. "http://www.steinberg.de"
|
|
char8 email[kEmailSize]; ///< e.g. "info@steinberg.de"
|
|
int32 flags; ///< (see above)
|
|
//------------------------------------------------------------------------
|
|
PFactoryInfo (const char8* _vendor, const char8* _url, const char8* _email, int32 _flags)
|
|
{
|
|
strncpy8 (vendor, _vendor, kNameSize);
|
|
strncpy8 (url, _url, kURLSize);
|
|
strncpy8 (email, _email, kEmailSize);
|
|
flags = _flags;
|
|
#ifdef UNICODE
|
|
flags |= kUnicode;
|
|
#endif
|
|
}
|
|
#if SMTG_CPP11
|
|
constexpr PFactoryInfo () : vendor (), url (), email (), flags () {}
|
|
#else
|
|
PFactoryInfo () { memset (this, 0, sizeof (PFactoryInfo)); }
|
|
#endif
|
|
};
|
|
|
|
//------------------------------------------------------------------------
|
|
/** Basic Information about a class provided by the Plug-in.
|
|
\ingroup pluginBase
|
|
*/
|
|
//------------------------------------------------------------------------
|
|
struct PClassInfo
|
|
{
|
|
//------------------------------------------------------------------------
|
|
enum ClassCardinality
|
|
{
|
|
kManyInstances = 0x7FFFFFFF
|
|
};
|
|
|
|
enum
|
|
{
|
|
kCategorySize = 32,
|
|
kNameSize = 64
|
|
};
|
|
//------------------------------------------------------------------------
|
|
TUID cid; ///< Class ID 16 Byte class GUID
|
|
int32 cardinality; ///< cardinality of the class, set to kManyInstances (see \ref ClassCardinality)
|
|
char8 category[kCategorySize]; ///< class category, host uses this to categorize interfaces
|
|
char8 name[kNameSize]; ///< class name, visible to the user
|
|
//------------------------------------------------------------------------
|
|
|
|
PClassInfo (const TUID _cid, int32 _cardinality, const char8* _category, const char8* _name)
|
|
{
|
|
memset (this, 0, sizeof (PClassInfo));
|
|
memcpy (cid, _cid, sizeof (TUID));
|
|
if (_category)
|
|
strncpy8 (category, _category, kCategorySize);
|
|
if (_name)
|
|
strncpy8 (name, _name, kNameSize);
|
|
cardinality = _cardinality;
|
|
}
|
|
#if SMTG_CPP11
|
|
constexpr PClassInfo () : cid (), cardinality (), category (), name () {}
|
|
#else
|
|
PClassInfo () { memset (this, 0, sizeof (PClassInfo)); }
|
|
#endif
|
|
};
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
// IPluginFactory interface declaration
|
|
//------------------------------------------------------------------------
|
|
/** Class factory that any Plug-in defines for creating class instances.
|
|
\ingroup pluginBase
|
|
- [plug imp]
|
|
|
|
From the host's point of view a Plug-in module is a factory which can create
|
|
a certain kind of object(s). The interface IPluginFactory provides methods
|
|
to get information about the classes exported by the Plug-in and a
|
|
mechanism to create instances of these classes (that usually define the IPluginBase interface).
|
|
|
|
<b> An implementation is provided in public.sdk/source/common/pluginfactory.cpp </b>
|
|
\see GetPluginFactory
|
|
*/
|
|
//------------------------------------------------------------------------
|
|
class IPluginFactory : public FUnknown
|
|
{
|
|
public:
|
|
//------------------------------------------------------------------------
|
|
/** Fill a PFactoryInfo structure with information about the Plug-in vendor. */
|
|
virtual tresult PLUGIN_API getFactoryInfo (PFactoryInfo* info) = 0;
|
|
|
|
/** Returns the number of exported classes by this factory.
|
|
If you are using the CPluginFactory implementation provided by the SDK, it returns the number of classes you registered with CPluginFactory::registerClass. */
|
|
virtual int32 PLUGIN_API countClasses () = 0;
|
|
|
|
/** Fill a PClassInfo structure with information about the class at the specified index. */
|
|
virtual tresult PLUGIN_API getClassInfo (int32 index, PClassInfo* info) = 0;
|
|
|
|
/** Create a new class instance. */
|
|
virtual tresult PLUGIN_API createInstance (FIDString cid, FIDString _iid, void** obj) = 0;
|
|
|
|
//------------------------------------------------------------------------
|
|
static const FUID iid;
|
|
};
|
|
|
|
DECLARE_CLASS_IID (IPluginFactory, 0x7A4D811C, 0x52114A1F, 0xAED9D2EE, 0x0B43BF9F)
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
/** Version 2 of Basic Information about a class provided by the Plug-in.
|
|
\ingroup pluginBase
|
|
*/
|
|
//------------------------------------------------------------------------
|
|
struct PClassInfo2
|
|
{
|
|
//------------------------------------------------------------------------
|
|
TUID cid; ///< Class ID 16 Byte class GUID
|
|
int32 cardinality; ///< cardinality of the class, set to kManyInstances (see \ref ClassCardinality)
|
|
char8 category[PClassInfo::kCategorySize]; ///< class category, host uses this to categorize interfaces
|
|
char8 name[PClassInfo::kNameSize]; ///< class name, visible to the user
|
|
|
|
enum {
|
|
kVendorSize = 64,
|
|
kVersionSize = 64,
|
|
kSubCategoriesSize = 128
|
|
};
|
|
|
|
uint32 classFlags; ///< flags used for a specific category, must be defined where category is defined
|
|
char8 subCategories[kSubCategoriesSize]; ///< module specific subcategories, can be more than one, logically added by the \c OR operator
|
|
char8 vendor[kVendorSize]; ///< overwrite vendor information from factory info
|
|
char8 version[kVersionSize]; ///< Version string (e.g. "1.0.0.512" with Major.Minor.Subversion.Build)
|
|
char8 sdkVersion[kVersionSize]; ///< SDK version used to build this class (e.g. "VST 3.0")
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
PClassInfo2 (const TUID _cid, int32 _cardinality, const char8* _category, const char8* _name,
|
|
int32 _classFlags, const char8* _subCategories, const char8* _vendor, const char8* _version,
|
|
const char8* _sdkVersion)
|
|
{
|
|
memset (this, 0, sizeof (PClassInfo2));
|
|
memcpy (cid, _cid, sizeof (TUID));
|
|
cardinality = _cardinality;
|
|
if (_category)
|
|
strncpy8 (category, _category, PClassInfo::kCategorySize);
|
|
if (_name)
|
|
strncpy8 (name, _name, PClassInfo::kNameSize);
|
|
classFlags = static_cast<uint32> (_classFlags);
|
|
if (_subCategories)
|
|
strncpy8 (subCategories, _subCategories, kSubCategoriesSize);
|
|
if (_vendor)
|
|
strncpy8 (vendor, _vendor, kVendorSize);
|
|
if (_version)
|
|
strncpy8 (version, _version, kVersionSize);
|
|
if (_sdkVersion)
|
|
strncpy8 (sdkVersion, _sdkVersion, kVersionSize);
|
|
}
|
|
#if SMTG_CPP11
|
|
constexpr PClassInfo2 ()
|
|
: cid ()
|
|
, cardinality ()
|
|
, category ()
|
|
, name ()
|
|
, classFlags ()
|
|
, subCategories ()
|
|
, vendor ()
|
|
, version ()
|
|
, sdkVersion ()
|
|
{
|
|
}
|
|
#else
|
|
PClassInfo2 () { memset (this, 0, sizeof (PClassInfo2)); }
|
|
#endif
|
|
};
|
|
|
|
//------------------------------------------------------------------------
|
|
// IPluginFactory2 interface declaration
|
|
//------------------------------------------------------------------------
|
|
/** Version 2 of class factory supporting PClassInfo2.
|
|
\ingroup pluginBase
|
|
\copydoc IPluginFactory
|
|
*/
|
|
//------------------------------------------------------------------------
|
|
class IPluginFactory2 : public IPluginFactory
|
|
{
|
|
public:
|
|
//------------------------------------------------------------------------
|
|
/** Returns the class info (version 2) for a given index. */
|
|
virtual tresult PLUGIN_API getClassInfo2 (int32 index, PClassInfo2* info) = 0;
|
|
|
|
//------------------------------------------------------------------------
|
|
static const FUID iid;
|
|
};
|
|
DECLARE_CLASS_IID (IPluginFactory2, 0x0007B650, 0xF24B4C0B, 0xA464EDB9, 0xF00B2ABB)
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
/** Unicode Version of Basic Information about a class provided by the Plug-in */
|
|
//------------------------------------------------------------------------
|
|
struct PClassInfoW
|
|
{
|
|
//------------------------------------------------------------------------
|
|
TUID cid; ///< see \ref PClassInfo
|
|
int32 cardinality; ///< see \ref PClassInfo
|
|
char8 category[PClassInfo::kCategorySize]; ///< see \ref PClassInfo
|
|
char16 name[PClassInfo::kNameSize]; ///< see \ref PClassInfo
|
|
|
|
enum {
|
|
kVendorSize = 64,
|
|
kVersionSize = 64,
|
|
kSubCategoriesSize = 128
|
|
};
|
|
|
|
uint32 classFlags; ///< flags used for a specific category, must be defined where category is defined
|
|
char8 subCategories[kSubCategoriesSize];///< module specific subcategories, can be more than one, logically added by the \c OR operator
|
|
char16 vendor[kVendorSize]; ///< overwrite vendor information from factory info
|
|
char16 version[kVersionSize]; ///< Version string (e.g. "1.0.0.512" with Major.Minor.Subversion.Build)
|
|
char16 sdkVersion[kVersionSize]; ///< SDK version used to build this class (e.g. "VST 3.0")
|
|
|
|
//------------------------------------------------------------------------
|
|
PClassInfoW (const TUID _cid, int32 _cardinality, const char8* _category, const char16* _name,
|
|
int32 _classFlags, const char8* _subCategories, const char16* _vendor, const char16* _version,
|
|
const char16* _sdkVersion)
|
|
{
|
|
memset (this, 0, sizeof (PClassInfoW));
|
|
memcpy (cid, _cid, sizeof (TUID));
|
|
cardinality = _cardinality;
|
|
if (_category)
|
|
strncpy8 (category, _category, PClassInfo::kCategorySize);
|
|
if (_name)
|
|
strncpy16 (name, _name, PClassInfo::kNameSize);
|
|
classFlags = static_cast<uint32> (_classFlags);
|
|
if (_subCategories)
|
|
strncpy8 (subCategories, _subCategories, kSubCategoriesSize);
|
|
if (_vendor)
|
|
strncpy16 (vendor, _vendor, kVendorSize);
|
|
if (_version)
|
|
strncpy16 (version, _version, kVersionSize);
|
|
if (_sdkVersion)
|
|
strncpy16 (sdkVersion, _sdkVersion, kVersionSize);
|
|
}
|
|
#if SMTG_CPP11
|
|
constexpr PClassInfoW ()
|
|
: cid ()
|
|
, cardinality ()
|
|
, category ()
|
|
, name ()
|
|
, classFlags ()
|
|
, subCategories ()
|
|
, vendor ()
|
|
, version ()
|
|
, sdkVersion ()
|
|
{
|
|
}
|
|
#else
|
|
PClassInfoW () { memset (this, 0, sizeof (PClassInfoW)); }
|
|
#endif
|
|
|
|
void fromAscii (const PClassInfo2& ci2)
|
|
{
|
|
memcpy (cid, ci2.cid, sizeof (TUID));
|
|
cardinality = ci2.cardinality;
|
|
strncpy8 (category, ci2.category, PClassInfo::kCategorySize);
|
|
str8ToStr16 (name, ci2.name, PClassInfo::kNameSize);
|
|
classFlags = ci2.classFlags;
|
|
strncpy8 (subCategories, ci2.subCategories, kSubCategoriesSize);
|
|
|
|
str8ToStr16 (vendor, ci2.vendor, kVendorSize);
|
|
str8ToStr16 (version, ci2.version, kVersionSize);
|
|
str8ToStr16 (sdkVersion, ci2.sdkVersion, kVersionSize);
|
|
}
|
|
};
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
// IPluginFactory3 interface declaration
|
|
//------------------------------------------------------------------------
|
|
/** Version 3 of class factory supporting PClassInfoW.
|
|
\ingroup pluginBase
|
|
\copydoc IPluginFactory
|
|
*/
|
|
//------------------------------------------------------------------------
|
|
class IPluginFactory3 : public IPluginFactory2
|
|
{
|
|
public:
|
|
//------------------------------------------------------------------------
|
|
/** Returns the unicode class info for a given index. */
|
|
virtual tresult PLUGIN_API getClassInfoUnicode (int32 index, PClassInfoW* info) = 0;
|
|
|
|
/** Receives information about host*/
|
|
virtual tresult PLUGIN_API setHostContext (FUnknown* context) = 0;
|
|
|
|
//------------------------------------------------------------------------
|
|
static const FUID iid;
|
|
};
|
|
DECLARE_CLASS_IID (IPluginFactory3, 0x4555A2AB, 0xC1234E57, 0x9B122910, 0x36878931)
|
|
//------------------------------------------------------------------------
|
|
} // namespace Steinberg
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
#define LICENCE_UID(l1, l2, l3, l4) \
|
|
{ \
|
|
(int8)((l1 & 0xFF000000) >> 24), (int8)((l1 & 0x00FF0000) >> 16), \
|
|
(int8)((l1 & 0x0000FF00) >> 8), (int8)((l1 & 0x000000FF) ), \
|
|
(int8)((l2 & 0xFF000000) >> 24), (int8)((l2 & 0x00FF0000) >> 16), \
|
|
(int8)((l2 & 0x0000FF00) >> 8), (int8)((l2 & 0x000000FF) ), \
|
|
(int8)((l3 & 0xFF000000) >> 24), (int8)((l3 & 0x00FF0000) >> 16), \
|
|
(int8)((l3 & 0x0000FF00) >> 8), (int8)((l3 & 0x000000FF) ), \
|
|
(int8)((l4 & 0xFF000000) >> 24), (int8)((l4 & 0x00FF0000) >> 16), \
|
|
(int8)((l4 & 0x0000FF00) >> 8), (int8)((l4 & 0x000000FF) ) \
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
// GetPluginFactory
|
|
//------------------------------------------------------------------------
|
|
/** Plug-in entry point.
|
|
\ingroup pluginBase
|
|
Any Plug-in must define and export this function. \n
|
|
A typical implementation of GetPluginFactory looks like this
|
|
\code
|
|
IPluginFactory* PLUGIN_API GetPluginFactory ()
|
|
{
|
|
if (!gPluginFactory)
|
|
{
|
|
static PFactoryInfo factoryInfo =
|
|
{
|
|
"My Company Name",
|
|
"http://www.mywebpage.com",
|
|
"mailto:myemail@address.com",
|
|
PFactoryInfo::kNoFlags
|
|
};
|
|
|
|
gPluginFactory = new CPluginFactory (factoryInfo);
|
|
|
|
static PClassInfo componentClass =
|
|
{
|
|
INLINE_UID (0x00000000, 0x00000000, 0x00000000, 0x00000000), // replace by a valid uid
|
|
1,
|
|
"Service", // category
|
|
"Name"
|
|
};
|
|
|
|
gPluginFactory->registerClass (&componentClass, MyComponentClass::newInstance);
|
|
}
|
|
else
|
|
gPluginFactory->addRef ();
|
|
|
|
return gPluginFactory;
|
|
}
|
|
\endcode
|
|
\see \ref loadPlugin
|
|
*/
|
|
//------------------------------------------------------------------------
|
|
extern "C"
|
|
{
|
|
Steinberg::IPluginFactory* PLUGIN_API GetPluginFactory ();
|
|
typedef Steinberg::IPluginFactory* (PLUGIN_API *GetFactoryProc) ();
|
|
}
|