作成したフィルタの使用
作成したフィルタを使うために「DShowRec.h」を次のように修正します。
CLSID_WavWriterの定義をコピーする。- WM ASFライタフィルタの代わりにWavWriterフィルタのインスタンスを作成する。
- WavWriterフィルタへ接続するフィルタグラフを構築する(図2)

#pragma once #define SAFE_RELEASE(p) { if((p)!=NULL) { (p)->Release(); (p)=NULL; }} // {7EF62319-A94C-4c11-8F51-B62280E59D7A} static const GUID CLSID_WavWriter = { 0x7ef62319, 0xa94c, 0x4c11, { 0x8f, 0x51, 0xb6, 0x22, 0x80, 0xe5, 0x9d, 0x7a } }; // DirectShow による WMA の音声レコーダクラス class CDshowRec { ICaptureGraphBuilder2 *m_pGB; IGraphBuilder *m_pFG; IMediaControl *m_pMC; IBaseFilter *m_pAudioCap; IBaseFilter *m_pWavWriter; public: CDshowRec() : m_pGB(NULL), m_pFG(NULL), m_pMC(NULL), m_pAudioCap(NULL), m_pWavWriter(NULL) { } void Init() { OUT_MSG(_T("Init")); OUT_HR(CoCreateInstance(CLSID_CaptureGraphBuilder , NULL, CLSCTX_INPROC , IID_ICaptureGraphBuilder2, (void **)&m_pGB)); OUT_HR(CoCreateInstance(CLSID_FilterGraph, NULL , CLSCTX_INPROC, IID_IGraphBuilder, (void **)&m_pFG)); OUT_HR(m_pGB->SetFiltergraph(m_pFG)); OUT_HR(m_pFG->QueryInterface(IID_IMediaControl , (void**)&m_pMC)); // AudioCapture フィルタの初期化 OUT_HR(CoCreateInstance(CLSID_AudioCapture, NULL , CLSCTX_INPROC, IID_IBaseFilter, (void**)&m_pAudioCap)); IPersistPropertyBag *pPSBag=NULL; OUT_HR(m_pAudioCap->QueryInterface(IID_IPersistPropertyBag , (void**)&pPSBag)); OUT_HR(pPSBag->Load(NULL, NULL)); SAFE_RELEASE(pPSBag); // WavWriter フィルタの作成 OUT_HR(CoCreateInstance(CLSID_WavWriter, NULL, CLSCTX_INPROC , IID_IBaseFilter, (void **)&m_pWavWriter)); // フィルタをフィルタグラフへ追加し、接続する OUT_HR(m_pFG->AddFilter(m_pAudioCap,_T(""))); OUT_HR(m_pFG->AddFilter(m_pWavWriter,_T(""))); SetAudioOutProp(); OUT_HR(m_pGB->RenderStream(&PIN_CATEGORY_CAPTURE , &MEDIATYPE_Audio, m_pAudioCap, NULL, m_pWavWriter)); } void Release() { OUT_MSG(_T("Release")); this->Stop(); SAFE_RELEASE(m_pMC); SAFE_RELEASE(m_pFG); SAFE_RELEASE(m_pGB); SAFE_RELEASE(m_pWavWriter); SAFE_RELEASE(m_pAudioCap); } // 以下省略...
実行方法と結果
作成したフィルタ「WavWriter.DLL」を「regsvrce.exe」を使ってレジストリへ登録します。次のようなコマンドを実行します。ただし Windows Mobile ではコマンドプロンプトがないので、GSFinder+などのファイラーを使うと良いでしょう。
regsvrce.exe WavWriter.DLL
解除するときは /u オプションを付けます。
regsvrce.exe /u WavWriter.DLL
次に「VRecorder.exe」を実行してください。
操作方法は前回と同様です。「REC」ボタンをタップすると録音を開始、停止できます。
ファイラーで出力したファイルを確認できます。タップして再生できます。

LoadLibraryでDLLを動的リンクし、DllRegisterServerおよびDllUnregisterServerを呼ぶことで、regsvrce.exeと同じことが実現できます。おわりに
本稿では、WAV形式で出力するDirectShowフィルタを作成しました。これにより編集ソフトに取り込むことが容易になったかと思います。フィルタはDLL形式になっているので、他にDirectShowアプリケーションを作ったときにも使えます。
実は、Windows MobileのDirectShowについては情報が少なく、開発途中で何度かハマりました。特にコンパイルオプションを付けることや、NonDelegatingReleaseのあたりはWindows SDKとは異なる実装になっている上にMSDNにも情報が見当たらないので、試行錯誤でどうにか形になりました。
本稿が開発の参考になれば幸いです。
参考文献
- MSDN:Encoded Media (英語)
