Как я могу сканировать / перечислять 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

Другие вопросы по тегам