Как сканировать / перечислять DLL плагинов vst?

Я пытаюсь создать небольшую программу, в которой размещаются эффекты vst, и я хотел бы сканировать папку для DLL плагинов.
Я знаю, как найти все библиотеки 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') in aeffect.h), тогда у вас есть VST.

VSTPluginMain возвращает указатель на структуру AEffect. Вам нужно будет взглянуть на эту структуру.

эффект или инструмент? AEffect::flags | (effFlagsIsSynth = 1 << 8)

оболочки VSTs являются более сложными:


@Dave Gamble прибил его, но я хотел добавить несколько вещей на Плагины VST shell, так как с ними немного сложно работать.

чтобы определить, является ли 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] == '') {
    break;
  }
  else {
    // Do something with the name and ID
  }
}

если вы на самом деле хотите загрузить плагин в оболочку VST, это немного сложнее. Во-первых, ваш хост должен обрабатывать audioMasterCurrentId код операции в обратном вызове хоста. Когда вы вызываете VST VSTPluginMain() метод для создания экземпляра плагина он вызовет обратный вызов хоста с помощью этого кода операции и запросит уникальный идентификатор, который должен быть загружен.

потому что этот обратный вызов до основная функция возвращает (и, следовательно, прежде чем она доставит AEffect* для вашего хоста), это означает, что вы, вероятно, будете необходимо сохранить идентификатор плагина оболочки для загрузки в глобальную переменную, так как вы не сможете сохранить указатель на какие-либо значимые данные в


Если вы хотите развить ваши VST хост-приложения .Чистая взглянем на VST.NET