Как я могу сканировать / перечислять VST плагины DLL?
Я пытаюсь создать небольшую программу, которая содержит VST-эффекты, и я хотел бы просканировать папку на наличие DLL-плагина.
Я знаю, как найти все библиотеки, но теперь у меня есть следующие вопросы:
- Каков наилучший способ определить, является ли данный DLL плагин VST?
Я попытался просто посмотреть, экспортирует ли ddl правильную функцию, и это прекрасно работает для плагинов, созданных для более поздних версий vst sdk, так как он экспортирует метод с именем "VstPluginMain", но более старые версии экспортируют довольно общую "основную" функцию. - Как определить, является ли плагин эффектом или инструментом?
- Как я сканирую плагины оболочки VST?
Плагины оболочки - это в основном dll, которые как-то содержат несколько эффектов. Примером этого являются плагины, сделанные Waves Audio http://www.waves.com/
PS: Если есть библиотека, которая может сделать все это для меня, пожалуйста, дайте мне знать.
3 ответа
Как определить VST плагин?
Как только вы нашли main/VSTPluginMain... позвоните! Если возвращаемое значение равно NULL, это не VST. Если то, что возвращается, является указателем на байты "VstP" (см. VstInt32 magic; ///< must be #kEffectMagic ('VstP')
в aeffect.h), тогда у вас есть VST.
VSTPluginMain возвращает указатель на структуру AEffect. Вам нужно будет посмотреть на эту структуру.
Эффект или инструмент? AEffect::flags | (effFlagsIsSynth = 1 << 8)
Shell VSTs являются более сложными:
Категория будет kPlugCategShell
Поддержать "ShellCategory" можно сделать.
Используйте effShellGetNextPlugin для перечисления.
Например, ответьте на audioMasterCurrentId в вашем обратном вызове с нужным вам идентификатором.
@Dave Gamble прибил его, но я хотел добавить несколько вещей в плагины оболочки 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
код операции в обратном вызове хоста. Когда вы звоните в VST VSTPluginMain()
метод для создания плагина, он вызывает обратный вызов хоста с этим кодом операции и запрашивает уникальный идентификатор, который должен быть загружен.
Поскольку этот обратный вызов выполняется до возврата основной функции (и, следовательно, до AEffect*
к вашему хосту), это означает, что вам, вероятно, потребуется сохранить идентификатор плагина оболочки для загрузки в глобальную переменную, поскольку вы не сможете сохранить указатель на какие-либо значимые данные в void* user
поле AEffect
структура во времени для его передачи вам обратно в обратном вызове хоста.
Если вы хотите разработать приложение VST Host в.NET, взгляните на VST.NET