WAV出力DirectShowフィルタの作成 1
フィルタの仕様
今回実装するフィルタの仕様を表1に示します。
| フィルタの種類 | レンダラフィルタ |
| フィルタの名前 | WavWriter |
| 入力ピンの数 | 1 |
| 出力ピンの数 | 0 |
| 入力ピンのメディアタイプ | MEDIATYPE_Audio |
| 入力ピンのサブメディアタイプ | MEDIASUBTYPE_None |
| 入力ピンのフォーマットタイプ | FORMAT_WaveFormatEx |
入力ピンのサブメディアタイプはMEDIASUBTYPE_Noneとしています。これは他のオーディオレンダラフィルタに合わせていて、どのようなタイプでも良いという意味になります。実際にはMEDIASUBTYPE_PCMのタイプを必要とするのですが、これはピンが接続される時にチェックすることにします。
プロジェクトの作成
DirectShowフィルタは多くの場合DLL形式です。これによりさまざまなアプリケーションからフィルタを使うことができます。今回は「WavWriter」というDLLを出力するプロジェクトを作成します。
Visual Studioで「VRecorder」のソリューションを読み込み、新規プロジェクトを追加します。
プロジェクトの種類を「Win32スマートデバイスプロジェクト」とし、名前を「WavWriter」とします。プロジェクトウィザードが表示されたら、アプリケーションの種類を「DLL」とします。
プロジェクトのプロパティを開き、「コマンドライン」を選択し、追加のオプションに/Zc:wchar_t-を追加します。このオプションがないと後述するDirectShowのクラスライブラリをリンクしたときにエラーが発生します。
Platform Builderにある「strmbase.lib」をリンクできるように追加のディレクトリを指定します。これを忘れるとWindows Mobile 6 SDKにあるライブラリがリンクされますが、正しく動作しません。
「stdafx.h」を開き、リンクするライブラリを指定します。
// 以下を末尾に加える #pragma comment(lib, "Strmiids.lib") #pragma comment(lib, "strmbase.lib") // Directshow フィルタ作成に必要 #pragma comment(lib, "mmtimer.lib") #include <streams.h> // Directshow クラスライブラリ #include <mmsystem.h>
フィルタ情報を定義する
作成するフィルタ情報を「WavWriter.h」に定義していきます。
まずフィルタ名とフィルタクラスのクラスIDを定義します。フィルタ名は任意の名前が付けられます。クラスIDは「guidgen.exe」を使ってユニークなIDを生成しておき、ソースコードに貼り付けます。
#pragma once #define FILTER_NAME _T("WavWriter") // フィルタ名 // {7EF62319-A94C-4c11-8F51-B62280E59D7A} static const GUID CLSID_WavWriter = { 0x7ef62319, 0xa94c, 0x4c11, { 0x8f, 0x51, 0xb6, 0x22, 0x80, 0xe5, 0x9d, 0x7a } };
次にフィルタの持つピン情報を定義します。ピン情報の定義には表2、表3のような2つの構造体を使います。
| AMOVIESETUP_MEDIATYPE | ピンが受け入れるメディアタイプ |
| AMOVIESETUP_PIN | フィルタが持つピン情報 |
| strName | ピンの名前(廃止) |
| bRendered | このピンからの入力をレンダリングする場合はTRUE |
| bOutput | 出力ピンであればTRUE |
| bZero | ピンを1つも持たないことがある場合はTRUE |
| bManu | ピンを複数作成できる場合はTRUE |
| clsConnectsToFilter | このピンが接続するフィルタのクラスID(廃止) |
| strConnectsToPin | このピンが接続するピンの名前 |
| nMediaTypes | サポートするメディアタイプの数 |
| lpMediaType | AMOVIESETUP_MEDIATYPE構造体の配列へのポインタ |
// ピンタイプの定義 const AMOVIESETUP_MEDIATYPE sudPinTypes={ &MEDIATYPE_Audio, &MEDIASUBTYPE_None }; // 入力ピンの情報 const AMOVIESETUP_PIN sudPins = { L"", TRUE, FALSE, FALSE, FALSE, &CLSID_NULL, 0, 1, &sudPinTypes };
最後にAMOVIESETUP_FILTER構造体を使ってフィルタ情報を定義します。
// フィルタ情報 const AMOVIESETUP_FILTER afFilterInfo= { &CLSID_WavWriter,// フィルタのCLSIDへのポインタ FILTER_NAME, // フィルタ名 MERIT_DO_NOT_USE,// メリット値 1, // ピン数 &sudPins // ピン情報へのポインタ };
これはWindows SDKに付属する「GraphEdit」というツールで試してみることができます。
なおMERIT_DO_NOT_USEを指定した場合、この検索対象から外れます。
