@Dave Gamble说的很准确了,但是关于VST外壳插件,我想补充一些东西,因为它们有点难以处理。
要确定一个VST是否是一个外壳插件,请向插件分派器发送effGetPlugCategory
操作码。如果返回kPlugCategShell
,那么它就是一个外壳插件。要获取外壳中子插件的列表,你基本上调用effShellGetNextPlugin
直到它返回0。示例代码片段(改编自工作中的VST host):
typedef VstIntPtr (*Vst2xPluginDispatcherFunc)(AEffect *effect, VstInt32 opCode, VstInt32 index, VstIntPtr value, void *ptr, float opt);
Vst2xPluginDispatcherFunc dispatcher;
AEffect* plugin;
char nameBuffer[40];
while(true) {
memset(nameBuffer, 0, 40);
VstInt32 shellPluginId = dispatcher(pluginHandle, effShellGetNextPlugin, 0, 0, nameBuffer, 0.0f);
if(shellPluginId == 0 || nameBuffer[0] == '\0') {
break;
}
else {
}
}
如果您想在VST shell中加载插件,可能需要一些技巧。首先,您的主机需要处理主机回调中的操作码。当您调用VST的方法来实例化插件时,它将使用此操作码调用主机回调,并要求加载应该的唯一ID。
由于此回调是在主函数返回之前(因此,在向主机传递之前)进行的,这意味着您可能需要将要加载的shell插件ID存储在全局变量中,因为您将无法保存指向任何有意义的数据的指针到AEffect结构体的字段中,以便在主机回调中将其传回给您。