@戴夫寶潔釘,但我想補充的VST插件殼的幾件事情,因爲他們是有點棘手跟...共事。
要確定VST是否是shell插件,請將effGetPlugCategory
操作碼發送到插件調度程序。如果它返回kPlugCategShell
,那麼它是一個shell插件。爲了獲得在shell子插件列表,你基本上調用effShellGetNextPlugin
,直到它返回0。示例代碼片段(改編自working VST host):
// 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外殼加載插件,這有點棘手。首先,您的主機需要處理主機回調中的audioMasterCurrentId
操作碼。當您調用VST的VSTPluginMain()
方法來實例化插件時,它將使用此操作碼調用主機回調並請求應加載的唯一ID。
因爲這個回調是由主函數返回之前(因此,它提供了一個AEffect*
到你的主機之前),這意味着你可能會需要存儲的外殼插件ID在一個全局變量來加載,因爲你不能在主機回調中將指針保存在AEffect
結構體的void* user
字段中,以及時將其返回給你。
你願意分享一些你的主機代碼嗎?試圖自己創建一個vst主機,不知道從哪裏開始。 – 2011-05-26 14:02:02
@DanielRodrigues我在http://github.com/teragonaudio/MrsWatson/ – 2013-05-17 16:00:10