Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Vzhledem k tomu, že v systému může běžet více instancí aplikace, která zobrazuje vysílání médií současně, měli byste napsat minidriver BDA, aby vyhovoval více instancím filtru. Každá instance filtru může obsahovat jiné informace. Například jedna instance filtru tuneru může obsahovat požadavek na ladění na kanál 5, zatímco jiná instance může obsahovat požadavek na ladění kanálu 8. Při přechodu ovládacích prvků z jedné instance do druhé musí minidriver BDA instruovat základní zařízení pro ladění, aby změnilo způsob konfigurace prostředků. Minidriver BDA zpracovává žádosti o metody sady KSMETHODSETID_BdaChangeSync za účelem koordinace seznamu požadavků na vlastnosti na jedné z instancí filtrů minidriveru.
Primárním účelem sady metod KSMETHODSETID_BdaChangeSync je poskytnout aktivační body, ve kterých základní minidriver pro filtr může získat a uvolnit prostředky z objektu zařízení minidriveru. Minidriver musí tyto aktivační body koordinovat s přechodem filtru do a ze zastaveného stavu. Pokud je například filtr v zastaveném stavu, měl by minidriver přiřadit k filtru nové prostředky, ale nezískávat je, kdykoli poskytovatel sítě požádá o provedení změn topologie BDA. Když se filtr následně přepne ze zastaveného stavu, měl by se minidriver pokusit se získat tyto prostředky ze základního zařízení.
Na druhou stranu, pokud je filtr již aktivní, měl by se minidriver pokusit získat nové prostředky ze základního zařízení, kdykoli poskytovatel sítě určí provést změny topologie BDA. V daném okamžiku může být aktivní pouze jedna instance filtru, která je spuštěná a drží stejné prostředky. Když filtr přejde do zastaveného stavu, měl by proto uvolnit všechny prostředky, včetně prostředků přidělených kterémukoli z jeho pinů, aby byly prostředky k dispozici jinému grafu filtrů, který přejde do spuštěného stavu.
Objekt filtru BDA obvykle zachycuje a dodává metody sady KSMETHODSETID_BdaChangeSync. Minidriver například poskytuje metody pro spuštění, kontrolu a potvrzení změn filtru a získání stavu změn filtru. Kromě toho by měly následující metody dodané minidriverem volat odpovídající funkce knihovny podpory BDA k synchronizaci změn ve strukturách, které minidriver dříve zaregistroval v knihovně podpory BDA:
Metoda Start-changes volá funkci BdaStartChanges .
Metoda Check-changes volá funkci BdaCheckChanges .
Metoda Commit-changes volá funkci BdaCommitChanges .
Metoda Get-changed-state volá funkci BdaGetChangeState .
Následující fragment kódu ukazuje, jak zachytit požadavky metody sady metod KSMETHODSETID_BdaChangeSync pomocí interní metody:
//
// 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
)
};
Následující fragment kódu ukazuje, jak interní metoda pro spuštění změn v minidriveru BDA resetuje čekající změny prostředků poté, co minidriver volá podpůrnou funkci BdaStartChanges za účelem zahájení nastavení nových změn topologie BDA.
//
// 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;
}