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

StackOverflow https://stackoverflow.com/questions/1128958

  •  13-09-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

Shell VST более сложны:

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

Поддержите canDo «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, взгляните на ВСТ.НЕТ

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top