BDA フィルター プロパティの変更
メディア ブロードキャストを表示するアプリケーションの複数のインスタンスはシステム上で同時に実行できるため、フィルターの複数のインスタンスに対応するために BDA ミニドライバーを作成する必要があります。 各フィルター インスタンスには、異なる情報を含めることができます。 例えば、チューナーフィルターの 1 つのインスタンスにはチャンネル 5 へのチューニング要求が含まれ、別のインスタンスにはチャンネル 8 へのチューニング要求が含まれます。 コントロールが 1 つのインスタンスから別のインスタンスに移行する場合、BDA ミニドライバーは、リソースの構成方法を変更するように基礎となるチューニング デバイスに指示する必要があります。 BDA ミニドライバーは、ミニドライバーのフィルター インスタンスのプロパティ要求の一覧を調整するために設定された KSMETHODSETID_BdaChangeSync メソッドのメソッド要求を処理します。
KSMETHODSETID_BdaChangeSync メソッド セットの主な目的は、フィルターの基礎となるミニドライバーがミニドライバーのデバイス オブジェクトからリソースを取得および解放できるトリガー ポイントを提供することです。 ミニドライバーは、これらのトリガーポイントを、フィルターの停止状態への遷移や停止状態からの遷移と調整する必要があります。 例えば、フィルタが停止状態にある場合、ミニドライバは、ネットワークプロバイダが BDA トポロジーの変更をコミットするよう指定した場合、新しいリソースをフィルターに割り当てる必要がありますが、それらのリソースを取得する必要はありません。 その後、フィルターが停止状態から遷移すると、ミニドライバーは、基盤となるデバイスからこれらのリソースを取得しようとします。
一方、フィルターが既にアクティブな場合、ミニドライバーは、ネットワーク プロバイダーが BDA トポロジの変更をコミットするように指定するたびに、基盤となデバイスから新しいリソースの取得を試みる必要があります。 フィルターの 1 つのインスタンスのみが、実行中の状態でアクティブになり、任意の時点で同じリソースを保持できます。 フィルターが停止状態に移行すると、ピンに割り当てられたリソースを含むすべてのリソースを解放し、実行状態に移行する別のフィルターグラフがリソースを利用できるようにする必要があります。
通常、BDA ミニドライバーのフィルター オブジェクトは、KSMETHOD Standard Edition TID_BdaChangeSync メソッド セットのメソッドをインターセプトし、メソッドを提供します。 たとえば、ミニドライバーは、フィルターの変更を開始、チェック、コミットしたり、フィルターの変更状態を取得したりするためのメソッドを提供します。 さらに、次のミニドライバーによって提供されたメソッドは、対応する BDA サポート ライブラリ関数を呼び出して、ミニドライバーが以前に BDA サポート ライブラリに登録した構造体の変更を同期する必要があります。
Start-changes メソッドは 、BdaStartChanges 関数を呼び出します。
Check-changes メソッドは BdaCheckChanges 関数を呼び出します。
Commit-changes メソッドは BdaCommitChanges 関数を呼び出します。
Get-changed-state メソッドは 、BdaGetChangeState 関数を呼び出します。
次のコード スニペットは、内部メソッドを使用して KSMETHOD Standard Edition TID_BdaChangeSync メソッド セットのメソッド要求をインターセプトする方法を示しています。
//
// BDA Change Sync Method Set
//
// Defines the dispatch routines for the filter level
// Change Sync methods
//
DEFINE_KSMETHOD_TABLE(BdaChangeSyncMethods)
{
DEFINE_KSMETHOD_ITEM_BDA_START_CHANGES(
CFilter::StartChanges,
NULL
),
DEFINE_KSMETHOD_ITEM_BDA_CHECK_CHANGES(
CFilter::CheckChanges,
NULL
),
DEFINE_KSMETHOD_ITEM_BDA_COMMIT_CHANGES(
CFilter::CommitChanges,
NULL
),
DEFINE_KSMETHOD_ITEM_BDA_GET_CHANGE_STATE(
CFilter::GetChangeState,
NULL
)
};
次のコード スニペットは、ミニドライバーが BdaStartChangesサポート関数を呼び出して新しい BDA トポロジの変更の設定を開始した後に、BDA ミニドライバーの内部 start-changes メソッドが保留中のリソース変更をリセットする方法を示しています。
//
// StartChanges ()
//
// Puts the filter into change state. All changes to BDA topology
// and properties changed after this will be in effect only after
// CommitChanges.
//
NTSTATUS
CFilter::
StartChanges(
IN PIRP pIrp,
IN PKSMETHOD pKSMethod,
OPTIONAL PVOID pvIgnored
)
{
NTSTATUS Status = STATUS_SUCCESS;
CFilter * pFilter;
ASSERT( pIrp);
ASSERT( pKSMethod);
// Obtain a "this" pointer for the method.
//
// Because this function is called directly from the property
// dispatch table, must get pointer to the underlying object.
//
pFilter = FilterFromIRP( pIrp);
ASSERT( pFilter);
if (!pFilter)
{
Status = STATUS_INVALID_PARAMETER;
goto errExit;
}
// Reset any pending BDA topology changes.
//
Status = BdaStartChanges( pIrp);
if (!NT_SUCCESS( Status))
{
goto errExit;
}
// Reset any pending resource changes.
//
pFilter->m_NewTunerResource = pFilter->m_CurTunerResource;
pFilter->m_BdaChangeState = BDA_CHANGES_COMPLETE;
errExit:
return Status;
}