Ändern der BDA-Filtereigenschaften
Da mehrere Instanzen einer Anwendung, die Medienübertragungen anzeigt, gleichzeitig auf einem System ausgeführt werden können, sollten Sie einen BDA-Minitreiber schreiben, um mehrere Instanzen eines Filters aufzunehmen. Jeder Filter instance kann unterschiedliche Informationen enthalten. Beispielsweise kann ein instance eines Tunerfilters eine Anforderung zum Optimieren von Kanal 5 enthalten, während ein anderer instance eine Anforderung zum Optimieren von Kanal 8 enthalten kann. Wenn die Steuerung von einem instance zu einer anderen übergehen, muss der BDA-Minitreiber das zugrunde liegende Optimierungsgerät anweisen, die Art und Weise zu ändern, wie Ressourcen konfiguriert werden. Ein BDA-Minidriver verarbeitet Methodenanforderungen der KSMETHODSETID_BdaChangeSync-Methode , die festgelegt ist, um eine Liste von Eigenschaftenanforderungen auf einer der Filterinstanzen des Minitreibers zu koordinieren.
Der Hauptzweck des KSMETHODSETID_BdaChangeSync Methodensatzes besteht darin, Triggerpunkte bereitzustellen, an denen der zugrunde liegende Minitreiber für einen Filter Ressourcen aus dem Geräteobjekt des Minitreibers abrufen und freigeben kann. Der Minidriver muss diese Triggerpunkte mit dem Übergang des Filters zu und aus einem beendeten Zustand koordinieren. Wenn sich der Filter beispielsweise in einem beendeten Zustand befindet, sollte der Minitreiber dem Filter neue Ressourcen zuweisen, diese Ressourcen jedoch nicht abrufen, wenn der Netzwerkanbieter angibt, dass sich die BDA-Topologie ändert. Wenn der Filter anschließend aus dem Status "Beendet" wechselt, sollte der Minitreiber versuchen, diese Ressourcen vom zugrunde liegenden Gerät zu beziehen.
Wenn der Filter hingegen bereits aktiv ist, sollte der Minitreiber versuchen, neue Ressourcen vom zugrunde liegenden Gerät zu erhalten, wenn der Netzwerkanbieter angibt, dass sich die BDA-Topologie ändert. Nur eine instance des Filters kann zu einem bestimmten Zeitpunkt aktiv sein – im Zustand "Wird ausgeführt" und die gleichen Ressourcen enthalten. Wenn ein Filter in den Beendet-Zustand übergeht, sollte er daher alle seine Ressourcen freigeben, einschließlich der Ressourcen, die für einen seiner Pins zugewiesen wurden, damit die Ressourcen für ein anderes Filterdiagramm verfügbar sind, das in den Ausführungszustand übergeht.
In der Regel fängt das Filterobjekt eines BDA-Minitreibers Methoden für die Methoden des KSMETHODSETID_BdaChangeSync Methodensatzes ab und stellt sie bereit. Der Minitreiber stellt beispielsweise Methoden zum Starten, Überprüfen und Committen von Filteränderungen und zum Abrufen des Änderungszustands eines Filters bereit. Darüber hinaus sollten die folgenden minidriver-bereitgestellten Methoden die entsprechenden BDA-Unterstützungsbibliotheksfunktionen aufrufen, um Änderungen an den Strukturen zu synchronisieren, die der Minidriver zuvor bei der BDA-Supportbibliothek registriert hat:
Die Start-changes-Methode ruft die BdaStartChanges-Funktion auf .
Die Check-changes-Methode ruft die BdaCheckChanges-Funktion auf .
Die Commit-changes-Methode ruft die BdaCommitChanges-Funktion auf .
Die Get-changed-state-Methode ruft die BdaGetChangeState-Funktion auf.
Der folgende Codeausschnitt zeigt, wie Methodenanforderungen des KSMETHODSETID_BdaChangeSync Methodensatzes mithilfe einer internen Methode abgefangen werden:
//
// 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
)
};
Der folgende Codeausschnitt zeigt, wie die interne Start-Changes-Methode in einem BDA-Minidriver ausstehende Ressourcenänderungen zurücksetzt, nachdem der Minitreiber die BdaStartChanges-Unterstützungsfunktion aufgerufen hat , um die Einstellung neuer BDA-Topologieänderungen zu initiieren:
//
// 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;
}