October 2022 リリースの新機能
- 2 つの新しい API XDspConnectWithMaximumStreamLimit と XDspSubmitCommandWithEnvelope が追加されました。XDspConnectWithMaximumStreamLimit は、アクティブ化できるストリームの最大数が 256 未満の場合、内部的にメモリ使用量が少なくなります。一方、XDspConnect は 256 ストリームを考慮するため、より多くのメモリを使用します。 XDspSubmitCommandWithEnvelope は、インパルス応答フィルターのエンベロープ処理を有効にします。XDSP API を使用したエンベロープ処理の概要を参照してください。
リリース機能
- コンボリューションでは、サポートされるブロック サイズは 512 および 1024 フレームです。1024 フレームのブロック サイズを使用するとパフォーマンスがより良くなります。
- FFT/IFFT では、サポートされるブロック サイズは 512、1024、および 2048 フレームです。
- コンボリューションは、モノラルおよびステレオのインパルス応答で、モノラル、ステレオ、およびステレオ非インターリーブ モードでサポートされています。
- XDspConnect または XDspConnectWithMaximumStreamLimit の呼び出しは、ハードウェアとの接続を確立し、XDspClientHandle を返します。任意の時点でアクティブにできる接続は 8 つのみです。
- XDspConnect の呼び出しでサポートされる最大の aggregateImpulseResponseInSeconds は 128 です。これはまた、すべての XDspConnect 呼び出し全体での最大値でもあります。単一の XDspConnect 呼び出しが aggregateImpulseResponseInSeconds に 128 を指定して行われた場合、aggregateImpulseResponseInSeconds の値が 0 より大きい XDspConnect 呼び出しを追加で行うことはできません。コンボリューション処理のストリーム アクティブ化を許可するには、aggregateImpulseResponseInSeconds がゼロより大きい必要があります。
- XDspConnect によって返される任意の XDspClientHandle に対して、XDspActivate を使用して最大 256 ストリームをアクティブ化できます。XDspConnectWithMaximumStreamLimit によって返される任意の XDspClientHandle に対して、XDspActivate を使用して最大 maximumStreamCount ストリームをアクティブ化できます。maximumStreamCount は XDspConnectWithMaximumStreamLimit の呼び出しで使用されるストリーム数です。これらのストリームは、任意の XDspProcessType にすることができます。
- ステレオ入力が使用される場合、サポートされる最大の集約インパルス応答は 64 秒に低下します。
- API に渡されるすべてのバッファーは 16 バイトにアラインされている必要があります。バッファーが 16 バイトにアラインされていない場合、ハードウェアはフォールトに遭遇してリセットする可能性があります。ハードウェアがクラッシュ/ハングに遭遇したとき、XDspStatus.result は XDSP_E_DEVICE_FATAL_ERROR を示します。
- インパルス応答は周波数領域にある必要があります。時間領域のインパルス応答を周波数領域に変換するツールが提供されています。 https://aka.ms/gdkdl からダウンロードしてください。
- インパルス応答変換ツールは、パフォーマンスの向上と引き換えに品質の低下を許容できる低減サポートを含めるようになりました。詳細については、XDSP インパルス応答低減の概要を参照してください。
- XDspConnect の呼び出しのレイテンシーが改善されました。
既知の問題
- XDspActivationOptions の FFT/IFFT 処理用の “EnablePolarFormat” オプションは、既定のデカルト形式と比較して相当な時間がかかります。デカルト形式のほうがパフォーマンスが優れています。
ベスト プラクティス
- ハードウェアがフォールトに遭遇した場合でも、ハードウェアに送信された各コマンドに対して応答があります。ストリームを非アクティブ化するために XDspDeactivate を呼び出す前に、呼び出し元はハードウェアがすべてのコマンドを処理するのを待つ必要があります。XDspStatus.lastProcessedCommandSequence は、このストリームに対してハードウェアが処理した最後のコマンドのシーケンス番号を示します。他の XDSP ストリームは影響を受けず、ハードウェアはそれらのコマンドを引き続き処理します。
- XDspConnect の呼び出しに渡される “baseBuffer” は、すべてのストリームが XDspDeactivate を使用して非アクティブ化され、XDspDisconnect が成功するまで、解放してはなりません。
- 各ストリームには内部キュー制限があり、この制限に達すると XDspSubmitCommand は XDSP_E_QUEUE_FULL を返します。このエラーが発生した場合は、さらにコマンドを送信する前に、このストリームに対してハードウェアがコマンドを処理するのに十分な時間を与えてください。XDspStatus.lastProcessedCommandSequence を使用して、このストリームに対してハードウェアが処理した最後のコマンドを確認できます。
- コンボリューションでは、512 ブロック サイズと比較して 1024 ブロック サイズの方がパフォーマンスが優れています。
- コンボリューション アルゴリズムは、連続するコマンドの処理に関して均質ではありません。つまり、すべてのブロックが完了するのに同じ時間がかからず、一部のブロックは他のブロックよりも長い時間がかかる可能性があります。
タイトルの一時停止と再開
タイトルは、たとえばユーザーが Constrained モードにしたときなど、一時停止と再開ができる必要があります。suspend ハンドラーが呼び出されたら、単純にハードウェアへの XDSP コマンドの送信を停止してください。既に送信されたコマンドは正常に処理され、XDspStatus はそれに応じて更新されます。サンプル
- https://aka.ms/gdkdl および ATG サンプルからダウンロードできます。 サンプル ウォークスルーは、シングル ストリーム コンボリューション リバーブおよびシングル ストリーム FFT IFFT で利用可能です
- 時間領域のインパルス応答を周波数領域に変換するためにハードウェア アクセラレーターを使用する XDSP サンプルが、GDK ダウンロード ポータル https://aka.ms/gdkdl の他のサンプルと共に含まれています。このサンプルは、GDK のインストールに含まれる Impulse Response Transform ツールとまったく同じ出力を生成します。このサンプルは、XDSP API で使用するためにハードウェア アクセラレーションを使用してインパルス応答をその場で変換する方法を示します。
