@ Дейв Гэмбл прибил его, но я хотел добавить несколько вещей в плагины оболочки VST, поскольку с ними немного сложно работать.
Чтобы определить, является ли VST плагином оболочки, отправьте код операции effGetPlugCategory
диспетчеру плагинов. Если он возвращает kPlugCategShell
, то это плагин оболочки. Чтобы получить список суб-плагинов в оболочке, вы в основном вызываете 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, это немного сложнее. Во-первых, ваш хост должен обработать код операции audioMasterCurrentId
в обратном вызове хоста. Когда вы вызываете метод VSTPluginMain()
VST для создания экземпляра плагина, он вызывает обратный вызов хоста с этим кодом операции и запрашивает уникальный идентификатор, который должен быть загружен.
Поскольку этот обратный вызов выполняется за до , основная функция возвращается (и, следовательно, до того, как она доставит AEffect*
вашему хосту), это означает, что вам, вероятно, потребуется сохранить идентификатор плагина оболочки для загрузки в глобальной переменной, поскольку вы не сможете вовремя сохранить указатель на какие-либо значимые данные в поле void* user
структуры AEffect
, чтобы они могли быть возвращены вам в обратном вызове хоста.