2009-07-15 6 views
8

私はvstのエフェクトをホストする小さなプログラムを構築しようとしています。プラグインDLLのフォルダをスキャンしたいと思います。
私は、すべてのDLLを見つける方法を知っているが、今私は、次の質問を持っている:vstプラグインのDLLをスキャン/列挙するにはどうすればよいですか?

  • 与えられたDLLがVSTプラグインであるかどうかを判断するための最良の方法は何ですか?
    ddlが適切な関数をエクスポートしたかどうかを調べようとしましたが、これはVst SDKの最新バージョンで作成されたプラグインでうまく動作します。これは "VstPluginMain"というメソッドをエクスポートしてからです。 。
  • プラグインがエフェクトかインストゥルメントかをどのように判断しますか?
  • vstシェルプラグインをスキャンするにはどうすればよいですか?
    シェルプラグインは基本的に何とか複数のエフェクトを含むdllです。その例として、Waves Audioのプラグインがあります。http://www.waves.com/

ps:このすべてを行うライブラリがあれば教えてください。

+0

あなたのホストコードの一部を共有しますか? vstホストを自分で作成しようとすると、どこから起動するのかわかりません。 –

+0

@DanielRodrigues私はhttp://github.com/teragonaudio/MrsWatson/でオープンソースのVSTホストを持っています –

答えて

7

VSTプラグインを特定するにはどうすればよいですか?

メイン/ VSTPluginMainが見つかったら...それを呼び出してください! 返されるものがNULLの場合、それはVSTではありません。 返されるものがバイト "VstP"(aeffect.h内のVstInt32 magic; ///< must be #kEffectMagic ('VstP')を参照)へのポインタである場合、VSTを持っています。

VSTPluginMainは、AEffect構造体へのポインタを返します。この構造を見る必要があります。

効果または楽器ですか? AEffect::flags | (effFlagsIsSynth = 1 << 8)

シェルのVSTは、より複雑です:

カテゴリkPlugCategShell

サポート "shellCategory" CANDOになります。

effShellGetNextPluginを使用して列挙します。

たとえば、コールバックのaudioMasterCurrentIdに、必要なIDで応答します。

+0

答えをありがとう。 私は完全には得られないことがあります。 プラグインではなく、 "main"(かなり一般的な名前のように見える)をエクスポートしてから何かを返すdllを見つけたとしましょう。私が "VstP"を探してその価値を逆参照しようとすると、困ったことはありませんか? – Roald

+1

潜在的に。ポインターが0以外であるかどうかを確かめるでしょう。また、コールバックが呼び出されたかどうかを確認することを検討することもできます。 ユーザーが悪意のあるDLLをVSTPlugInsフォルダに格納するのはほとんど意味がありません。 –

+0

右、コールバック...ありがとう! – Roald

1

は、.NETであなたのVSTホストアプリケーションを開発する場合、彼らは少しトリッキーなので、@Daveギャンブルはそれを釘付け、私はVSTシェルプラグインのいくつかを追加したいVST.NET

3

を見てみましょうに一緒に働く

VSTがシェルプラグインかどうかを確認するには、effGetPlugCategoryオペコードをプラグインディスパッチャに送信します。 kPlugCategShellを返した場合は、シェルプラグインです。あなたが実際に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 
    } 
} 

:それは(working VST hostから適応)0例コードsnippitを返すまでシェル内のサブプラグインのリストを取得するには、基本的にeffShellGetNextPluginを呼び出します、それは少しトリッキーです。まず、ホストがホストコールバックでaudioMasterCurrentIdオペコードを処理する必要があります。プラグインをインスタンス化するためにVSTのVSTPluginMain()メソッドを呼び出すと、このオペコードでホストコールバックが呼び出され、ロードされるべき一意のIDが要求されます。

(それはあなたのホストにAEffect*を提供する前に、それゆえ)このコールバックは前にメイン関数のリターンを作られているので、それは、あなたがおそらくグローバル変数にロードするシェルプラグインIDを格納する必要があることを意味しますこれは、AEffect構造体の意味のあるデータへのポインタをvoid* userフィールドに保存することができなくなるため、ホストコールバックでそれが返されるためです。

関連する問題