フィルタ マッパーの使い方
フィルタ マッパーは、さまざまな検索条件に基づいてフィルタを列挙する COM オブジェクトである。フィルタ マッパーは System Device Enumerator ほど効率的ではないので、特定のカテゴリのフィルタが必要な場合は、System Device Enumerator を使う方がよい。しかし、特定のメディア タイプの組み合わせをサポートするが、はっきりしたカテゴリには入らないフィルタを見つける場合は、フィルタ マッパーを使う必要がある。(その例が、レンダリング フィルタやデコーダ フィルタである。)
フィルタ マッパーは IFilterMapper2 インターフェイスを公開する。フィルタを検索するには、IFilterMapper2::EnumMatchingFilters メソッドを呼び出す。このメソッドは、検索条件を定義するパラメータをいくつか受け取り、条件に一致するフィルタの列挙子を返す。この列挙子は IEnumMoniker インターフェイスをサポートし、一致するそれぞれのフィルタに一意のモニカを与える。
次の例は、デジタル ビデオ (DV) 入力を受け取り、1 つ以上の出力ピンを持つ任意のメディア タイプのフィルタを列挙している。(DV ビデオ デコーダ フィルタがこの条件に合致する。)
IFilterMapper2 *pMapper = NULL;
IEnumMoniker *pEnum = NULL;
hr = CoCreateInstance(CLSID_FilterMapper2,
NULL, CLSCTX_INPROC, IID_IFilterMapper2,
(void **) &pMapper);
if (FAILED(hr))
{
// 簡潔にするため、エラー処理は省略した。
}
GUID arrayInTypes[2];
arrayInTypes[0] = MEDIATYPE_Video;
arrayInTypes[1] = MEDIASUBTYPE_dvsd;
hr = pMapper->EnumMatchingFilters(
&pEnum,
0, // 予約済み。
TRUE, // 完全一致を使う?
MERIT_DO_NOT_USE+1, // 最小メリット。
TRUE, // 最低 1 つの入力ピン?
1, // 入力用メジャー タイプ/サブタイプの対の数。
arrayInTypes, // 入力用メジャー タイプ/サブタイプの対の配列。
NULL, // 入力メディア。
NULL, // 入力ピン カテゴリ。
FALSE, // レンダラでなければならない?
TRUE, // 最低 1 つの出力ピン?
0, // 出力用メジャー タイプ/サブタイプの対の数。
NULL, // 出力用メジャー タイプ/サブタイプの対の配列。
NULL, // 出力メディア。
NULL); // 出力ピン カテゴリ。
// モニカを列挙する。
IMoniker *pMoniker;
ULONG cFetched;
while (pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
{
IPropertyBag *pPropBag = NULL;
hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
(void **)&pPropBag);
if (SUCCEEDED(hr))
{
// フィルタのフレンドリ名を取得するには、次の処理を行う。
VARIANT varName;
VariantInit(&varName);
hr = pPropBag->Read(L"FriendlyName", &varName, 0);
if (SUCCEEDED(hr))
{
// なんらかの方法で UI に名前を表示する。
}
VariantClear(&varName);
// フィルタのインスタンスを作成するには、次の処理を行う。
IBaseFilter *pFilter;
hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter);
// ここでグラフにフィルタを追加する。後で忘れずに pFilter を解放すること。
// クリーン アップ。
pPropBag->Release();
}
pMoniker->Release();
}
// クリーン アップ。
pMapper->Release();
pEnum->Release();
EnumMatchingFilters メソッドには、上の例にコメントを付けたようにかなりの数のパラメータがある。この例で重要なのは次のパラメータである。
- 最小のメリット値 : フィルタは、MERIT_DO_NOT_USE より大きいメリット値を持っていなければならない。
- 入力タイプ : 呼び出し元は、メジャー タイプとサブタイプの対を含む配列を渡す。これらの対のうち 1 つ以上をサポートするフィルタだけが合致する。
- 完全一致 : フィルタは、メジャー タイプ、サブタイプ、ピン カテゴリ、またはメディアに NULL 値を登録できる。完全一致を指定しなければ、NULL 値はワイルドカードとして機能し、任意の指定値と一致する。完全一致の場合、フィルタは条件と完全に一致しなければならない。しかし、検索条件に NULL パラメータを与えると、それは常にワイルドカード、すなわち "考慮されない" 値として機能し、任意のフィルタと一致する。