Как мне сканировать / перечислять vst плагины dll? - PullRequest
8 голосов
/ 15 июля 2009

Я пытаюсь создать небольшую программу, которая содержит VST-эффекты, и я хотел бы отсканировать папку на наличие DLL-плагина.
Я знаю, как найти все DLL, но теперь у меня есть следующие вопросы:

  • Каков наилучший способ определить, является ли данный dll плагином vst?
    Я попытался просто посмотреть, экспортирует ли ddl правильную функцию, и это прекрасно работает для плагинов, созданных с более поздними версиями vst sdk, поскольку он экспортирует метод с именем «VstPluginMain», но более старые версии экспортируют довольно общую «основную» функцию. 1004 *
  • Как определить, является ли плагин эффектом или инструментом?
  • Как сканировать плагины vst shell?
    Плагины оболочки - это в основном dll, которые как-то содержат несколько эффектов. Примером этого являются плагины, сделанные Waves Audio http://www.waves.com/

ps: Если есть библиотека, которая может сделать все это для меня, пожалуйста, дайте мне знать.

Ответы [ 3 ]

8 голосов
/ 15 июля 2009

Как определить плагин VST?

Как только вы нашли main / VSTPluginMain ... позвоните! Если возвращаемое значение равно NULL, это не VST. Если возвращается указатель на байты "VstP" (см. VstInt32 magic; ///< must be #kEffectMagic ('VstP') в aeffect.h), то у вас есть VST.

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

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

Оболочка VST более сложна:

Категория будет kPlugCategShell

Поддержка "ShellCategory" canDo.

Используйте effShellGetNextPlugin для перечисления.

Например, ответьте на audioMasterCurrentId в вашем обратном вызове с нужным вам идентификатором.

3 голосов
/ 17 мая 2013

@ Дейв Гэмбл прибил его, но я хотел добавить несколько вещей в плагины оболочки 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, чтобы они могли быть возвращены вам в обратном вызове хоста.

1 голос
/ 03 февраля 2010

Если вы хотите разработать приложение VST Host в .NET, взгляните на VST.NET

...