Как сканировать/перечислять библиотеки DLL плагина vst?
Вопрос
Я пытаюсь создать небольшую программу, в которой размещаются эффекты 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, взгляните на ВСТ.НЕТ