USB ビデオ クラス拡張ユニットのデバイス要件
このセクションでは、デバイスに拡張ユニットを実装するための特定の要件について説明します。 これらの要件が満たされていない場合は、USB ビデオ クラス ドライバーが拡張ユニットで正しく動作しない可能性があります。
Descriptor
拡張ユニット記述子には、有効な一意の GUID が含まれている必要があります。 この GUID は、対応する拡張ノードでプロパティ セットを公開するために、Usbvideo.sys によって使用されます。 Microsoft Windows SDK に含まれる Guidgen.exe という名前のツールを使用して、拡張ユニットの一意の GUID を作成する必要があります。
拡張ユニット プロパティ セット (KSPROPERTY_EXTENSION_UNIT) のプロパティ識別子は、USB ビデオ クラス ファームウェアによって公開される同様の番号が付けられた拡張ユニット制御 ID に対応します。 拡張ユニット制御には、IKsControl インターフェイスを介して標準の KSPROPERTY 要求を使用してアクセスできます。
拡張ユニットの制御 (拡張ユニット制御 ID と呼ばれます) には、1 から最大値 n までの連続した番号を付ける必要があります。 ギャップがある場合、USB ビデオ クラス ドライバーは、ギャップを超える制御を公開しません。 USB ビデオ クラス ドライバーの現在の実装では、拡張ユニット上の制御の数を 31 に制限されています。
プロパティ ID = 0 (KSPROPERTY_EXTENSION_UNIT_INFO) を使用して拡張ユニット記述子の一部を取得します。この構文は、ビデオ デバイス仕様のユニバーサル シリアル バス デバイス クラス定義で定義されています。 この仕様は、USB 実装者フォーラムの Web サイトで入手できます。
プロパティ ID = 1 以降を使用して、対応する拡張ユニット制御に要求を送信します。
KSPROPERTY_EXTENSION_UNIT_CONTROL (プロパティ ID = 1) は実際のプロパティではないことに注意してください。 代わりに、識別子 1 以降が実際の拡張ユニット制御 ID を参照することを示します。
KSPROPERTY_EXTENSION_UNIT_PASS_THROUGH (プロパティ ID = 0xffff) は実装されていません。
次のコード例は、サンプル拡張ユニット プラグイン DLL に示されている完全なサンプルから抜粋したもので、KSPROPERTY_EXTENSION_UNIT_INFO 要求を行う方法を示しています:
ExtensionProp.Property.Set = PROPSETID_VIDCAP_EXTENSION_UNIT;
ExtensionProp.Property.Id = KSPROPERTY_EXTENSION_UNIT_INFO;
ExtensionProp.Property.Flags = KSPROPERTY_TYPE_GET |
KSPROPERTY_TYPE_TOPOLOGY;
ExtensionProp.NodeId = m_dwNodeId;
hr = m_pKsControl->KsProperty(
(PKSPROPERTY) &ExtensionProp,
sizeof(ExtensionProp),
(PVOID) pInfo,
ulSize,
&ulBytesReturned);
return hr;
}
制御要求
デバイスは、USB ビデオ クラスの仕様に従って、すべての拡張ユニット制御の GET_CUR、GET_INFO、GET_LEN、GET_MIN、GET_MAX、GET_DEF、GET_RES 要求をサポートする必要があります。 デバイスでこれらの関数が実装されていない場合、対応するプロパティはユーザー モードに公開されません。
デバイスの初期化中に、ドライバーは、制御要求(GET_INFO、GET_LEN、GET_MIN、GET_MAX)をデバイスに発行します。 これらの最初の要求のいずれかが失敗した場合、Usbvideo.sysは特定の制御を無効にします。
GET_INFOによって返される値は、特定の制御に対して有効な GET 要求と SET 要求をドライバーに通知します。 さらに、GET_INFO は、制御が非同期かどうかをドライバーに通知します。 非同期要求は、状態割り込みエンドポイントによってサポートされています。