سؤال

أحاول بناء برنامج صغير يستضيف تأثيرات VST وأود مسح مجلد لمساعد DLLS.
أعرف كيفية العثور على جميع DLLs ولكن لدي الأسئلة التالية الآن:

  • ما هي أفضل طريقة لتحديد ما إذا كان DLL معين هو البرنامج المساعد VST؟
    حاولت أن أرى فقط إذا صادرت DDL الوظيفة المناسبة، وهذا يعمل بشكل جيد للمساعدات الإضافية التي تم إجراؤها باستخدام الإصدارات الأكثر حداثة من VST SDK نظرا لأنها تصدر طريقة تسمى "vstpluginMain" ولكن الإصدارات الأقدم تصدر وظيفة "رئيسية" عامة إلى حد ما.
  • كيف يمكنني تحديد ما إذا كان البرنامج المساعد تأثير أم أداة؟
  • كيف يمكنني مسح الإضافات VST شل؟
    Shell Plugins هي أساسا DLLs التي تحتوي بطريقة أو بأخرى تأثيرات متعددة. مثال على هذه هي الإضافات التي أدلى بها موجات الصوت http://www.waves.com/

ملاحظة: إذا كانت هناك مكتبة يمكن أن تفعل كل هذا بالنسبة لي، واسمحوا لي أن أعرف.

هل كانت مفيدة؟

المحلول

كيفية تحديد البرنامج المساعد VST؟

بمجرد العثور على الرئيسية / vstpluginmain ... اتصل بها! إذا كان ما عاد فارغ، فهذا ليس VST. إذا كان ما عاد هو مؤشر إلى البايتات "VSTP" (انظر VstInt32 magic; ///< must be #kEffectMagic ('VstP') في Aeffect.h)، ثم لديك VST.

يعيد vstpluginMain مؤشر إلى هيكل AETFFECT. سوف تحتاج إلى إلقاء نظرة على هذا الهيكل.

تأثير أو أداة؟ AEffect::flags | (effFlagsIsSynth = 1 << 8)

شل vsts هي أكثر تعقيدا:

سوف تكون الفئة kplugc الفئات

دعم كانو "الصلاحية".

استخدم effshellgetnextplugin لتعداد.

على سبيل المثال، استجابة ل AudiOMasterCurrentID في رد الاتصال الخاص بك مع المعرف الذي تريده.

نصائح أخرى

تضمين التغريدة ردا على Dave Gamble، لكنني أردت إضافة بعض الأشياء على الإضافات VST Shell، لأنها صعبة بعض الشيء للعمل معها.

لتحديد ما إذا كان VST هو البرنامج المساعد SHELT، أرسل effGetPlugCategory Opcode إلى المرسل البرنامجي. إذا عاد kPlugCategShell, ، ثم هو البرنامج المساعد شل. للحصول على قائمة الإضافات الفرعية في Shell، يمكنك الاتصال بشكل أساسي effShellGetNextPlugin حتى ترجع 0. مثال على البرمجية Snappit (مقتبس من العمل 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 Opcode في رد الاتصال المضيف. عند استدعاء VST VSTPluginMain() طريقة لإرساء البرنامج المساعد، سيتصل بإعاش الاتصال المضيف مع هذا Opcode واطلب المعرف الفريد الذي يجب تحميله.

لأن هذا الاتصال مصنوع قبل تعود الوظيفة الرئيسية (وبالتالي، قبل أن تقدم AEffect* إلى مضيفك)، هذا يعني أنك ربما تحتاج إلى تخزين معرف البرنامج المساعد SHEL للتحميل في متغير عالمي، نظرا لأنك لن تكون قادرا على حفظ مؤشر بأي بيانات ذات معنى void* user مجال. AEffect بنية في الوقت المناسب ليتم تمريرها إليك في رد الاتصال المضيف.

إذا كنت ترغب في تطوير تطبيق مضيف VST الخاص بك في .NET إلقاء نظرة على من vst.net.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top