エコー サンプルのしくみ

[このページWindows メディア プレーヤー SDK に関連付けられている機能は、レガシ機能です。 MediaPlayer に置き換わりました。 MediaPlayer は、Windows 10とWindows 11用に最適化されています。 可能な場合は、新しいコードで SDK ではなく MediaPlayerWindows メディア プレーヤー使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

このコードでは、遅延時間値で指定された時間枠でレンダリングできるオーディオ データの量を正確に格納するのに十分な大きさのバッファーを割り当てることで、エコー効果を作成します。 バッファーのサイズは、次の数式でバイト単位で計算されます。

buffer size = delay time * sample rate / 1000 * block alignment

遅延時間はミリ秒単位です。 サンプル レートとブロックアラインメント値は、WAVEFORMATEX 構造体で指定されます。 サンプル レートは 1 秒あたりのサンプル数です。を 1000 で除算すると、1 ミリ秒あたりのサンプルが生成されます。 ブロックアラインメントは、チャネル数 (モノラルの場合は 1、ステレオの場合は 2)、サンプルあたりのビット数 (8 または 16) を 8 (バイトあたりのビット数) で割った値と等しくなります。

コードは、遅延バッファーの先頭を指すポインター変数に加えて、 DoProcessOutput 関数の処理ループと同期してバッファー内のデータをステップ実行する移動可能なポインターを作成します。 移動可能ポインターが遅延バッファーの末尾に達すると、バッファーの先頭に戻ります。 この方法で使用されるバッファーは、循環バッファーと呼ばれます。

遅延バッファーが存在し、Windows メディア プレーヤーがオーディオ データを提供する入力バッファーと、処理されたオーディオ データを受信する出力バッファーを割り当てると、エコー処理は次のように処理されます。

  1. 入力バッファー内の各オーディオ サンプルの処理を許可するループを入力します。
  2. 入力バッファーからサンプルを取得します。 次に、入力バッファー ポインターを次のサンプルに移動して、次のループイテレーションに備えます。
  3. 遅延バッファーからサンプルを取得します。
  4. 入力バッファーから、最後の遅延サンプルの取得元の遅延バッファー内の同じ場所にサンプルをコピーします。
  5. 遅延バッファー ポインターを次のサンプルに移動します。 ポインターがバッファーの末尾を越えて移動する場合は、バッファーの先頭に移動します。
  6. 入力バッファーのサンプルと遅延バッファーのサンプルを組み合わせます。
  7. 結果を出力バッファーにコピーします。 次に、出力バッファー ポインターを次のユニットに移動して、次のループイテレーションに備えます。
  8. すべてのサンプルが処理されるまで繰り返します。

ステップ 2 で取得した入力サンプルがステップ 4 の遅延バッファーにコピーされると、移動可能なポインターが遅延バッファー内の各サンプルをステップ実行するまでそこに残り、最後に同じ位置に戻ります。 遅延バッファーのサイズは遅延時間に対応するように設計されているため、遅延バッファーにコピーされるサンプルと再び取得されるサンプルとの間の経過時間は、指定された遅延 (および実際の処理によって発生した待機時間) と等しくなります。

ストリームが開始されると、遅延時間が経過するまで遅延データは生成されません。 したがって、遅延バッファーには最初に無音が含まれていることが重要です。 遅延バッファーにランダム なデータが含まれている場合、プラグインが遅延バッファー全体を上書きするのに十分な遅延データを生成するまで、ユーザーはホワイト ノイズを聞きます。

エコー サンプルの概要