다음을 통해 공유


BDA 필터 속성 변경

미디어 브로드캐스트를 보는 애플리케이션의 여러 인스턴스가 시스템에서 동시에 실행되므로 필터의 여러 인스턴스를 수용하도록 BDA 미니드라이버를 작성해야 합니다. 각 필터 instance 서로 다른 정보를 포함할 수 있습니다. 예를 들어 튜너 필터의 한 instance 채널 5로 조정하는 요청을 포함할 수 있고 다른 instance 채널 8로 조정하는 요청을 포함할 수 있습니다. 컨트롤이 한 instance 다른 instance 전환되면 BDA 미니드라이버가 기본 튜닝 디바이스에 리소스 구성 방식을 변경하도록 지시해야 합니다. BDA 미니드라이버가 설정된 KSMETHODSETID_BdaChangeSync 메서드의 메서드 요청을 처리하여 미니드라이버의 필터 인스턴스 중 하나에서 속성 요청 목록을 조정합니다.

KSMETHODSETID_BdaChangeSync 메서드 집합의 주요 목적은 필터의 기본 미니 드라이버가 미니드라이버의 디바이스 개체에서 리소스를 획득하고 해제할 수 있는 트리거 지점을 제공하는 것입니다. 미니드라이버가 이러한 트리거 지점을 필터가 중지된 상태로 전환하여 조정해야 합니다. 예를 들어 필터가 중지된 상태인 경우 미니드라이버는 필터에 새 리소스를 할당해야 하지만 네트워크 공급자가 BDA 토폴로지 변경 내용을 커밋하도록 지정할 때마다 해당 리소스를 획득하지 않아야 합니다. 필터가 이후에 중지된 상태에서 전환되면 미니드라이버가 기본 디바이스에서 해당 리소스를 획득하려고 시도해야 합니다.

반면 필터가 이미 활성 상태인 경우 네트워크 공급자가 BDA 토폴로지 변경 내용을 커밋하도록 지정할 때마다 미니드라이버는 기본 디바이스에서 새 리소스를 획득하려고 시도해야 합니다. 필터의 instance 하나만 활성화될 수 있습니다(실행 중 상태 및 동일한 리소스 보유). 따라서 필터가 중지됨 상태로 전환되면 핀에 할당된 리소스를 포함하여 모든 리소스를 해제하여 실행 중 상태로 전환되는 다른 필터 그래프에서 리소스를 사용할 수 있도록 해야 합니다.

일반적으로 BDA 미니드라이버의 필터 개체는 KSMETHODSETID_BdaChangeSync 메서드 집합의 메서드를 가로채고 메서드를 제공합니다. 예를 들어 미니드라이버에서는 필터 변경 내용을 시작, 확인 및 커밋하고 필터의 변경 상태를 가져오는 메서드를 제공합니다. 또한 다음 미니 드라이버 제공 메서드는 해당 BDA 지원 라이브러리 함수를 호출하여 이전에 BDA 지원 라이브러리에 등록된 미니드라이버의 구조에 대한 변경 내용을 동기화해야 합니다.

다음 코드 조각은 내부 메서드를 사용하여 KSMETHODSETID_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;
}