カスタム APO と Windows APO を組み合わせる
オーディオ処理オブジェクト (APO) は、Windows オーディオ ストリーム用のカスタマイズ可能なソフトウェア ベースのデジタル信号処理を提供します。 Microsoft が提供する API とパートナーが開発したコードを組み合わせて、既存の機能をラップおよびカスタマイズすることができます。
APO に関する全般的な情報については、これらのトピックを参照してください。
APO は Windows Vista で最初に導入されたため、以前のシステム APO (sAPO) への参照が示されている場合があります。 詳細については、ホワイト ペーパー「Windows Vista のカスタム オーディオ効果」を参照してください。 このホワイト ペーパーでは、以前の COM および UI 開発に関するトピックを参照している場合があります。
カスタム APO と Windows APO を組み合わせる方法
このセクションでは、対応する APO の周囲に薄いラッパーを作成することによって、カスタム オーディオ システム効果 APO を実装するためのガイドラインについて説明します。 カスタム APO とは、IHV の APO の実装を指します。
APO には、SFX (ストリーム) と MFX (モード) の 2 種類があります。 Windows 8.1 では、SFX は LFX (ローカル) と呼ばれ、MFX は GFX (グローバル) API と呼ばれていました。
IHV は、Windows SFX および MFX カスタム オーディオ システム エフェクト APO のいずれかまたは両方を置き換える、カスタム オーディオ システム効果 API を実装することができます。 大まかに言うと、IHV や OEM には、カスタム オーディオ システム 効果 APO と Windows が提供する APO を組み合わせるための 2 つの基本的な戦略があります。 これらの戦略により、IHV はカスタム効果と Windows の効果を統合する方法に柔軟に対応することができます。
置換
置き換える Windows APO とその機能の詳細について理解を深めます。 その理解を活用して、ターゲット ユーザー エクスペリエンスの観点から IHV に最も意味のある方法で、Windows APO を呼び出すカスタム APO を実装します。 この戦略は、次を行う必要のある IHV または OEM に最適です。
- カスタム効果と Windows 効果をシームレスに統合します。
- 自社のカスタム効果と Windows API によって実装される効果を制御するために、独自の UI を実装します。
APO の作成の詳細については、「Windows オーディオ処理オブジェクト」を参照してください。
薄いラッパー
カスタム APO を Windows APO の薄いラッパーとして記述します。 この戦略は、次を行う必要のある IHV または OEM に最適です。
- 可能な限り簡単な方法でカスタム効果を追加します。
- Windows UI で引き続き効果を制御します。
薄いラッパー オプションとして戦略を選択した IHV または OEM は、Windows オーディオ処理オブジェクトを確認して、Windows カスタム オーディオ システムの効果を十分に理解する必要があります。
注: 薄いラッパー戦略では、UI を追加して Windows の [拡張機能] タブに追加されたカスタム オーディオ システム効果を制御することはできません。[拡張機能] タブは 1 つしか存せず、Windows API のプロパティ ページに関連付けられたままにする必要があります。 IHV の UI については、別のコントロール パネル アプリケーションなど、他の方法で実装する必要があります。
プログラミングに関する情報
このセクションでは、カスタム APO を実装するために対処する必要がある一般的なプログラミングの問題について説明します。
SFX (ストリーム) と MFX (モード) の両方のカスタム オーディオ システム効果 APO に、次の一般的な特性があります。
- これらは、CoCreateInstance を使用してインスタンス化できる COM インプロセス サーバー オブジェクトとして登録する必要があります。
- CLSID は、SFX APO と MFX APO に対してそれぞれ
CLSID_CWMAudioLFXAPO
とCLSID_CWMAudioGFXAPO
です。 CLSID は wmcodecdsp.h で宣言され、wmcodecdspuuid.lib で定義されます。 - これらは、COM 集計をサポートする必要があります。 ただし、集計はカスタム オーディオ システム効果シナリオで使用されることは想定されていないため、大きな問題となることはないと考えられます。
初期化
カスタム APO は、その IAudioSystemEffects::Initialize メソッドを呼び出して、Window APO を初期化する必要があります。 これは通常、カスタム APO の Initialize メソッドから行われます。 カスタム APO の Initialize メソッドに渡されるすべての引数は、Windows APO の Initialize に直接渡す必要があります。 これにより、APO はエンドポイントから設定をフェッチでき、Fx プロパティ ストアは APOInitSystemEffects 構造体に格納されます。 カスタム APO で設定をフェッチし、それらを選択的に APO に渡すことは可能ですが、これは基本的に戦略 A です。
カスタム APO が機能を置き換える場合は、APO の対応する機能をオフにすることが一般的に推奨されます。 ただし、機能の動作によっては、機能をオフにする必要性が厳格なものではない場合があります。 機能を無効にするには、その IPropertyStore インターフェイスについて APO にクエリを実行し、IPropertyStore::SetValue を呼び出します。 APO のプロパティ ストアでサポートされるプロパティについては、このトピックで後述する「サポートされる IPropertyStore プロパティ」を参照してください。
Windows カスタム オーディオ システム効果 APO プロパティ ストアと通信する方法の例については、GitHub のサンプルを参照してください。 https://github.com/Microsoft/Windows-driver-samples/tree/main/audio/sysvad/APO
APO の機能の状態を照会する
カスタム APO では Windows オーディオ エフェクト機能が置き換わるだけで、独自の構成 UI または設定ストアがない場合は、対応する APO でどの機能を有効にするかの決定を行う必要がある場合があります。
この情報を取得するには、少なくとも 2 つの方法があります。
オプション A: Fx プロパティ ストアに直接クエリを実行します。
オプション B: 間接的に、APO をインスタンス化し、その IPropertyStore インターフェイスを使用してプロパティ ストアにクエリを実行します。
オプション A
このオプションには、APO をインスタンス化せずに実行できるという利点があります。 また、カスタム APO が Fx プロパティ ストアを監視する場合は、オプション A が即座のプロパティ変更通知を受信する唯一の方法です。 オプション A の例については、"compress" のサンプルを参照してください。
オプション A を使用すると、カスタム APO は、Fx ではなくメイン エンドポイント プロパティ ストアに対して PKEY_AudioEngine_DeviceFormat のクエリを実行します。 その後、その形式のチャンネル マスクを、Fx プロパティ ストアのクエリを実行するために使用されるプロパティ キーの PID として使用します。 Fx プロパティ ストアのクエリを実行するのに使用されるプロパティ キーの GUID (fmtid) は、wmcodecdsp.h のXXX_XXX_KEY_GUID 値の 1 つです。 KEY_GUID名は、このトピックで前に説明した MFPKEY キー名に明らかな形で対応しています。
オプション B
このオプションには、Fx プロパティ ストア内に対応するプロパティが存在しない場合に、Windows APO の機能の一部が既定で有効になる可能性を正しく処理できるという利点があります。
オプション B を使用すると、カスタム APO は単純に APO に対して IPropertyStore インターフェイスを照会し、このトピックで前述した MFPKEY_XXX キーのいずれかを使用して IPropertyStore::GetValue を呼び出します。
形式に関するネゴシエーション
SFX APO をラップするカスタム SFX APO を実装する場合は、カスタム APO の登録プロパティで APO_FLAG_FRAMESPERSECOND_MUST_MATCH
を指定しないでください。 カスタム APO がチャンネル形式を変更できるかどうかに関わらず、この規則に従う必要があります。 カスタム SFX APO がこのフラグを指定すると、対応する SFX がスピーカーの充填、ヘッドフォンの仮想化、またはバーチャル サラウンドを実行できなくなります。
カスタム SFX APO の実装では、IAudioProcessingObject::IsInputFormatSupported を実装またはオーバーライドする必要があります。 基底クラスの IsInputFormatSupported の実装は、カスタム SFX APO と SFX APO によって実装された可能なチャンネル変換のセットを、正確に反映する可能性はほとんどありません。
カスタム SFX APO の IsInputFormatSupported メソッドは、対応する APO の IsInputFormatSupported を呼び出す必要があります。 これにより、SFX APO が、カスタム SFX APO によって処理されないすべてのチャンネル変換を確実に処理できます。 SFX APO は、今後の Windows リリースでより多くの変換をサポートするように更新される可能性がある点に注意してください。 APO の IsInputFormatSupported メソッドの呼び出しは、カスタム APO でサポートされるチャンネル変換のセットに、SFX APO でサポートされているチャンネル変換のセットが完全に含まれていることを確認できる 1 つの方法です。
SFX APO の IsInputFormatSupported メソッドからの戻り値でカスタム APO が実行する必要がある処理は、カスタム SFX APO がサポートするチャンネル変換 (ある場合) によって異なります。
カスタム SFX APO が独自のチャンネル変換をサポートしていない場合、その IsInputFormatSupported メソッドは、SFX APO の IsInputFormatSupported メソッドによって返された値を呼び出し元に直接返すことができます。 例については、"swap" と "compress" のサンプルを参照してください。
カスタム SFX APO が独自のチャンネル変換をサポートしている場合は、SFX APO の IsInputFormatSupported メソッドからの負の戻り値 (S_FAL Standard Edition を含む) は、必ずしも呼び出し元への負の戻り値に変換されるとは限りません。 たとえば、カスタム SFX APO では、対応する APO でサポートされていないチャンネル変換をサポートすることができます。 その場合、カスタム SFX APO は、SFX APO の IsInputFormatSupported メソッドからの戻り値と、サポートされている入力を決定するための独自のロジックを組み合わせる必要があります。 この「組み合わせる」の最適な意味は、優先されるチャンネル変換の種類によって異なります。 最適な方法は、カスタム実装の正確な設計によって異なります。
SFX APO の出力形式はデバイスのミックス形式であるため、SFX APO の IsOutputFormatSupported メソッドは重要ではありません。 この形式は外部の考慮事項に基づいており、SFX APO またはその入力形式の影響を受けることはありません。 そのため、サンプルは IsOutputFormatSupported の正しいロジックの実装を試行しません。
MFX APO ではチャンネル形式の変更を必要とする機能や変更を意味する機能を実装していないため、上記の考慮事項は MFX API には適用されません。 そのため、MFX サンプルでは、IsInputFormatSupported または IsOutputFormatSupported に対して特別な処理は行われません。 カスタム MFX APO のフォーマット ネゴシエーション ロジックは、MFX APO をラップすることによる影響を受けません。
LockForProcess/UnlockForProcess
カスタム APO の IAudioProcessingObjectConfiguration::LockForProcess メソッドは、APO で対応するメソッドを呼び出す必要があります。 LockForProcess() は、さまざまな処理ステージが発生する順序を決定するのに適した場所です。 たとえば、カスタム APO 処理を適用するか、APO の処理を最初に適用するかを決定できます。 3 つのサンプルはすべて、このような決定ロジックの例を提供し、サンプルのコメントにはいくつかの背景が提供されています。 ただし、カスタム APO の具体的な機能や、それらが APO の機能とどのように相互作用するかについての知識が必要となるため、このドキュメントでこのテーマについて完全に一般的なガイダンスを提供することはできません。
GetLatency
カスタム APO の IAudioProcessingObject::GetLatency 実装では、ラップされている APO で GetLatency を呼び出す必要があります。 カスタム APO 処理で待機時間が発生する場合は、呼び出し元に値を返す前に、APO によって返された結果に待機時間を追加する必要があります。
APOProcess
カスタム APO の IAudioProcessingObjectRT::APOProcess メソッドは、処理の前、後、または処理中に APO の APOProcess メソッドを呼び出す必要があります。 必要な中間バッファーを割り当てることができるように、APOProcess を呼び出すタイミングを LockForProcess で決定する必要があります。 APO は、入力形式と出力形式が同じ場合に常にインプレース処理をサポートします。 その場合、カスタム APO は、Windows APO の入力接続プロパティと出力接続プロパティの両方と同じ APO_CONNECTION_PROPERTY を渡すことができます。 ただし、カスタム APO では、APO の出力接続プロパティとしてカスタム APO の入力接続プロパティを使用しないでください。 一般に、APO は入力バッファーを変更すべきではありません。
APO エラーの処理
APO が、対応するカスタム APO にエラーを返した場合、カスタム APO はその時点から APO がないかのように動作する必要があります。 サンプルでは、すべての APO エラーを、APO の作成に失敗した CoCreateInstance と同等として扱います。 必要に応じて、カスタム APO は、APO の LockForProcess メソッドからのエラーの影響を現在のセッションに制限できます。 つまり、カスタム APO は、その APOProcess メソッドの後続の呼び出し中に APO を使用しません。 ただし、別の形式で後で別の LockForProcess 呼び出しがある場合は、カスタム APO で APO の使用を再試行できます。
コンパイルとリンク設定
APO CLSID とプロパティ キー定義を使用するには、wmcodecdsp.h を含め、wmcodecdspuuid.lib とリンクさせます。 詳細については、「wmcodecdsp.h ヘッダー」を参照してください。
APO のサンプル
オーディオ システムの効果のサンプルは 4 つあります。 APO のサンプルは、GitHub の次のページで入手できます。https://github.com/Microsoft/Windows-driver-samples/tree/main/audio/sysvad/APO
カスタム オーディオ システム効果の一般的なガイドライン
カスタム オーディオ システム効果の APO を実装するときに、IHV が従う必要があるガイドラインをいくつか次に示しています。
- すべてのオーディオ システム効果にはオン/オフのオプションが用意されている必要があります。 ユーザーに対して、オーディオ システム効果の使用を強制しないでください。
- SFX と MFX APO の機能間の相互作用は、APO とそれに関連する UI によって仲介される必要があります。
- ここで SFX または MFX として指定されている機能は、カスタム実装で SFX と MFX の間で移動できます。 ただし、オン/オフ オプションが存在し、オプションのアクセシビリティと妥当性が損なわれない必要があることを理解した上で、これを行う必要があります。
- 実装者は、SFX が異なる入力チャンネル マスクと出力チャンネル マスクを持つ可能性があることを覚えておく必要があります。 MFX APO には、同じ入力チャンネル マスクと出力チャンネル マスクが必要です。
Windows が提供する API
他の Windows 提供の API については、次のトピックを参照してください。
特定の APO カスタマイズ情報
ラウドネス イコライゼーション (SFX APO)
ラウドネス イコライゼーションは、知覚的なラウドネス メトリックによって駆動される圧縮 (ダイナミクス) 処理です。 室内音響補正 (MFX APO)
室内音響補正では、室内調整ウィザードによって生成されたプロファイルが使用されます。 このプロファイルはバイナリ BLOB として格納されます。 BLOB の形式は現在公開されていません。
チャンネル変換 (SFX APO)
チャンネル変換 APO は、いくつかのタスクを処理します。
ヘッドフォンの仮想化
この効果は、再生されるコンテンツのチャンネル形式 (N.x) が 2.0 以上 (x は 0 または 1) の場合に有効になります。 出力マスクはステレオ (0x3) である必要があります。 入力マスクは、サポートされているいくつかの組み合わせに制限されています。次の表に一覧で示しています。
ヘッドフォンの仮想化チャンネル マスク
名前 | 値 |
---|---|
MASK_STEREO MASK_FRONTLR | 0x3 |
MASK_3_FRONT (SPEAKER_FRONT_CENTER | MASK_FRONTLR) | 0x7 |
MASK_4_SQUARE (MASK_FRONTLR | MASK_BACKLR) | 0x33 |
MASK_4_DIAMOND (MASK_FRONTLR | MASK_FBCENTERS) | 0x107 |
MASK_5_BACK (MASK_FRONTLR | MASK_BACKLR | SPEAKER_FRONT_CENTER) | 0x3F |
MASK_5_SIDE (MASK_FRONTLR | MASK_SIDELR | SPEAKER_FRONT_CENTER) | 0x60F |
仮想サラウンド
この効果は、左/右 (LTRT) フォールドダウン、または左/右マトリックス エンコードとも呼ばれます。 再生されるコンテンツのチャンネル形式 (N.x) が 2.0 以上 (x は 0 または 1) の場合に使用されます。 LTRT フォールドダウンは通常 4.0 から 2.0 です。 その他の入力形式は、通常、最初に N.x を 4.0 汎用フォールドダウンに適用することによって処理されます。 ただし、この実装では、LTRT フォールドダウンはネイティブで 5.1 から 2.0 です。 その他の入力は、最初に N.x を 5.1 汎用フォールドダウンに適用することによって処理されます。
出力チャンネル マスクは 0x3 (ステレオ) にする必要があり、入力チャンネルの数 (存在する場合はサブウーファーを含む) は 8 つ以下にする必要があります。
スピーカー フィル
この効果は、入力チャンネル (N) の数が出力チャンネル (M) の数より少ない場合に使用されます。 この効果では N.x チャンネルを M.x チャンネルにします。x は 0 または 1 のいずれかになります。
表 4 のチャンネル マスク (LFE チャンネルを無視) は、スピーカー フィルに対応しています。 スピーカー フィルでは、入力または出力サブウーファー チャンネル プレゼンスの任意の組み合わせがサポートされているため、左側の数値は例にすぎません。 実際の構成には、サブウーファーが含まれている場合とない場合があります。
スピーカー フィル チャンネル マスク
名前 | 値 |
---|---|
MASK_STEREO MASK_FRONTLR | 0x3 |
MASK_3_FRONT (SPEAKER_FRONT_CENTER | MASK_FRONTLR) | 0x7 |
MASK_4_SQUARE (MASK_FRONTLR | MASK_BACKLR) \ | 0x33 |
MASK_4_DIAMOND (MASK_FRONTLR | MASK_FBCENTERS) | 0x107 |
MASK_5_BACK (MASK_FRONTLR | MASK_BACKLR | SPEAKER_FRONT_CENTER) | 0x3F |
MASK_5_SIDE (MASK_FRONTLR | MASK_SIDELR | SPEAKER_FRONT_CENTER) | 0x60F |
MASK_7_SIDE_BACK (MASK_FRONTLR | MASK_BACKLR | SPEAKER_FRONT_CENTER | MASK_SIDELR) | 0x63F |
MASK_7_FRONT_SIDE (MASK_FRONTLR | MASK_SIDELR | SPEAKER_FRONT_CENTER | MASK_CENTERLR) | 0x6CF |
MASK_7_FRONT_BACK (MASK_FRONTLR | MASK_BACKLR | SPEAKER_FRONT_CENTER | MASK_CENTERLR) | 0xFF |
次のいずれかに該当する場合、スピーカー フィルはサポートされません。
- 入力マスクが出力マスクと等しくなります。
- 入力と出力の唯一の違いは、一方には、サイドの左/右チャンネルがあり、もう一方にはバックの左/右チャンネルがあることです。
- 入力には、出力よりも多くのメイン チャンネルがあります。
- 出力マスクにはセンターの左/右のスピーカーが含まれていますが、入力マスクには含まれません。
- 入力には含まれていませんが、出力内のチャンネルのセットには、フロント センター、バック左/右、またはサイド左/右の少なくとも 1 つが含まれます。
リストの 2 番目の項目には例外が 1 つあります。 入力と出力の唯一の違いが、一方にサイドの左/右のチャンネルがあり、もう一方にバックの左/右のチャンネルがある点である場合は、いずれかのフォーマットにチャンネル マスク ビット オーダーで sideLR と backLR の間に収まるようになるチャンネルが含まれている場合、スピーカー フィルがサポートされます。 このようなチャンネルは 3 つあります。
- SPEAKER_FRONT_LEFT_OF_CENTER
- SPEAKER_FRONT_RIGHT_OF_CENTER
- SPEAKER_BACK_CENTER
入力または出力マスクにこれら 3 つのチャンネルのいずれかが含まれている場合、リストの 2 番目の条件を満たしていない場合でも、他の条件が満たされている場合は、スピーカー フィルがサポートされる可能性があります。 たとえば、MASK_7_FRONT_BACK から MASK_7_FRONT_SIDE へのスピーカー フィルは、この理由から、スピーカー フィルがサポートされています。
次の表に、チャンネルの値の全リストを示しています。
名前 | 値 |
---|---|
SPEAKER_FRONT_LEFT | 0箸1 |
SPEAKER_FRONT_RIGHT | 0等2 |
SPEAKER_FRONT_CENTER | 0餡4 |
SPEAKER_LOW_FREQUENCY | 0酒8 |
SPEAKER_BACK_LEFT | 0煮10 |
SPEAKER_BACK_RIGHT | 0x20 |
SPEAKER_FRONT_LEFT_OF_CENTER | 0x40 |
SPEAKER_FRONT_RIGHT_OF_CENTER | 0x80 |
SPEAKER_BACK_CENTER | 0x100 |
SPEAKER_SIDE_LEFT | 0x200 |
SPEAKER_SIDE_RIGHT | 0x400 |
遅延は、入力構成のフロントバック範囲の "外側" にある出力構成のチャンネルに使用されます。 逆に、出力構成のスピーカーがフロントバック感覚で入力構成の一部のスピーカーの "間" にある場合、そのスピーカーの出力は、出力チャンネルの両側にある入力チャンネルの一部をミックスすることによって生成されます。
Windows APO を再利用するときの実行時の考慮事項
このセクションでは、IHV と OEM がカスタム オーディオ システム効果を実装するときに役立つ可能性がある追加情報について説明します。
カスタム APO 実装:
- CoCreateInstance を使用して、Windows カスタム オーディオ システム 効果 API の 1 つ以上のインスタンスをインスタンス化します。
- 目的の機能セットを有効にするように各インスタンスを構成します。
- カスタム APO の内部パイプライン内の適切な場所に各インスタンスを挿入します。
1 つ以上のインスタンスが必要な理由
望ましくない相互作用を回避するために、ほとんどの機能には一定の相対的な順序が必要です。 Windows API は 1 つの APO 内に複数の機能を実装します。このため、正しい順序を確保するように、その APO の複数のインスタンスが必要になる場合があります。 たとえば、A、B、C の 3 つの有効な機能を ABC の順に並べ替える必要があるとします。 カスタム実装は B を処理しますが、A と C を Windows APO に委任します。 その後、B のカスタム実装がこれらの間で実行されるように、A と C は Microsoft APO の個別のインスタンスに存在する必要があります。
Windows は MFX APO に室内音響補正を実装します。これは、SFX APO とは別の COM オブジェクトであることを意味します。 カスタム実装では、室内音響補正を Windows 実装に委任することを選択して、カスタム SFX APO に配置することもできます。 その後、カスタム SFX 実装では、Windows SFX APO 実装に一部の処理を委任し、その他の処理を Windows MFX APO 実装に委任することが必要になる場合があります。
さまざまな入出力形式の組み合わせの制限事項の処理
多くの機能 (特に低音管理) は、特定のケースでは機能しません。 たとえば、低音スピーカー構成プロパティが "AllSmall" または "AllLarge" で、出力形式にサブウーファー チャンネルが含まれていない場合、または NoSub フラグが設定されている場合、前方低音管理は未定義です。 IPropertyStore::SetValue 呼び出し中は、常にエラーを検出できるとは限りません。 このメソッドは機能を有効にしようとしますが、その時点では、入力形式と出力形式は不明です。これは、LockForProcess がすべてのプロパティ操作の後に実行される必要があるためです。 つまり、機能を有効にして、明らかに成功したことを確認できますが、対応する処理は実行されません。
このような状況に対処するには、次の 2 つの方法を使用することができます。
- ある機能がいつ成功するか、あるいは成功しないかを正確に予測できるようにするために、このドキュメントの機能に特化したセクションを注意深く調べてください。
- LockForProcess が呼び出された後に IPropertyStore::GetValue を呼び出して、重要なプロパティの状態をチェックします。
入力形式と出力形式、またはその他のプロパティの値が原因で、LockForProcess が特定の機能を有効にできないと判断した場合、LockForProcess はプロパティ ストア内の対応するプロパティの値を更新します。
スピーカー フィルと低音管理の相互作用
スピーカー フィルがオンになっていてサブウーファーが接続されている場合、スピーカー フィルのサラウンド遅延による低周波数信号のコム フィルタリングを避けるために、スピーカー フィルの前に前方低音管理が行われる必要があります。
スピーカー フィルが有効になっていて、サブウーファーが接続されていない場合は、次の 2 種類の前方低音管理が可能です。
- フロント左/右のスピーカーが大きい場合、前方低音管理では、サラウンド チャンネルとセンター チャンネルの低周波数部分をフロント左/右のスピーカーにルーティングします。 前方低音管理は、このケースでは、スピーカー フィルの後になる必要があります。
- すべてのスピーカーが小さい場合は、前方低音管理は、すべてのメイン スピーカーに対して低周波数保護となります。
これは、スピーカー フィルの前か後のいずれでも実行可能です。 ただし、パフォーマンス上の理由から、スピーカー フィルの前に前方低音管理を行うことが推奨されます。
Windows APO では、2.0 => 5.1 などの特定の一般的なスピーカー フィル構成が実装され、スピーカー フィルと同じ手順でリバース低音管理を処理する特別に最適化されたコードが使用されます。
フォールドダウンと低音管理の相互作用
ヘッドフォンの仮想化では、リバース低音管理のみがサポートされます。
- 前方低音管理は、ヘッドフォンの仮想化では意味を成しません。
- 実装を簡素化する目的で、低周波数保護と低音ブーストはサポートされていません。
ヘッドフォンの仮想化、仮想サラウンド エンコード、またはスピーカー フィル効果のいずれかがオンになっている場合、その手順中にリバース低音管理が処理されます。 リバース低音管理は、別個の機能であるかのように、APO のリバース低音管理プロパティを介して制御されます。 このような場合、リバース低音管理は単に .1 入力チャンネルのフォールドダウン係数を制御します。 未解決の問題の 1 つが、LTRT がオンになっている場合、リバース低音管理を無効にできないことです。 その場合, リバース低音管理は、従来とは異なるサブウーファー チャンネル ゲインを使用します.
Windows オーディオ システム効果 APO では、有効になっている機能がない場合でも、わずかな処理のゲインと遅延が適用されます。 このような処理は、機能が即時で有効になったときに、ゲインと遅延のパラメーターに変更が生じないようにすることを目的としています。 この理由は、遅延は一部の機能の実装に固有であり、またゲインは、一部の機能によって <1 が、特定の状況で過度に高い出力を回避するために適用されるためです。 使用可能な機能のセットは、入出力形式と特定のプロパティによって異なり、累積正規化のゲインと遅延も異なります。
機能をオンまたはオフにしない場合は、IPropertyStore::SetValue を呼び出して MFPKEY_CORR_NORMALIZATION_GAIN
プロパティを FALSE に設定することで、正規化のゲインを無効にすることができます。 既定では、プロパティは TRUE になっている場合があります。
正規化の遅延は、正規化のゲインよりも好ましくない可能性が低いと推定されるため、無効にするメカニズムはありません。 正規化の遅延が好ましくない場合は、単純に問題の APO をバイパスすることができます。