ACX ターゲットとドライバーの同期
このトピックでは、オーディオ クラス拡張機能 (ACX) ターゲットとドライバーの同期の概要について説明します。
ACX の一般的な情報については、「ACX オーディオ クラス拡張機能の概要」と「ACX オブジェクトの概要」を参照してください。 IRP の詳細については、「ACX IO 要求パケット IRP」を参照してください。
ACX ターゲット
ACX は WdfIoTarget を使用して、ACX オブジェクト、回線、ピン、ストリーム、要素、回線ファクトリ間の通信を容易にします。 WdfIoTarget は、2 つの異なるスタック間の通信を容易にする既存の WDF 抽象化です。
ドライバーは、AcxTargetCircuit を使用して、異なるスタックによって公開されたリモート回線と通信します。 AcxTargetCircuit は、WdfIoTarget を使用して実装されます。
ドライバーは、AcxTargetPin を使用して、異なるスタックによって公開されたリモート回線のピンと通信します。 AcxTargetPin は、リモート ピン エンティティにメッセージを送信する WdfIoTarget を使用して実装されます。
ドライバーは、AcxTargetStream を使用して、異なるスタックによって公開されたリモート回線のストリームと通信します。 AcxTargetStream は、リモート ストリームを作成し、リモート ストリームの状態を変更するために WdfIoTarget を使用して実装されています。
ドライバーは、AcxTargetElement を使用して、異なるスタックによって公開されたリモート回線の要素と通信します。 AcxTargetElement は、リモート要素エンティティにメッセージを送信するために WdfIoTarget を使用して実装されます。
ドライバーは、AcxTargetFactoryCircuit を使用して、リモート回線ファクトリ インスタンスと通信します。 AcxTargetFactoryCircuit は、リモート回線ファクトリにメッセージを送信するために WdfTarget を使用して実装されます。
リモート回線と相互作用するために、上記の ACX の各種類は次をサポートします。
- プロパティ
- メソッド
- イベント
これらの型はすべて、WdfIoTarget オブジェクト型の上に構築されます。
この図は、ACX ターゲット アーキテクチャと、WDF ドライバーとデバイス オブジェクトからの継承を示しています。
ACX ドライバーの同期とシリアル化
同期という用語は一般的な用語であり、複数の同時実行クライアント間でリソース (メモリ、I/O など) を共有するために必要な操作を指します。
シリアル化という用語は、1 種類のオブジェクト (I/O 要求、コールバックなど) に対して 1 種類の同期を参照するために使用されます。
ACX ドライバーは WDF ドライバーです。つまり、ACX ドライバーの同期は WDF の同期機能に基づいています。
- 参照カウントと階層オブジェクト モデルの使用。
- I/O キューのドライバーで構成可能なフロー制御。
- デバイス オブジェクトと I/O キューのオブジェクト表示ロック。
- プラグ アンド プレイと電源コールバックの自動シリアル化。
同期とシリアル化について詳しくは、「自動同期機能の使用」を参照してください。 詳しい説明については、Microsoft Press Book の「Windows Driver Foundation」を参照してください。
WDF では、次の同期スコープがサポートされています。
- スコープなし (KMDF では既定値)。
- デバイス スコープ、WDF は、操作をシリアル化するデバイス オブジェクト プレゼンテーション ロックを取得します。
既定の ACX キューは、ロックのないパッシブなシリアル キューです。 ドライバーは、次の操作が配信される前に、I/O 操作を完了する必要があります。
ACX では、キュー スコープ オプションはサポートされていません。 このオプションを使用すると、ドライバーは特定のキューの I/O をシリアル化します。 キューによって同期スコープが異なる場合があります。
ACX では、デバイス スコープのシリアル化はサポートされていません。 既定では、ACX は、ロックなしでシリアル I/O キューを使用して要求をシリアル化します。 すべての回線およびストリーム オブジェクトには、独自の専用キューがあります。 ストリーミング I/O の詳細については、ACX ストリーミングのトピックを参照してください。
ドライバーがロックを保持している場合は、ロックが解放されるまで、コントロールの外部で (明示的または暗黙的に) コードを呼び出さないでください。
履歴参照では、元の PortCls は WDF デバイス スコープ同期のような同期スコープを使用し、このデバイスで作成されたすべてのオーディオ サブデバイスのすべての I/O が同じシリアル化ロックを経由します。 この種類のシリアル化は、さまざまな障害の原因です。 それ以降のバージョンの Windows 10 (バージョン 1511 - TH2) では、ストリーム位置 I/O 要求に別のロックを使用するように PortCls が更新されました。