エコー サンプルのしくみ
[このページ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 メディア プレーヤーがオーディオ データを提供する入力バッファーと、処理されたオーディオ データを受信する出力バッファーを割り当てると、エコー処理は次のように処理されます。
- 入力バッファー内の各オーディオ サンプルの処理を許可するループを入力します。
- 入力バッファーからサンプルを取得します。 次に、入力バッファー ポインターを次のサンプルに移動して、次のループイテレーションに備えます。
- 遅延バッファーからサンプルを取得します。
- 入力バッファーから、最後の遅延サンプルの取得元の遅延バッファー内の同じ場所にサンプルをコピーします。
- 遅延バッファー ポインターを次のサンプルに移動します。 ポインターがバッファーの末尾を越えて移動する場合は、バッファーの先頭に移動します。
- 入力バッファーのサンプルと遅延バッファーのサンプルを組み合わせます。
- 結果を出力バッファーにコピーします。 次に、出力バッファー ポインターを次のユニットに移動して、次のループイテレーションに備えます。
- すべてのサンプルが処理されるまで繰り返します。
ステップ 2 で取得した入力サンプルがステップ 4 の遅延バッファーにコピーされると、移動可能なポインターが遅延バッファー内の各サンプルをステップ実行するまでそこに残り、最後に同じ位置に戻ります。 遅延バッファーのサイズは遅延時間に対応するように設計されているため、遅延バッファーにコピーされるサンプルと再び取得されるサンプルとの間の経過時間は、指定された遅延 (および実際の処理によって発生した待機時間) と等しくなります。
ストリームが開始されると、遅延時間が経過するまで遅延データは生成されません。 したがって、遅延バッファーには最初に無音が含まれていることが重要です。 遅延バッファーにランダム なデータが含まれている場合、プラグインが遅延バッファー全体を上書きするのに十分な遅延データを生成するまで、ユーザーはホワイト ノイズを聞きます。
関連トピック
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示