Compartilhar via


Alterando as propriedades do filtro BDA

Como várias instâncias de um aplicativo que exibe transmissões de mídia podem ser executadas simultaneamente em um sistema, você deve escrever um minidriver BDA para acomodar várias instâncias de um filtro. Cada instância de filtro pode conter informações diferentes. Por exemplo, uma instância de um filtro de sintonizador pode conter uma solicitação para ajustar ao canal 5, enquanto outra instância pode conter uma solicitação para ajustar ao canal 8. À medida que o controle faz a transição de uma instância para outra, o minidriver BDA deve instruir o dispositivo de ajuste subjacente a alterar a forma como os recursos são configurados. Um minidriver BDA processa solicitações de método do método KSMETHODSETID_BdaChangeSync definido para coordenar uma lista de solicitações de propriedade em uma das instâncias de filtro do minidriver.

A principal finalidade do conjunto de métodos KSMETHODSETID_BdaChangeSync é fornecer pontos de gatilho nos quais o minidriver subjacente para um filtro pode adquirir e liberar recursos do objeto de dispositivo do minidriver. O minidriver deve coordenar esses pontos de gatilho com a transição do filtro de e para um estado parado. Por exemplo, se o filtro estiver em um estado interrompido, o minidriver deverá atribuir novos recursos ao filtro, mas não adquirir esses recursos sempre que o provedor de rede especificar para confirmar alterações na topologia do BDA. Quando o filtro faz a transição posteriormente para fora do estado interrompido, o minidriver deve tentar adquirir esses recursos do dispositivo subjacente.

Por outro lado, se o filtro já estiver ativo, o minidriver deverá tentar adquirir novos recursos do dispositivo subjacente sempre que o provedor de rede especificar para confirmar alterações na topologia do BDA. Apenas uma instância do filtro pode estar ativa no estado em execução e mantendo os mesmos recursos a qualquer momento. Quando um filtro faz a transição para o estado interrompido, ele deve, portanto, liberar todos os seus recursos, incluindo os recursos que foram alocados para qualquer um de seus pinos, de modo que os recursos estejam disponíveis para outro grafo de filtro que faz a transição para o estado em execução.

Normalmente, o objeto de filtro de um minidriver BDA intercepta e fornece métodos para os métodos do conjunto de métodos KSMETHODSETID_BdaChangeSync. Por exemplo, o minidriver fornece métodos para iniciar, verificar e confirmar alterações de filtro e para obter o estado de alteração de um filtro. Além disso, os seguintes métodos fornecidos pelo minidriver devem chamar as funções de biblioteca de suporte do BDA correspondentes para sincronizar alterações nas estruturas que o minidriver registrou anteriormente com a biblioteca de suporte do BDA:

O snippet de código a seguir mostra como interceptar solicitações de método do método KSMETHODSETID_BdaChangeSync definido usando um método 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
        )
};

O snippet de código a seguir mostra como o método start-changes interno em um minidriver BDA redefine alterações de recursos pendentes depois que o minidriver chama a função de suporte BdaStartChanges para iniciar a configuração de novas alterações de topologia do 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;
}