BDA ミニドライバーの起動
BDA デバイスが動作を開始すると、プラグ アンド プレイ (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 インターフェイスがそのフィルターを見つけられるように、1 つ以上の入力ピンが公開されている必要があることに注意してください。 これらの 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
}
};