カクタスソフトウェア
カクタスソフトウェア
サウンド MIDI マルチメディア アプリケーション

ファクトリーテンプレート

このセクションでは新しいフィルータのインスタンスが作成されるまでの手順について解説します。

  1. メディアタイプを定義する。
  2. メディアタイプを用いてピンに関する構造体を定義する。
  3. ピンの情報を用いてフィルターに関する構造体を定義する。
  4. フィルターの情報を用いてファクトリーテンプレートを定義する。

AMOVIESETUP_MEDIATYPE構造体

AMOVIESETUP_MEDIATYPE構造体は、メディアタイプを指定するためのもので、メジャータイプとマイナータイプの組から成っています。

以下の例は一般的なオーディオを示します。オーディオの場合マイナータイプは指定しません。

const AMOVIESETUP_MEDIATYPE sudPinTypes =
{
    &MEDIATYPE_Audio,       // clsMajorType
    &MEDIASUBTYPE_NULL      // clsMinorType
};

主なメディアタイプを以下に示します。

項目 MEDIATYPE コメント
未指定 MEDIATYPE_NULL どんな入力も受け付ける
ビデオ MEDIATYPE_Video  
オーディオ MEDIATYPE_Audio  
MIDI MEDIATYPE_Midi  

AMOVIESETUP_PIN構造体

AMOVIESETUP_PIN構造体は、1つのピンが持つ情報を定義するもので、フィルターが持つピンの数だけ配列として定義します。

以下は、入力ピン、出力ピン各1つを持つフィルターの例です。

const AMOVIESETUP_PIN psudPins[] =
{
  {
    L"Input",               // strName
    FALSE,                  // bRendered
    FALSE,                  // bOutput
    FALSE,                  // bZero
    FALSE,                  // bMany
    &CLSID_NULL,            // clsConnectsToFilter
    L"Output",              // strConnectsToPin
    1,                      // nTypes
    &sudPinTypes            // lpTypes
  },
  {
    L"Output",              // strName
    FALSE,                  // bRendered
    TRUE,                   // bOutput
    FALSE,                  // bZero
    FALSE,                  // bMany
    &CLSID_NULL,            // clsConnectsToFilter
    L"Input",               // strConnectsToPin
    1,                      // nTypes
    &sudPinTypes            // lpTypes
  }
};

strName

ピンの名前。現在のバージョンでは廃止されました。

bRendered

TRUEの場合、このピンから入力をレンダリングします。出力ピンでは常にFALSE。

bOutput

TRUE:このピンは出力ピン。FALSE:このピンは入力ピン。

bZero

TRUEの場合、ピンのインスタンスが作成されない場合がある。

bMany

TRUEの場合、ピンのインスタンスが複数作成される場合がある。

clsConnectsToFilter

ピンが接続するフィルターのクラス識別子。現在のバージョンでは廃止されました。

strConnectsToPin

接続先のピンの名前。現在のバージョンでは廃止されました。

nTypes

ピンがサポートするメディアタイプの数。

lpTypes

AMOVIESETUP_MEDIATYPE構造体へのポインター。

AMOVIESETUP_FILTER構造体

フィルターの情報を定義する構造体です。

const AMOVIESETUP_FILTER sudMyFilter =
{
    &CLSID_MY_FILTER,       // clsID
    MY_FILTER_NAME,         // strName
    MERIT_DO_NOT_USE,       // dwMerit
    2,                      // nPins
    psudPins                // lpPin
};

clsID

フィルターのクラス識別子。

新しいCLSIDを作成し、指定してください。

static const GUID CLSID_MY_FILTER =
{ 0x????????, 0x????, 0x????, { 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x?? } };

strName

フィルターの名前。

フィルターの名前を定義してください。

#define MY_FILTER_NAME L"????????"

dwMerit

フィルターのメリット。

プライベートなフィルターの場合、通常「MERIT_DO_NOT_USE」を指定します。

nPins

フィルターが持つピンの数。

lpPin

AMOVIESETUP_PIN構造体へのポインター。nPinsが2以上の場合、構造体の配列へのポインターとなる。

CFactoryTemplateクラス

クラスファクトリーへ提供する情報を作成します。”g_Templates”と”g_cTemplates”の2つの変数を定義します。

以下の例では、フィルターとプロパティー2種類のインスタンスを作成できるようになっています。

CFactoryTemplate g_Templates[2] =
{
  {
    MY_FILTER_NAME,             // m_Name
    &CLSID_MY_FILTER,           // m_ClsID
    CMyFilter::CreateInstance,  // m_lpfnNew
    NULL,                       // m_lpfnInit
    &sudMyFilter                // m_pAMovieSetup_Filter
  },
  {
    MY_FILTER_NAME L" Properties",
    &CLSID_MY_FILTER_PROP,
    CMyFilterProp::CreateInstance,
  }
};

int g_cTemplates = sizeof(g_Templates)/sizeof(g_Templates[0]);

m_Name

フィルターの名前。

m_ClsID

フィルターのクラス識別子。

m_lpfnNew

フィルターのインスタンスを作成する関数へのポインター。

m_lpfnInit

DLLのエントリーポイントから呼び出される関数へのポインター。必要ない場合はNULLを指定する。

m_pAMovieSetup_Filter

AMOVIESETUP_FILTER構造体へのポインター。フィルターの場合のみ必要。

”g_Templates”と”g_cTemplates”はグローバル変数です。クラスファクトリーはこの名前で参照するので、変数名は変更できません。

DllGetClassObject()関数は定義されたファクトリーテンプレートから目的のCLSIDを探し、テンプレートに定義された情報を元にインスタンスを作成します。

ドキュメントの先頭へ

カクタスソフトウェア 技術協力 資料室 資料室の広場 SourceForge.jp お問い合わせ