動的サブデバイスの登録と登録解除
何らかの形式のジャック プレゼンス検出をサポートするデバイスは動的デバイスと呼ばれ、これらのデバイスのジャックは KSPROPERTY_JACK_DESCRIPTION プロパティを サポートしている必要があります。 以下の手順では、動的デバイスのドライバーが、これらの動的デバイスに関連付けられているサブデバイスを作成、登録、または登録解除するために使用するアルゴリズムを示しています。 サブデバイスはフィルターの形式で作成されます。
次の手順では、オーディオ デバイス ドライバーが読み込まれるときにオーディオ デバイスがジャックに接続されている場合の動作を示します。
ドライバーは、ジャック プレゼンス検出を使用して、ジャックに接続されているデバイスがあることを確認します。 ドライバーは、PcRegisterSubdevice を呼び出して、トポロジ フィルターを Portcls に登録します。 KSCATEGORY_AUDIO インターフェイスは、トポロジ フィルターの登録の結果として作成されます。
KSCATEGORY_AUDIO インターフェイスが作成され、AudioEndpoint Builder が関連付けられたエンドポイントを作成して初期化し、その状態をアクティブに設定すると、オーディオ スタックに通知されます。
ドライバーは、Portcls にウェーブ フィルターを登録し、オーディオ スタックが通知されます。
ドライバーは、トポロジ フィルターとウェーブ フィルターを接続する PcRegisterPhysicalConnection を呼び出します。 その後、この物理接続は Portcls に登録されます。
ドライバーは、ジャックに接続されているデバイスがあることを示すために、KSJACK_DESCRIPTION 構造体の IsConnected メンバーを TRUE に設定します。
注意 デバイスにジャック プレゼンス検出が備わっていない場合、IsConnected メンバーは常に TRUE である必要があります。 デバイスがジャック プレゼンス検出をサポートしているかどうかを確認するために、クライアント アプリケーションは IKsJackDescription2::GetJackDescription2 を呼び出して、KSJACK_DESCRIPTION2 構造体の JackCapabilities フラグを読み取ることができます。 このフラグに JACKDESC2_PRESENCE_DETECT_CAPABILITY ビットが設定されている場合は、エンドポイントがジャック プレゼンス検出をサポートしていることを示しています。 この場合、IsConnected メンバーの戻り値を、ジャック挿入状態を正確に反映したものとして解釈することができます。
次の手順では、ドライバーの読み込み時にオーディオ デバイスがジャックに接続されていない場合の動作について説明します。
ドライバーは、ジャック プレゼンス検出を使用して、ジャックに接続されているデバイスがないと判断しますが、 ドライバーはジャックの Portcls にトポロジ フィルターを登録し、KSCATEGORY_AUDIO インターフェイスが作成されます。
KSCATEGORY_AUDIO インターフェイスが作成されると、オーディオ スタックに通知されます。 AudioEndpointBuilder は、ミニポート ドライバーを照会して、エンドポイントの状態を取り外し済みとして設定するかどうかを KSJACK_DESCRIPTION プロパティから判断します。
ドライバーは、ジャックに接続されているデバイスがないことを示すために、KSJACK_DESCRIPTION 構造体の IsConnected メンバーを FALSE に設定します。
オーディオ エンドポイントのさまざまな状態の詳細については、「オーディオ エンドポイント ビルダー アルゴリズム」を参照してください。
サブデバイスの登録および登録解除プロセスの前述の説明に従うために、ジャック プレゼンス検出をサポートするデバイス ドライバーが、プラグの挿入と削除に応じて、次の方法で対応する必要があります。
プラグ挿入に対するデバイス ドライバーの応答
ドライバーは、ウェーブ フィルターを Portcls に登録する PcRegisterSubdevice を呼び出す必要があります。 注意 ジャックにデバイスが差し込まれていない状態でドライバーがロードされたとき、ドライバーは既にトポロジー フィルタの PcRegisterSubdevice を呼び出しています。
ドライバーは、PcRegisterPhysicalConnection を呼び出して、"ウェーブからトポロジ フィルターへの" 接続を Portcls に登録する必要があります。
ドライバーは、KSJACK_DESCRIPTION 構造体の IsConnected メンバーを TRUE に設定する必要があります。
プラグ削除に対するデバイス ドライバーの応答
ウェーブ フィルターとトポロジ フィルターの間の物理接続の登録を解除するには、ドライバーは、IUnregisterPhysicalConnection::UnregisterPhysicalConnection を呼び出す必要があります。
ウェーブ フィルターの登録を解除するには、ドライバーは、IUnregisterSubdevice::UnregisterSubdevice を呼び出す必要があります。
ドライバーは、KSJACK_DESCRIPTION 構造体の IsConnected メンバーを FALSE に設定する必要があります。