次の方法で共有


フィルタ マッパーの使い方

フィルタ マッパーは、さまざまな検索条件に基づいてフィルタを列挙する 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 パラメータを与えると、それは常にワイルドカード、すなわち "考慮されない" 値として機能し、任意のフィルタと一致する。