Condividi tramite


Modifica delle proprietà del filtro BDA

Poiché più istanze di un'applicazione che visualizzano trasmissioni multimediali possono essere eseguite contemporaneamente in un sistema, è necessario scrivere un minidriver BDA per supportare più istanze di un filtro. Ogni istanza del filtro può contenere informazioni diverse. Ad esempio, un'istanza di un filtro di tuner può contenere una richiesta per ottimizzare il canale 5, mentre un'altra istanza può contenere una richiesta per ottimizzare il canale 8. Man mano che il controllo passa da un'istanza a un'altra, il minidriver BDA deve indicare al dispositivo di ottimizzazione sottostante di modificare la modalità di configurazione delle risorse. Un minidriver BDA elabora le richieste di metodo del metodo KSMETHODSETID_BdaChangeSync impostato per coordinare un elenco di richieste di proprietà in una delle istanze di filtro del minidriver.

Lo scopo principale del set di metodi di KSMETHODSETID_BdaChangeSync consiste nel fornire punti trigger in cui il minidriver sottostante per un filtro può acquisire e rilasciare risorse dall'oggetto dispositivo del minidriver. Il minidriver deve coordinare questi punti trigger con la transizione del filtro da e verso uno stato arrestato. Ad esempio, se il filtro si trova in uno stato arrestato, il minidriver deve assegnare nuove risorse al filtro, ma non acquisire tali risorse ogni volta che il provider di rete specifica di eseguire il commit delle modifiche della topologia BDA. Quando il filtro passa successivamente dallo stato arrestato, il minidriver deve quindi tentare di acquisire tali risorse dal dispositivo sottostante.

D'altra parte, se il filtro è già attivo, il minidriver deve tentare di acquisire nuove risorse dal dispositivo sottostante ogni volta che il provider di rete specifica di eseguire il commit delle modifiche della topologia BDA. Solo un'istanza del filtro può essere attiva nello stato in esecuzione e mantenere le stesse risorse in qualsiasi momento. Quando un filtro passa allo stato arrestato, deve quindi rilasciare tutte le risorse, incluse quelle allocate per uno dei relativi pin, in modo che le risorse siano disponibili per un altro grafico di filtro che passa allo stato di esecuzione.

In genere, l'oggetto filtro di un minidriver BDA intercetta e fornisce metodi per i metodi del set di metodi KSMETHODSETID_BdaChangeSync. Ad esempio, il minidriver fornisce metodi per l'avvio, il controllo e il commit delle modifiche del filtro e per ottenere lo stato di modifica di un filtro. Inoltre, i metodi forniti dal minidriver seguenti devono chiamare le funzioni della libreria di supporto BDA corrispondenti per sincronizzare le modifiche nelle strutture registrate in precedenza con la libreria di supporto BDA:

Il frammento di codice seguente illustra come intercettare le richieste di metodo del metodo KSMETHODSETID_BdaChangeSync impostato usando un metodo interno:

//
//  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
        )
};

Il frammento di codice seguente mostra come il metodo di avvio interno in un minidriver BDA reimposta le modifiche delle risorse in sospeso dopo che il minidriver chiama la funzione di supporto BdaStartChanges per avviare l'impostazione delle nuove modifiche della topologia 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;
}