Microsoft DirectX 8.0

フィルタ グラフ内のオブジェクトの列挙

Microsoft® DirectShow® アプリケーションは、フィルタ グラフのメソッドを呼び出すだけでよいので、それぞれのフィルタについて悩む必要はほとんどない。しかし時には、グラフ内の特定のフィルタや、フィルタ上の特定のピンを見つけなければならないこともある。たとえば、アプリケーションがフィルタのプロパティを設定するために、フィルタが公開するカスタム インターフェイスを使用する場合である。あるいは、特殊化したフィルタ グラフを手作業で構築する場合は、フィルタを接続するためにそれぞれのピンのメソッドを呼び出す必要がある。こういうときのために、DirectShow には、フィルタ グラフ内のオブジェクトを列挙するためのメソッドがいくつか用意されている。

ここで議論する列挙子は、COM の列挙インターフェイスで使用される標準形に従う。詳細については、Platform SDK の IEnumXXXX のトピックを参照すること。ユーザーのコンピュータに登録されていながら、まだフィルタ グラフには入っていないフィルタの列挙については、「デバイスとフィルタの列挙」を参照すること。

このトピックは、以下のセクションで構成される。

フィルタの列挙

フィルタ グラフ マネージャがサポートする IFilterGraph::EnumFilters メソッドが、フィルタ グラフ内のすべてのフィルタを列挙する。これは、IEnumFilters インターフェイスへのポインタを返す。IEnumFilters::Next メソッドは、IBaseFilter インターフェイス ポインタを取得する。

以下の例に示す関数は、グラフ内のフィルタを列挙し、各フィルタの名前が付いたメッセージ ボックスを表示する。この関数は、IBaseFilter::QueryFilterInfo メソッドを使ってフィルタの名前を取得する。参照カウントをデクリメントするために、インターフェイスの IUnknown::Release を呼び出す部分に注意すること。

void EnumFilters (IFilterGraph *pGraph) 
{
    IEnumFilters *pEnum = NULL;
    IBaseFilter *pFilter;
    ULONG cFetched;

    pGraph->EnumFilters(&pEnum);
    while(pEnum->Next(1, &pFilter, &cFetched) == S_OK)
    {
        FILTER_INFO FilterInfo;
        char szName[256];
        
        pFilter->QueryFilterInfo(&FilterInfo);
        WideCharToMultiByte(CP_ACP, 0, FilterInfo.achName, -1, szName, 256, 0, 0);
        MessageBox(NULL, szName, "Filter name", MB_OK);

        FilterInfo.pGraph->Release();
        pFilter->Release();
    }
    pEnum->Release();
}

ピンの列挙

フィルタがサポートする IBaseFilter::EnumPins メソッドが、フィルタで使用できるピンを列挙する。これは、IEnumPins インターフェイスへのポインタを返す。IEnumPins::Next メソッドは、IPin インターフェイス ポインタを取得する。

以下の例に示す関数は、与えられたフィルタ上で与えられた方向 (入力または出力) のピンを見つける。この関数は、PIN_DIRECTION の列挙を使ってピンの方向を指定し、IPin::QueryDirection メソッドを使って列挙された各ピンの方向を見つける。この関数は、一致するピンを見つけると、未処理の参照カウントを持つ IPin インターフェイス ポインタを返す。インターフェイスの解放は、呼び出し元が行わなければならない。

IPin *GetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir)
{
    BOOL       bFound = FALSE;
    IEnumPins  *pEnum;
    IPin       *pPin;

    pFilter->EnumPins(&pEnum);
    while(pEnum->Next(1, &pPin, 0) == S_OK)
    {
        PIN_DIRECTION PinDirThis;
        pPin->QueryDirection(&PinDirThis);
        if (bFound = (PinDir == PinDirThis))
            break;
        pPin->Release();
    }
    pEnum->Release();
    return (bFound ? pPin : 0);  
}

メディア タイプの列挙

ピンがサポートする IPin::EnumMediaTypes メソッドが、ピンの優先されるメディア タイプを列挙する。これは、IEnumMediaTypes インターフェイスへのポインタを返す。IEnumMediaTypes::Next メソッドは、メディア タイプを記述する AM_MEDIA_TYPE 構造体へのポインタを取得する。

メディア タイプ列挙子があるのは、主にフィルタ グラフがインテリジェント接続を行いやすくするためであり、アプリケーションでこれを使用することはまずない。ピンは、優先されるメディア タイプを返すとは限らず、返されるメディア タイプはフィルタの接続状態によって異なる。たとえば、フィルタの出力ピンは、フィルタの入力ピンにどのメディア タイプが設定されているかによって異なるメディア タイプ セットを返す。