SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Advanced/W-ZERO3 [es]で作ろう

Advanced/W-ZERO3 [es]で簡易音声レコーダを作ろう Part 2

Windows MobileにおけるDirectShowフィルタの実装例

ダウンロード サンプルソース (36.6 KB)

WAV出力DirectShowフィルタの作成 1

フィルタの仕様

 今回実装するフィルタの仕様を表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」を開き、リンクするライブラリを指定します。

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を生成しておき、ソースコードに貼り付けます。

WavWriter.h
#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つの構造体を使います。

表2. AMOVIESETUP_MEDIATYPE構造体
AMOVIESETUP_MEDIATYPE ピンが受け入れるメディアタイプ
AMOVIESETUP_PIN フィルタが持つピン情報
表3. AMOVIESETUP_PIN構造体
strName ピンの名前(廃止)
bRendered このピンからの入力をレンダリングする場合はTRUE
bOutput 出力ピンであればTRUE
bZero ピンを1つも持たないことがある場合はTRUE
bManu ピンを複数作成できる場合はTRUE
clsConnectsToFilter このピンが接続するフィルタのクラスID(廃止)
strConnectsToPin このピンが接続するピンの名前
nMediaTypes サポートするメディアタイプの数
lpMediaType AMOVIESETUP_MEDIATYPE構造体の配列へのポインタ
WavWriter.h
// ピンタイプの定義
const AMOVIESETUP_MEDIATYPE sudPinTypes={
    &MEDIATYPE_Audio,
    &MEDIASUBTYPE_None
};

// 入力ピンの情報
const AMOVIESETUP_PIN sudPins =
{
    L"",
    TRUE,
    FALSE,
    FALSE,
    FALSE,
    &CLSID_NULL,
    0,
    1,
    &sudPinTypes
};

 最後にAMOVIESETUP_FILTER構造体を使ってフィルタ情報を定義します。

WavWriter.h
// フィルタ情報
const AMOVIESETUP_FILTER afFilterInfo=
{
    &CLSID_WavWriter,// フィルタのCLSIDへのポインタ
    FILTER_NAME,     // フィルタ名
    MERIT_DO_NOT_USE,// メリット値
    1,               // ピン数
    &sudPins         // ピン情報へのポインタ
};
メリット値
 本稿の範囲では直接関係ありませんが、メリット値について補足しておきます。メリット値とはフィルタグラフを構築するときに、フィルタグラフマネージャが不足しているフィルタを補うときに使われます。あるフィルタの出力形式をA、別のフィルタの入力形式をBとしたとき、フィルタ同士を接続しようとする際、AからBに変換するフィルタを自動的に検索し接続を試行することができます。この試行される順序がメリット値となります。このような仕組みのことを「インテリジェント接続」と呼びます。
 これはWindows SDKに付属する「GraphEdit」というツールで試してみることができます。
 なおMERIT_DO_NOT_USEを指定した場合、この検索対象から外れます。
 

次のページ
WAV出力DirectShowフィルタの作成 2

この記事は参考になりましたか?

Advanced/W-ZERO3 [es]で作ろう連載記事一覧

もっと読む

この記事の著者

syu5()

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2055 2008/09/17 01:53

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー