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)

作成したフィルタの使用

 作成したフィルタを使うために「DShowRec.h」を次のように修正します。

  1. CLSID_WavWriterの定義をコピーする。
  2. WM ASFライタフィルタの代わりにWavWriterフィルタのインスタンスを作成する。
  3. WavWriterフィルタへ接続するフィルタグラフを構築する(図2)
図2.フィルタグラフ
図2.フィルタグラフ
DShowRec.h
#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にも情報が見当たらないので、試行錯誤でどうにか形になりました。

 本稿が開発の参考になれば幸いです。

参考文献

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Advanced/W-ZERO3 [es]で作ろう連載記事一覧

もっと読む

この記事の著者

syu5()

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

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

この記事をシェア

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

イベント

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

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

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

メールバックナンバー