私の目標は、 AuditionとAudacityで動作するVSTプラグインを作成することなので、VST v2.x を使用する予定です。私は VST 開発は初めてですが、ここで例を調べました。これまでのところ、ほとんどのものはかなり単純明快に見えます。主な「魔法」は、process()またはprocessReplace()関数で発生するようです。ただし、これら2つの機能の利点/欠点はよくわかりません。
ここでの「問題」は、フィルターが数秒の「先読み」バッファーを必要とすることです (おそらく、セットアップによって異なります)。これは、プロセスの開始時に、内部バッファーを埋める必要があることを意味します。そして、プロセスの最後に、保留中のサンプルを内部バッファーからフラッシュする必要があります。
私は以前にSoX (Sound eXchange)用のフィルターをコーディングしていましたが、その API は一見すると VST と非常によく似ています。VST でprocess()と呼ばれるものは、SoX API でflow()と呼ばれます。ただし、大きな違いが 1 つあります。SoX APIのflow()関数は、パラメーターとして、入力バッファーで使用可能なサンプル数と、出力バッファーに収まるサンプル数を取得します。次に、flow()関数は、入力バッファーから取得したサンプル数と、出力に書き込んだサンプル数を返します。バッファ。これは、すべての呼び出しで利用可能なすべての入力サンプルを処理する必要がないことを意味します。また、1 回の呼び出しで、消費したサンプルよりも少ないサンプルが返される場合があります。したがって、プロセスの開始時に、すべての入力サンプルを使用できますが、出力サンプルはまったく返されません ! このようにして、最初に「先読み」バッファを埋めることができます。最後に、SoX API には、フィルターの内部バッファーから保留中のサンプルをフラッシュするために、プロセスの最後にメイン アプリケーションによって呼び出される、 drain()関数があります。
VST について私が理解していることから、process()関数には、入力サンプルと出力サンプルの数を示すパラメーターが 1 つしかありません。また、出力サンプルの数を制限する方法はありません。どうやら、process()は単純な「N サンプル イン、N サンプル アウト」の動作を前提としています。そうですか???
もしそうなら、VST で内部の先読みバッファを埋めるための推奨される方法は何ですか? また、VST で最後に内部バッファをフラッシュする推奨される方法は何ですか?
ところで: もちろん、プロセスの開始時に、最初の数回のprocess()呼び出しで「沈黙」のみを返すことで、内部バッファーを埋めることができることはわかっています。しかし、それはオーディオファイル全体を遅らせたりシフトさせたりすることになり、望ましくありません! また、プロセスの最後に内部バッファをフラッシュする方法の問題も解決しません。
アドバイスありがとうございます!;-)