@Dave Gamble 做到了,但我想在 VST shell 插件上添加一些东西,因为它们使用起来有点棘手。
要确定 VST 是否为 shell 插件,请将effGetPlugCategory
操作码发送到插件调度程序。如果它返回kPlugCategShell
,那么它是一个 shell 插件。要获取 shell 中的子插件列表,您基本上调用effShellGetNextPlugin
直到它返回 0。示例代码片段(改编自工作 VST 主机):
// All this stuff should probably be set up far earlier in your code...
// This assumes that you have already opened the plugin and called VSTPluginMain()
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 {
// Do something with the name and ID
}
}
如果你真的想在 VST shell 中加载插件,那就有点棘手了。首先,您的主机需要处理audioMasterCurrentId
主机回调中的操作码。当您调用 VST 的VSTPluginMain()
方法来实例化插件时,它会使用此操作码调用主机回调并询问应加载的唯一 ID。
因为这个回调是在主函数返回之前进行的(因此,在它传递AEffect*
给你的主机之前),这意味着你可能需要存储 shell 插件 ID 以加载到一个全局变量中,因为你将无法及时保存指向结构void* user
字段中任何有意义数据的指针,AEffect
以便在主机回调中将其传回给您。