Поделиться через


Запуск мини-накопителя BDA

Когда устройство BDA начинает работу, диспетчер Plug and Play (PnP) отправляет IRP_MN_START_DEVICE. Класс AVStream, в свою очередь, вызывает подпрограмму запуска мини-драйвера BDA, связанного с устройством BDA. Эта начальная подпрограмма извлекает сведения об устройстве из реестра, задает сведения об устройстве, а затем вызывает функцию поддержки BdaCreateFilterFactory для:

  • Создайте фабрику фильтров для устройства из исходного дескриптора фильтра (KSFILTER_DESCRIPTOR) для устройства. Начальный дескриптор фильтра ссылается на таблицы диспетчеризации и автоматизации для фильтров и входных контактов. Дополнительные сведения см. в разделах Создание таблиц диспетчеризации и Определение таблиц автоматизации .

  • Свяжите фабрику фильтров с BDA_FILTER_TEMPLATE структурой. Эта структура ссылается на дескриптор фильтра шаблона для устройства и список возможных пар входных и выходных контактов. Этот дескриптор и список, по очереди ссылающийся:

    • Статические структуры шаблонов, которые поставщик сети может использовать для определения топологии фильтра BDA.
    • Узлы и контакты для фильтра BDA, а также возможные способы подключения фильтра.
    • Подпрограммы, которые поставщик сети может использовать для создания и закрытия экземпляра фильтра.
    • Статические структуры шаблонов, которые поставщик сети может использовать для управления фильтром BDA.
  • Зарегистрируйте статические структуры шаблонов, заданные BDA_FILTER_TEMPLATE, в библиотеке поддержки BDA, чтобы библиотека параметров и методов мини-накопителя BDA обеспечивала обработку по умолчанию.

В следующем фрагменте кода показан пример начального дескриптора фильтра для устройства, которое BdaCreateFilterFactory задает в качестве фабрики фильтров:

const KSFILTER_DESCRIPTOR    InitialTunerFilterDescriptor;
//
//  Filter Factory Descriptor for the tuner filter
//
//  This structure brings together all of the structures that define
//  the tuner filter instance as it appears when it is first created.
//  Note that not all template pin and node types are exposed as
//  pin and node factories when the filter instance is created.
//
DEFINE_KSFILTER_DESCRIPTOR(InitialTunerFilterDescriptor)
{
    &FilterDispatch,             // Table of dispatch routines
    &FilterAutomation,           // Table of properties and methods
    KSFILTER_DESCRIPTOR_VERSION, // Version
    0,                           // Flags
    &KSNAME_Filter,              // Reference Guid
    DEFINE_KSFILTER_PIN_DESCRIPTORS(InitialPinDescriptors),
                                   // PinDescriptorsCount
                                   // PinDescriptorSize
                                   // PinDescriptors
    DEFINE_KSFILTER_CATEGORY(KSCATEGORY_BDA_RECEIVER_COMPONENT),
                            // CategoriesCount
                            // Categories
    DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL(NodeDescriptors),
                                    // NodeDescriptorsCount
                                    // NodeDescriptorSize
                                    // NodeDescriptors
    DEFINE_KSFILTER_DEFAULT_CONNECTIONS, // ConnectionsCount
                                         // Connections
    NULL                // ComponentId
};

В следующем фрагменте кода показан пример массива дескрипторов начального закрепления, предоставляемых инициализированным фильтром. Поставщик сети инициализирует фильтр с помощью такого массива, прежде чем поставщик сети настроит этот фильтр. Однако при настройке инициализированного фильтра поставщик сети выбирает контакты, на которые ссылается указатель на элемент дескриптора фильтра структуры BDA_FILTER_TEMPLATE. Дополнительные сведения см. в статье Настройка фильтра BDA .

//
//  Initial Pin Descriptors
//
//  This data structure defines the pins that will appear on the 
//  filter when it is first created.
//
const
KSPIN_DESCRIPTOR_EX
InitialPinDescriptors[] =
{
    //  Antenna Pin
    //
    {
        &AntennaPinDispatch,
        &AntennaAutomation,   // AntennaPinAutomation
        {
            0,  // Interfaces
            NULL,
            0,  // Mediums
            NULL,
            SIZEOF_ARRAY(AntennaPinRanges),
            AntennaPinRanges,
            KSPIN_DATAFLOW_IN,
            KSPIN_COMMUNICATION_BOTH,
            NULL,   // Name
            NULL,   // Category
            0
        },
        KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT | 
        KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING | 
        KSPIN_FLAG_FIXED_FORMAT,
        1,      // InstancesPossible
        0,      // InstancesNecessary
        NULL,   // Allocator Framing
        NULL    // PinIntersectHandler
    }
};

Обратите внимание, что инициализированный фильтр должен иметь один или несколько входных контактов, чтобы интерфейс Microsoft DirectShow IFilterMapper2 или IFilterMapper мог найти этот фильтр. Сведения об этих интерфейсах DirectShow см. в документации по Microsoft Windows SDK.

В следующем фрагменте кода показаны примеры структуры BDA_FILTER_TEMPLATE и связанных структур и массивов:

const KSFILTER_DESCRIPTOR  TemplateTunerFilterDescriptor;
const BDA_PIN_PAIRING  *TemplateTunerPinPairings;
//
//  BDA Template Topology Descriptor for the filter factory.
//
//  This structure defines the pin and node types that the network 
//  provider can create on the filter and how they are arranged. 
//
const
BDA_FILTER_TEMPLATE
TunerBdaFilterTemplate =
{
    &TemplateTunerFilterDescriptor,
    SIZEOF_ARRAY(TemplateTunerPinPairings),
    TemplateTunerPinPairings
};
//
//  Filter Factory Descriptor for the tuner filter template topology
//
//  This structure brings together all of the structures that define
//  the topologies that the tuner filter can assume as a result of
//  pin factory and topology creation methods.
//
DEFINE_KSFILTER_DESCRIPTOR(TemplateTunerFilterDescriptor)
{
    &FilterDispatch,             // Table of dispatch routines
    &FilterAutomation,           // Table of properties and methods
    KSFILTER_DESCRIPTOR_VERSION, // Version
    0,                           // Flags
    &KSNAME_Filter,              // Reference Guid
    DEFINE_KSFILTER_PIN_DESCRIPTORS(TemplatePinDescriptors),
                                   // PinDescriptorsCount
                                   // PinDescriptorSize
                                   // PinDescriptors
    DEFINE_KSFILTER_CATEGORY(KSCATEGORY_BDA_RECEIVER_COMPONENT),
                            // CategoriesCount
                            // Categories
    DEFINE_KSFILTER_NODE_DESCRIPTORS(NodeDescriptors),  
                                    // NodeDescriptorsCount
                                    // NodeDescriptorSize
                                    // NodeDescriptors
    DEFINE_KSFILTER_CONNECTIONS(TemplateTunerConnections),
                               // ConnectionsCount
                               // Connections
    NULL                // ComponentId
};
//
//  Lists how pairs of input and output pins are configured. 
//
//  Values given to the BDA_PIN_PAIRING structures in the list inform 
//  the network provider which nodes get duplicated when more than one 
//  output pin type is connected to a single input pin type or when
//  more that one input pin type is connected to a single output pin 
//  type. Also, informs of the joints array.
//
const
BDA_PIN_PAIRING TemplateTunerPinPairings[] =
{
    //  Antenna to Transport Topology Joints
    //
    {
        0,  // ulInputPin
        1,  // ulOutputPin
        1,  // ulcMaxInputsPerOutput
        1,  // ulcMinInputsPerOutput
        1,  // ulcMaxOutputsPerInput
        1,  // ulcMinOutputsPerInput
        SIZEOF_ARRAY(AntennaTransportJoints),   // ulcTopologyJoints
        AntennaTransportJoints                  // pTopologyJoints
    }
};